Php 使用PDO准备语句和MySQL查询变量
我正在尝试使用PHPPDO增加表中的行,我提出了这个查询Php 使用PDO准备语句和MySQL查询变量,php,mysql,pdo,Php,Mysql,Pdo,我正在尝试使用PHPPDO增加表中的行,我提出了这个查询 UPDATE users SET log = ? 我正在尝试根据日志每列上的上一个值进行更新 如果我的桌子早些时候是这样的 +--+---+---+------+----+ |id |姓名|年龄|眼睛|颜色|日志| +--+---+---+------+----+ |21 | OLa | 19 |黑色| 1| |22 |奥拉| 19 |绿色| 2| |23 |奥拉| 19 |灰色| 3| +--+---+---+------+----
UPDATE users SET log = ?
我正在尝试根据日志每列上的上一个值进行更新
如果我的桌子早些时候是这样的
+--+---+---+------+----+
|id |姓名|年龄|眼睛|颜色|日志|
+--+---+---+------+----+
|21 | OLa | 19 |黑色| 1|
|22 |奥拉| 19 |绿色| 2|
|23 |奥拉| 19 |灰色| 3|
+--+---+---+------+----+
我期待得到这个结果
+--+---+---+------+----+
|id |姓名|年龄|眼睛|颜色|日志|
+--+---+---+------+----+
|21 | OLa | 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']);
但是我更喜欢我最初的方法,我正在处理一些限制。因为您没有从用户那里获得信息,并且是将1和一列相加,这样您就可以安全地执行常规查询
UPDATE users SET log = log + 1
如果使用prepare语句,则必须查询列以获取当前值,然后在第二次查询中执行更新并向其中添加1。由于您没有从用户处获取信息,并且要将1和列相加,因此可以安全地执行常规查询
UPDATE users SET log = log + 1
如果使用prepare语句,则必须查询列以获取当前值,然后在第二次查询中执行更新并向其中添加1。不能使用查询参数将表达式插入语法。参数不仅仅是字符串插值。如果是的话,使用它们将没有任何好处,因为您已经可以在PHP中轻松地进行字符串插值了 查询参数的全部要点是,在解析SQL语法之后,该值将与服务器上的查询相结合,因此现在插入任何新语法(如表达式)都为时已晚 查询参数始终被视为单个标量值。不能将参数用于: 表标识符 列标识符 SQL关键字 表达 价值清单
正如其他人所解释的,在本例中,您无论如何都不需要使用查询参数。直接在查询中使用文本表达式log+1是安全的。没有来自用户或其他来源的不可信内容被插入到查询中,因此没有SQL注入的风险。您不能使用查询参数将表达式插入到语法中。参数不仅仅是字符串插值。如果是的话,使用它们将没有任何好处,因为您已经可以在PHP中轻松地进行字符串插值了 查询参数的全部要点是,在解析SQL语法之后,该值将与服务器上的查询相结合,因此现在插入任何新语法(如表达式)都为时已晚 查询参数始终被视为单个标量值。不能将参数用于: 表标识符 列标识符 SQL关键字 表达 价值清单
正如其他人所解释的,在本例中,您无论如何都不需要使用查询参数。直接在查询中使用文本表达式log+1是安全的。没有来自用户或其他来源的不可信内容被插入到查询中,因此没有SQL注入的风险。在使用height+1的位置执行查询,height应该是多少?使用单引号将文本字符串传递给更新,这不是您想要的。您需要更新用户设置log=height+?和$stml->execute['1'];假设高度是db表中高度的前一个值,sql就是这样工作的。另外,您有一个输入错误:$stmt vs$stmlth这篇文章毫无意义。如果您需要height+1,那么为什么您的代码显示log+1查询在您使用height+1的地方执行?height应该是什么?使用单引号将文本字符串传递给更新,这不是您想要的。您需要更新用户设置log=height+?和$stml->execute['1'];假设高度是db表中高度的前一个值,sql就是这样工作的。另外,您有一个输入错误:$stmt vs$stmlth这篇文章毫无意义。如果您需要height+1,那么为什么代码显示log+1