php - PDO bindParam 未按预期工作

标签 php mysql pdo

这已经被窃听了很长时间,我仍然无法弄清楚我做错了什么。 在代码中,我想用逗号分隔的字符串选择一些用户。该字符串将始终合法有效。

在第一个示例中,我想使用的示例使用 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');

查看更多 docs here .

虽然它与问题没有直接关系,但使用命名参数也是一个方便的习惯。当您只有一个参数要传递时,还算不错,但是当您在查询中开始出现五个左右的问号时,如果您使用命名参数,实际阅读起来会容易得多:

SELECT * FROM posts WHERE find_in_set(userId, :someID) ORDER BY id DESC

然后将它们绑定(bind)为代码中的命名参数:

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

关于php - PDO bindParam 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19693829/

相关文章:

php - 警告:PDOStatement::bindValue():SQLSTATE[HY093]:参数编号无效:列/参数基于 1

PHP/PDO 和 SQL Server 连接和国际化问题

mysql - 如何更新 MySQL SET 类型的成员?

mysql - 无法从表中删除外键

mysql - 使用 MySQL,从 HTTP ['QUERY_STRING' 中过滤 $_GET 变量]

php - 返回 'No data received' 的 ODBC PDO

php - 使用 fetchAll() 从 PDO 对象中选择

php - 如何使用 where 子句连接 codeigniter 中的两个表

php - 从具有相同名称的多个选择框中获取值?在 jquery 和 php 中包含它的值

PHP:检查链接是否为图像并检查是否存在