我正在尝试在内容表中插入值。如果我在VALUES内没有PHP变量,则效果很好。当我将变量$type
放在里面时,VALUES
这是行不通的。我究竟做错了什么?
$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description)
VALUES($type, 'john', 'whatever')");
在任何MySQL语句中添加PHP变量的规则很简单:
因此,由于你的示例仅涉及数据文字,因此必须通过占位符(也称为参数)添加所有变量。为此:
以下是使用所有流行的PHP数据库驱动程序的方法:
这样的驱动程序不存在。
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();
代码有点复杂,但是所有这些运算符的详细说明都可以在我的文章“如何使用Mysqli运行INSERT查询”中找到,以及一种可以大大简化此过程的解决方案。
对于SELECT查询,你只需添加对get_result()
方法的调用即可熟悉mysqli_result
,你可以通过通常的方式从中获取数据:
$reporter = "John O'Hara";
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
$stmt->bind_param("s", $reporter);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc(); // or while (...)
$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";
$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";