这已经困扰了很长时间,我仍然无法弄清楚我做错了什么。 在代码中我想用逗号分隔的字符串选择一些用户。字符串将始终合法有效。
在第一个示例中,我想使用的示例使用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);
此代码返回它应检索的所有行。
我的问题是;具体问题是什么?如何避免再次这样做?
答案 0 :(得分:4)
在查询中,您不应该在占位符周围加上引号:
$stm = $this->db->prepare('SELECT * FROM posts WHERE find_in_set(userId, ?) ORDER BY id DESC');
请参阅其他docs here。
虽然它与问题没有直接关系,但使用命名参数也是一种方便的习惯。如果你只有一个param可以通过,那也不算太糟糕,但是当你在查询中开始得到五个左右的问号时,如果你使用了命名参数,那么实际读取它会更容易:
SELECT * FROM posts WHERE find_in_set(userId, :someID) ORDER BY id DESC
然后在代码中将它们绑定为命名参数:
$sth->bindParam(':someID', $postId, PDO::PARAM_STR);
答案 1 :(得分:1)
引用值
时,不需要添加双引号"?"
'SELECT * FROM posts WHERE find_in_set(userId, "?") ORDER BY id DESC'
应该是
'SELECT * FROM posts WHERE find_in_set(userId, ?) ORDER BY id DESC'