PDO预处理语句出现问题

5

我目前正在尝试运行一个查询,其中mysql表列的当前值自增1...让我通过mysql查询示例来展示这一点

$sql = mysql_query("UPDATE `table` SET quantity=quantity+1 WHERE id='$id'");

我无法在PDO准备好的语句中完成此操作...

$sql = "UPDATE `table` SET quantity=:quants+1 WHERE id=:userid";
$sql_prep = $db->prepare($sql);
$sql_prep->bindParam(":quants", what will i write here??);
$sql_prep->bindParam(":userid", $id);
$sql_prep->execute();

需要帮助!谢谢。
2个回答

3
您不需要将其作为参数传递,只需执行以下操作:

$sql = "UPDATE `table` SET quantity=quantity+1 WHERE id=:userid";
$sql_prep = $db->prepare($sql);
$sql_prep->bindParam(":userid", $id);
$sql_prep->execute();

SQL注入问题怎么样?这个查询会防止SQL注入吗...? - nick
1
没有注入,你传递给查询的唯一参数是用户ID。数量是数据库内部的。 - The Blue Dog
当在数据库内转置或操作数据时,通常不必担心 SQL 注入问题,因为 MySQL 数据库已经处理本地数据,无需指导如何处理。但是,在存储过程中组合 SQL 查询时,这个规则有例外。 - tadman
1
好的,那么关于userid bindparam呢?我需要像PDO :: PARAM_INT这样做一些更安全的事情吗?还是可以吗? - nick
没问题,参数数据类型是可选的。如果你的id字段是整数,为了完整性可以添加PDO::PARAM_INT,但这不是必需的。 - The Blue Dog

0

你不需要保护quantity,因为你只是增加数据库中已有的值。

 $sql = "UPDATE `table` SET quantity=quantity+1 WHERE id=:userid";

你也可以删除:quants的绑定行。
 $sql_prep = $db->prepare($sql);

 // NOT NEEEDED --> $sql_prep->bindParam(":quants", what will i write here??);

 $sql_prep->bindParam(":userid", $id);
 $sql_prep->execute();

准备好的语句是为了保护通过查询从外部插入到数据库中的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接