这个问题已经困扰了很长一段时间了,我仍然搞不清我做错了什么。
在代码中,我想用逗号分隔的字符串选择一些用户。字符串将始终合法有效。
在第一个示例中,我想使用的示例使用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/

10-11 03:07