php - 使用带有 MySQL 查询变量的 PDO 准备语句

标签 php mysql pdo

我正在尝试使用 PHP PDO 增加表中的行,我想出了这个查询

UPDATE users SET log = ? 

我正在尝试根据日志每一列的先前值进行更新

所以,如果我的 table 早先是这样的

+----+------+------+------------+--------+ |编号 |姓名 |年龄 |眼睛颜色 |日志 | +----+------+------+----------+--------+ | 21 |奥拉 | 19 |黑色 | 1 | | 22 |奥拉 | 19 |绿色 | 2 | | 23 |奥拉 | 19 |灰色| 3 | +----+------+------+------------+--------+

我期待得到这个结果

+----+------+------+------------+--------+ |编号 |姓名 |年龄 |眼睛颜色 |日志 | +----+------+------+----------+--------+ | 21 |奥拉 | 19 |黑色 | 2 | | 22 |奥拉 | 19 |绿色 | 3 | | 23 |奥拉 | 19 |灰色| 4 | +----+------+------+------------+--------+

我发现我可以让占位符的值变成

log + 1

通过进行完整查询

UPDATE users SET log = log + 1

当我使用 PDO 的查询方法以及我的终端时,这很有效,当我尝试使用准备好的语句更新它时,问题就来了,如果我这样做了

$stmt = $this->pdo->prepare("UPDATE users SET log = ?");
$stml->execute(['height + 1']);

然后所有的日志列都变成0。

我做错了什么吗?我也知道我可以让查询简单明了

$stmt = $this->pdo->prepare("UPDATE users SET log = log + 1");
$stmt->execute(['log + 1']);

但我更喜欢我最初的方法,我在一些限制条件下工作。

最佳答案

您不能使用查询参数将表达式插入语法中。参数不仅仅是字符串插值。如果是,那么使用它们就没有任何好处,因为您已经可以在 PHP 中轻松地进行字符串插值。

查询参数的全部要点是该值与服务器上的查询相结合, SQL 语法被解析之后,所以插入任何新语法都为时已晚,例如一个表达式。

查询参数始终被视为单个标量值。您不能将参数用于:

  • 表标识符
  • 列标识符
  • SQL关键字
  • 表达式
  • 值列表

正如其他人所解释的,在这种情况下,您无论如何都不需要使用查询参数。直接在查询中使用文字表达式 log + 1 是安全的。没有不受信任的内容(来自用户或其他来源)被插入到查询中,因此没有 SQL 注入(inject)的风险。

关于php - 使用带有 MySQL 查询变量的 PDO 准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54814223/

相关文章:

php - 动态数据表的样式数据行

php - 如何将可扩展的长轮询服务器与 PHP 集成?

php - 将 MYSQL 脚本转换为 PDO

php - 使用 PDO 更新 MySQL 记录,但数据包含破坏 SQL 语法的字符串

php - 我的 PDO INSERT INTO 是否足够安全?

php - 如何在保持库代码框架独立的同时为 symfony 开发库

php - Paypal 沙盒 CURL 执行 - "SSL connect error "

php - 有选择地将数据从一个表拆分并保存到另一个mysql

mysql - 是否可以对 mysql SELECT 语句中返回列的顺序进行排序?

php - 使用 PDO 进行动态列表查询