【问题标题】:PDO fetch returns nothing when trying to use a modular query尝试使用模块化查询时,PDO fetch 不返回任何内容
【发布时间】:2015-03-11 03:34:24
【问题描述】:

我的想法是我有一个用户数组,从中获取键来创建一个字符串供 pdo 准备(用户索引)。然后将该数组中的用户绑定到相应的参数。

$sql = SELECT * FROM `tablename` WHERE `payload` IS NOT NULL

我在这个字符串中添加了一个参数:

foreach($users as $key => $user){
    $sql = $sql." AND `user` LIKE :user".$key;
}

注意:我只是使用用户定义字符串上的explode语句生成的数组中的键。不能 100% 确定密钥是否安全,但我没有找到这方面的相关信息。

由此产生的字符串与 users = array([0]=>01) 相等:

SELECT * FROM `tablename`
WHERE `payload` IS NOT NULL
AND `user` LIKE :user0

稍后我使用这个绑定值:

foreach($users as $key => $user){
    $stmt->bindValue(":user".$key, "\"%".$user."%\"");
}

这意味着execute()的声明等于:

SELECT * FROM `tablename` WHERE `payload` IS NOT NULL AND `user` LIKE "%01%"

如果我在 phpmyadmin 上执行这个语句,我会得到 368 个结果,但是这个 while 循环根本不会被执行:

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    // do stuff
}

$db->errorInfo() 返回此Array ( [0] => 00000 [1] => [2] => )


编辑:已解决。
我不需要为参数添加引号,因为 mysql 正在搜索我的列的引号。

【问题讨论】:

  • 您不需要引用参数值。只需$stmt->bindValue(":user".$key, "%$user%");
  • 你的问题解决了吗?
  • 谢谢,问题已经解决了。

标签: php mysql pdo fetch explode


【解决方案1】:

我建议这个解决方案:

<?php

$sql = "SELECT * FROM `tablename` WHERE `payload` IS NOT NULL";

foreach($users as $key => $user){
    $sql .= " AND `user` LIKE ?";
}

$i = 1;
foreach($users as $key => $user){
    $stmt->bindValue($i, "\"%".$user."%\"", PDO::PARAM_STR);
    ++$i;
}

?>

【讨论】:

  • 问题已解决。我不需要引用参数值。使用引号意味着mysql也在user列中搜索引号。
  • @PeterWever 如果您认为我的回答对您有帮助,您可以检查它是否正确
  • 是的,对不起,我是 stackoverflow 的新手。
猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2013-12-29
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多