mysql语句中添加php变量_如何在MySQL语句中包含PHP变量匿名⽤户
在任何MySQL语句中添加PHP变量的规则⾮常简单明了:任何表⽰SQL数据⽂本(或者,简单地说,SQL字符串或数字)的变量都必须通过准备好的语句添加。 没有例外。
任何其他查询部分(如SQL关键字,表或字段名或运算符)都必须通过⽩名单筛选。
所以,由于您的⽰例只涉及数据⽂本,那么所有变量都必须通过占位符(也称为参数)添加。 要执⾏此操作:在SQL语句中,⽤占位符替换所有变量
准备结果查询
将变量绑定到占位符
执⾏查询
下⾯是如何使⽤所有流⾏的PHP数据库驱动程序来实现此操作:
这样的驱动程序不存在。$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();
代码有点复杂,但是所有这些操作符的详细解释可以在我的⽂章中到,如何使⽤Mysqli运⾏插⼊查询,以及⼀个⼤⼤简化该过程的解决⽅案。$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还⽀持命名占位符,有些⼈觉得这⾮常⽅便。
但有时我们添加了⼀个变量,它表⽰查询的另⼀部分,如关键字或标识符(数据库,表或字段名)。 在这种情况下,必须对照脚本中显式写⼊的值列表检查变量。 在我的另⼀篇⽂章中解释了这⼀点,根据⽤户的选择在ORDER BY⼦句中添加⼀个字段名:
不幸的是,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";
php如何运行代码$allowed = ["ASC","DESC"];
$key = array_search($direction, $allowed, true);
if ($key === false) {
throw new InvalidArgumentException("Invalid ORDER BY direction");
}
在这样的代码之后,可以安全地将$direction和$orderby变量放⼊SQL查询中,因为它们要么等于允许的变量之⼀,要么会引发错误。
关于标识符,最后要提到的是,它们还必须根据特定的数据库语法进⾏格式化。 对于MySQL,标识符周围应该是backtick字符。 因此,我们的order by⽰例的最终查询字符串将是$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论