PDO 查询未在 PHP foreach 循环中返回结果

Posted

技术标签:

【中文标题】PDO 查询未在 PHP foreach 循环中返回结果【英文标题】:PDO query not returning results in PHP foreach loop 【发布时间】:2015-07-23 19:01:44 【问题描述】:

我有一个函数(如下),它没有从 foreach 循环内的 PDO 查询返回结果集。不知道可能是什么问题。稍微解释一下,我正在运行 php v5.6.3,传递给函数的 $csv 字符串类似于:

$csv = "red, brown, blue";

运行 str_getcsv 后,print_r($colors) 会按预期工作。我尝试在循环内部或外部准备查询和绑定值,但没有成功,如果我将查询拉到循环之外(并运行一次),它就可以工作。

function generateColors($csv) 
    global $db; // Connect DB
    $colors = str_getcsv($csv, ","); //Converts the CSV to an array
    $query = $db->prepare("SELECT * FROM colors WHERE slug = :slug");
    foreach ($colors as $slug) 
        $query->bindValue(':slug', $slug, PDO::PARAM_STR);
        $query->execute();
        $result = $query->fetch(PDO::FETCH_ASSOC);
        echo "COLOR: " .$slug;
        echo "<br>";
        var_dump($result);
    

输出(如下)显示循环正在工作,只是查询似乎在 1 次迭代后停止返回值。关于为什么我得到一个 bool(false) 而不是像 [column 1]=>value 1、[column 2]=>value 2 等的数组集的任何帮助,将不胜感激。

COLOR: red
array -> [column]=>value, [column]=value, etc. // returned as expected.
COLOR: brown
bool(false)
COLOR: blue
bool(false)

【问题讨论】:

问题是你认为 foreach 的 $slug 会自动均衡 $slug 的 bindvalue,这不会发生。您需要将您的 bindValue 代码放在 foreach 中,然后需要检查 编辑了上面的函数以将 bindValue 放回循环中。不幸的是,仍然导致 bool(false)。 实际上...将它放回循环中,我注意到它正确返回了第一个结果集(对于第一个循环运行),但是,循环中的所有后续值都返回 bool (假)。 这意味着您有第一个 slug 的记录,但没有其他人的记录?我想我很清楚? 正确,我的输出现在是这样的: COLOR: red array(11) ["slug"]=> string(15) "red" ["name"]=> string(15) “红色”等......颜色:棕色布尔(假)等...... 【参考方案1】:

您应该在 foreach 中绑定参数。在 foreach 之前,您的变量 $slug 未定义。

function generateColors($csv) 
    global $db; // Connect DB
    $colors = str_getcsv($csv, ","); //Converts the CSV to an array
    $query = $db->prepare("SELECT * FROM colors WHERE slug = :slug");
    foreach ($colors as $slug) 
        $query->bindValue(':slug', $slug, PDO::PARAM_STR);
        $query->execute();
        $result = $query->fetch(PDO::FETCH_ASSOC);
        echo "COLOR: " .$slug;
        echo "<br>";
        var_dump($result);
    

【讨论】:

我明白你的意思。事实上,我一直在修补这个问题,以至于我错误地应该在发布之前将其放回内部;)但是,即使将 bindValue 放回循环中,我仍然得到一个 bool(false)。 :-/

以上是关于PDO 查询未在 PHP foreach 循环中返回结果的主要内容,如果未能解决你的问题,请参考以下文章

PHP:PDO foreach 不起作用

如何在foreach循环中显示来自PDO的数据

PHP Mysql PDO查询来自foreach存储的多个值以供输出

带有 PDO::FETCH_ASSOC 的 foreach 循环,提供的参数无效

PDO 准备状态与手动查询的结果不同

循环更新查询 pdo where id