如何在MySQL语句中包含PHP变量

问题描述 投票:0回答:1

我正在尝试在内容表中插入值。如果我在VALUES内没有PHP变量,则效果很好。当我将变量$type放在VALUES内时,此操作将无效。我在做什么错?

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");
php sql database mysqli
1个回答
92
投票

在任何MySQL语句中添加PHP变量的规则很简单:

  1. 表示SQL数据文字]的任何变量,(或者简单地说-SQL字符串或数字)必须通过准备好的语句添加。没有例外。
  2. [任何其他查询部分,例如SQL关键字,表或字段名或运算符-必须通过白名单
  3. 进行过滤。

    因此,由于您的示例仅涉及数据文字,因此必须通过占位符(也称为参数)添加所有变量。为此:

  • 在您的SQL语句中,将所有变量替换为占位符
  • 准备
  • 结果查询
  • bind
  • 到占位符的变量
  • 执行
  • 查询

    这是所有流行的PHP数据库驱动程序的使用方法:

使用mysql_query添加数据文字

这样的驱动程序不存在。

使用mysqli添加数据文字
$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $type, $reporter);
$stmt->execute();

代码有点复杂,但是所有这些运算符的详细说明都可以在我的文章How to run an INSERT query using Mysqli中找到,并且可以大大简化此过程。

使用PDO添加数据文字
$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $pdo->prepare($query);
$stmt->execute([$type, $reporter]);

在PDO中,我们可以将绑定部分和执行部分组合在一起,这非常方便。 PDO还支持命名占位符,有些占位符非常方便。

添加关键字或标识符

但是,有时我们添加了一个表示查询的另一部分的变量,例如关键字或标识符(数据库,表或字段名)。在这种情况下,必须对照脚本中写入的值列表[[explicitly来检查变量。这在我的另一篇文章Adding a field name in the ORDER BY clause based on the user's choice中进行了解释:

[不幸的是,PDO没有标识符(表和字段名)的占位符,因此开发人员必须手动过滤掉它们。此类过滤器通常称为“白名单”(仅列出允许的值),而不是“黑名单”,其中列出不允许的值。

因此,我们必须在PHP代码中显式列出所有可能的变体,然后从中进行选择。

这里是一个例子:

$orderby = $_GET['orderby'] ?: "name"; // set the default value $allowed = ["name","price","qty"]; // the white list of allowed field names $key = array_search($orderby, $allowed, true); // see if we have such a name if ($key === false) { throw new InvalidArgumentException("Invalid field name"); }

方向应该使用完全相同的方法,

$direction = $_GET['direction'] ?: "ASC"; $allowed = ["ASC","DESC"]; $key = array_search($direction, $allowed, true); if ($key === false) { throw new InvalidArgumentException("Invalid ORDER BY direction"); }

经过这样的代码后,$direction$orderby变量都可以安全地放入SQL查询中,因为它们等于允许的变体之一,否则将引发错误。

关于标识符的最后一件事,还必须根据特定的数据库语法设置它们的格式。对于MySQL,标识符周围应为backtick个字符。因此,我们的订单示例的最终查询字符串将是

$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";


-1
投票
我知道这个问题有一些答案,但是我想我要补充一点,如果您遵循以下语法,那么我再也不会遇到该错误的问题了。毫无疑问,您正在使用哪个表以及要追加的列。

-2
投票
您必须将变量用单引号或双引号引起来,然后用大括号括起来,然后在其中使用变量名称(例如:$ abc)。

7
投票
只要是字符串-您必须将其放在引号中

3
投票
$ type中的文本被直接替换为插入字符串,因此MySQL得到此信息:

3
投票
为了避免SQL插入ins语句,请使用be

2
投票
这是简单的答案:

2
投票

最好的选择是准备好的语句。


1
投票
尝试一下:

0
投票
如果变量包含用户输入或您不信任的其他数据,请确保对数据进行转义。像这样:

-1
投票
这里
© www.soinside.com 2019 - 2024. All rights reserved.