我正在尝试在目录表中插入值。如果我在 VALUES 中没有 PHP 变量,它工作正常。当我将变量 $type
放入 VALUES
,这不起作用。我究竟做错了什么?
$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description)
VALUES($type, 'john', 'whatever')");
原文由 Pinkie 发布,翻译遵循 CC BY-SA 4.0 许可协议
在任何 MySQL 语句中添加 PHP 变量的规则很简单:
1. 使用准备好的语句
此规则涵盖 99% 的查询,尤其是您的查询。任何表示 SQL 数据文字 的变量,(或者,简单地说 - SQL 字符串或数字)都必须通过准备好的语句添加。 _没有例外_。
这种方法包括四个基本步骤
以下是如何使用所有流行的 PHP 数据库驱动程序:
使用
mysqli
添加数据文字代码有点复杂,但所有这些运算符的详细解释可以在我的文章 How to run an INSERT query using Mysqli 中找到,以及显着简化该过程的解决方案。
对于 SELECT 查询,您只需添加对
get_result()
方法的调用即可获得熟悉的mysqli_result
,您可以通过通常的方式从中获取数据:使用 PDO 添加数据文字
在 PDO 中,我们可以将 bind 和 execute 部分结合起来,非常方便。 PDO 还支持命名占位符,有些人觉得这非常方便。
2.使用白名单过滤
任何其他查询部分,例如 SQL 关键字、表或字段名称或运算符 - 都必须通过 白名单 进行过滤。
有时我们必须添加一个表示查询的另一部分的变量,例如关键字或标识符(数据库、表或字段名称)。这是一种罕见的情况,但最好做好准备。
在这种情况下,必须根据脚本中 明确 写入的值列表检查您的变量。这在我的另一篇文章中进行了解释, 根据用户的选择在 ORDER BY 子句中添加字段名称:
这是一个例子:
在这样的代码之后,
$direction
和$orderby
变量可以安全地放入 SQL 查询中,因为它们要么等于允许的变体之一,要么会引发错误。关于标识符的最后一件事是,它们还必须根据特定的数据库语法进行格式化。对于 MySQL,它应该是
backtick
标识符周围的字符。因此,我们的示例订单的最终查询字符串将是