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

小编典典

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

任何表示 SQL数据文字的 变量(或简单地说-SQL字符串或数字)都 必须通过准备好的语句添加 。没有例外。

任何其他查询部分(例如SQL关键字,表或字段名或运算符)都必须通过 白名单 进行过滤。

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

在您的SQL语句中,将所有变量替换为 占位符

准备 结果查询

将 变量 绑定 到占位符

执行 查询

以下是使用所有流行的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();

代码有点复杂,但是所有这些运算符的详细说明都可以在我的文章“

如何使用Mysqli运行INSERT查询”中找到,并且可以大大简化该过程。

使用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还支持命名占位符,有些占位符非常方便。

添加关键字或标识符

但是有时我们添加了一个代表查询的另一部分的变量,例如关键字或标识符(数据库,表或字段名)。在这种情况下,必须对照在脚本中 明确

编写的值列表检查变量。这在我的另一篇文章《基于用户的选择在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";

2020-05-17

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值