这个问题已经困扰了很长一段时间了,我仍然搞不清我做错了什么。
在代码中,我想用逗号分隔的字符串选择一些用户。字符串将始终合法有效。
在第一个示例中,我想使用的示例使用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);
此代码返回它应该检索的所有行。
我的问题是:具体的问题是什么?我怎样才能避免再次这样做?
最佳答案
在You t查询中,占位符周围不应该有引号:
$stm = $this->db->prepare('SELECT * FROM posts WHERE find_in_set(userId, ?) ORDER BY id DESC');
参见其他docs here。
尽管这与问题没有直接关系,但使用命名参数也是一个很方便的习惯。当您只有一个参数要传递时,这并不算太糟,但是当您开始在查询中获得五个左右的问号时,如果您使用命名参数,实际上更容易阅读:
SELECT * FROM posts WHERE find_in_set(userId, :someID) ORDER BY id DESC
然后在代码中将它们绑定为命名参数:
$sth->bindParam(':someID', $postId, PDO::PARAM_STR);
关于php - PDO bindParam无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19693829/