PHP / PDO - 使用多个foreach循环时多次使用PDO语句

时间:2016-04-05 13:54:15

标签: php mysql pdo foreach

我有以下代码:

if(!empty($postCountryAdd)) {
$sqlQueryLocalityAdd = $dbh->prepare("SELECT DISTINCT locality_add FROM table WHERE country_add = :country_add ORDER BY locality_add ASC");
$sqlQueryLocalityAdd->execute(array(':country_add' => $postCountryAdd));

echo '<option value="">Select locality</option>';
    foreach($sqlQueryLocalityAdd as $localityAddRow) {
        //while ($localityAddRow = $sqlQueryLocalityAdd->fetch()){
        echo '<option value="';
        echo $localityAddRow["locality_add"];
        echo '">';
        echo $localityAddRow["locality_add"];
        echo '</option>';
    }
}

如果我使用foreach($sqlQueryLocalityAdd as $localityAddRow)代码停止响应。为什么我不能多次使用foreach?我该怎么办呢?

3 个答案:

答案 0 :(得分:0)

$sqlQueryLocalityAdd不是一个结果集,它是一个PDOStatement对象,你只能直接迭代一次(如deceze清楚所述)。

execute()语句在查询成功时返回boolean true或false。

如果成功运行,则需要在查询后从中获取结果并迭代返回的数组:

   $success = $sqlQueryLocalityAdd->execute(array(':country_add' => $postCountryAdd));
   if($success) {

       $results = $sqlQueryLocalityAdd->fetchAll();

       foreach($results as $localityAddRow) {
           echo '<option value="';
            ....

生成的数组$results只是一个vanilla数组,因此您可以根据需要多次迭代它。

注意:如果execute()返回false,则查询出错 - 成功运行的查询返回空结果集结果仍会产生true

答案 1 :(得分:0)

$sqlQueryLocalityAdd是一个对象,在这种情况下 - 我正在展示并且OP已经使用 - 无法迭代。 (大胆如此@deceze可以理解)。

您可以使用fetchAll()循环内的foreach来实现此目的。

您的代码应如下所示:

[...]
    if($sqlQueryLocalityAdd->execute(array(':country_add' => $postCountryAdd)):
        foreach($sqlQueryLocalityAdd->fetchAll() as $row):
            echo $row['column'];
            [...]
        endforeach;
    endif;
[...]

Difference between an array and an Object

答案 2 :(得分:0)

问题是结果集只能迭代一次;它耗尽,MySQL丢弃它,你不能再次迭代它。

我从来没有尝试过这个,但要创建一个可以多次迭代的结果集,你需要一个可滚动游标,你应该能够创建正是如此:

$sqlQueryLocalityAdd = $dbh->prepare(..., [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);

理论上你应该能够多次迭代结果。

如果不起作用,请使用$sqlQueryLocalityAdd->fetchAll()将数据提取到数组中,并根据需要进行迭代。事实上,这似乎是MySQL的唯一选择:https://stackoverflow.com/a/19076778/476