Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用PDO准备语句和MySQL查询变量_Php_Mysql_Pdo - Fatal编程技术网

Php 使用PDO准备语句和MySQL查询变量

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| +--+---+---+------+----

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

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