Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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 bindParam未按预期工作_Php_Mysql_Pdo - Fatal编程技术网

Php PDO bindParam未按预期工作

Php PDO bindParam未按预期工作,php,mysql,pdo,Php,Mysql,Pdo,这已经被窃听了很长时间,我仍然不知道我做错了什么。 在代码中,我想用逗号分隔的字符串选择几个用户。字符串将始终合法有效 在第一个示例中,我想使用的是bindParam,它将$postId的值分配给SQL查询。我一直在使用bindParam()进行许多其他调用,但在这种特定情况下,它失败了 $postId = "1,2,3"; $stm = $this->db->prepare('SELECT * FROM posts WHERE find_in_set(userId, "?") O

这已经被窃听了很长时间,我仍然不知道我做错了什么。 在代码中,我想用逗号分隔的字符串选择几个用户。字符串将始终合法有效

在第一个示例中,我想使用的是bindParam,它将
$postId
的值分配给SQL查询。我一直在使用
bindParam()
进行许多其他调用,但在这种特定情况下,它失败了

$postId = "1,2,3";

$stm = $this->db->prepare('SELECT * FROM posts WHERE find_in_set(userId, "?") ORDER BY id DESC');
$stm->bindParam(1, $postId, PDO::PARAM_STR);
$stm->setFetchMode(PDO::FETCH_ASSOC);
$stm->execute();
$results = $stm->fetchAll();   
return print_r($results,true);
此代码返回:

array (
)
在我不想使用的另一段代码中,我只是将
$postId
的值直接传递到sql查询中

$stm = $this->db->prepare('SELECT * FROM posts WHERE find_in_set(userId, "'.$postId.'") ORDER BY id DESC');
$stm->setFetchMode(PDO::FETCH_ASSOC);
$stm->execute();
$results = $stm->fetchAll();   
return print_r($results,true);
此代码返回它应该检索的所有行


我的问题是,;具体问题是什么?我如何避免再次执行此操作?

在您的查询中,占位符周围不应该有引号:

$stm = $this->db->prepare('SELECT * FROM posts WHERE find_in_set(userId, ?) ORDER BY id DESC');
见补充说明

虽然这与问题没有直接关系,但使用命名参数也是一个方便的习惯。当您只有一个参数要传递时,这并不太糟糕,但是当您在查询中开始得到五个左右的问号时,如果您使用命名参数,那么实际阅读起来就容易多了:

SELECT * FROM posts WHERE find_in_set(userId, :someID) ORDER BY id DESC
然后在代码中将它们绑定为命名参数:

$sth->bindParam(':someID', $postId, PDO::PARAM_STR);

在yout查询中,占位符周围不应该有引号:

$stm = $this->db->prepare('SELECT * FROM posts WHERE find_in_set(userId, ?) ORDER BY id DESC');
见补充说明

虽然这与问题没有直接关系,但使用命名参数也是一个方便的习惯。当您只有一个参数要传递时,这并不太糟糕,但是当您在查询中开始得到五个左右的问号时,如果您使用命名参数,那么实际阅读起来就容易多了:

SELECT * FROM posts WHERE find_in_set(userId, :someID) ORDER BY id DESC
然后在代码中将它们绑定为命名参数:

$sth->bindParam(':someID', $postId, PDO::PARAM_STR);

引用值时,不需要添加双引号
“?”

'SELECT * FROM posts WHERE find_in_set(userId, "?") ORDER BY id DESC'
应该是

'SELECT * FROM posts WHERE find_in_set(userId, ?) ORDER BY id DESC'

引用值时,不需要添加双引号
“?”

'SELECT * FROM posts WHERE find_in_set(userId, "?") ORDER BY id DESC'
应该是

'SELECT * FROM posts WHERE find_in_set(userId, ?) ORDER BY id DESC'

您告诉bindParam将值绑定为字符串(您也应该使用bindValue,但这是一种技巧)。发生的情况是,您的查询结果是
SELECT*来自按id DESC排序的find_in_set(userId,“'1,2,3')的帖子,而不是所需的
SELECT*来自按id DESC排序的find_in_set(userId,'1,2,3')。长话短说-在第一个场景中,删除参数周围的双引号。不要在SQL语句中的占位符周围加引号,准备好的语句可以为您处理这些问题。我打算对上述注释说同样的话,只是不是100%确定;有道理。@N.B.哦,我明白了,我想是初学者弄错了。。但它确实有帮助,查询返回正。@Anders-这是为什么绑定变量更安全的一个原因,它们为您处理转义和引号,这样您就永远不会忘记这样做。您告诉bindParam将值绑定为字符串(您也应该使用bindValue,但在这一点上这很巧妙)。发生的情况是,您的查询结果是
SELECT*来自按id DESC排序的find_in_set(userId,“'1,2,3')的帖子,而不是所需的
SELECT*来自按id DESC排序的find_in_set(userId,'1,2,3')。长话短说-在第一个场景中,删除参数周围的双引号。不要在SQL语句中的占位符周围加引号,准备好的语句可以为您处理这些问题。我打算对上述注释说同样的话,只是不是100%确定;有道理。@N.B.哦,我明白了,我想是初学者弄错了。。但这确实有帮助,查询返回肯定的结果。@Anders-这就是为什么绑定变量安全得多的原因之一,它们可以为您处理转义和引用,这样您就永远不会忘记执行注释中提到的操作,初学者的错误,大代码会困扰大脑,而且您看不清楚……)正如在评论中提到的,初学者会犯错误,大型代码会困扰大脑,而且你看不清楚感谢您提供了详细的答案+1占位符真的很方便是的,正如你所说,对于1或2个值是可以的:)谢谢你提供了详细的答案+1占位符真的很方便是的,正如你所说,对于1或2个值是可以的:)