在 MySQL 语句中包含 PHP 变量
在这种情况下,您在将值插入“内容”表时遇到问题,特别是在 MySQL 语句的“VALUES”部分使用 PHP 变量“$type”时。让我们深入研究适当的方法。
1.使用准备好的语句(推荐)
此方法可以解决 99% 的查询,包括您的查询。表示 SQL 数据文字(字符串或数字)的任何变量都必须通过准备好的语句合并,无一例外。然而,静态值可以按原样插入。
准备过程需要四个阶段:
以下是它在不同数据库驱动程序中的工作方式:
mysqli 与 PHP 8.2 :
$sql = "INSERT INTO contents (type, reporter, description) VALUES ('whatever', ?, ?)"; $mysqli->execute_query($sql, [$reporter, $description]);
mysqli与早期的 PHP版本:
$stmt = $mysqli->prepare("INSERT INTO contents (type, reporter, description) VALUES ('whatever', ?, ?)"); $stmt->bind_param("ss", $reporter, $description); $stmt->execute();
PDO:
$sql = "INSERT INTO contents (type, reporter, description) VALUES ('whatever', ?, ?)"; $stmt = $pdo->prepare($sql); $stmt->execute([$reporter, $description]);
2。对查询部分实施白名单过滤
如果您需要包含代表 SQL 查询特定部分的变量,例如关键字、表或字段名称或运算符,请使用“白名单”来确保其有效性。
例如,如果变量表示按字段排序:
$allowed = ["name", "price", "qty"]; $key = array_search($orderby, $allowed, true); if ($key === false) { throw new InvalidArgumentException("Invalid field name"); }
同样,检查有效排序方向:
$allowed = ["ASC", "DESC"]; $key = array_search($direction, $allowed, true); if ($key === false) { throw new InvalidArgumentException("Invalid ORDER BY direction"); }
验证后,准备查询字符串,并记住根据 MySQL 语法正确转义标识符:
$query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";
以上是如何在 MySQL INSERT 语句中安全地包含 PHP 变量?的详细内容。更多信息请关注PHP中文网其他相关文章!