仅在Internet Explorer中为foreach提供的参数无效


Invalid argument supplied for foreach in Internet Explorer only

为什么在使用IE时会出现此警告?

Warning: Invalid argument supplied for foreach() 

它适用于所有其他浏览器。。

循环的功能:

function wdsearch(PDO $dbh){
    if(!isset($_POST['wdsubmit'])) {
    } else {
        $term = $_POST['wdsearchvalue'];
        $stmt = $dbh->prepare("
            SELECT      *
            FROM        posts
            WHERE       category = :designer
            AND         (full_text LIKE CONCAT('%', :term, '%')
            OR          heading LIKE CONCAT('%', :term, '%'))
            ORDER BY    post_date DESC
        ");
        $designer = 'Designer';
        $stmt->bindParam(":designer", $designer);
        $stmt->bindParam(":term", $term);
        $stmt->execute();
        return $stmt->fetchAll();
    }
}
wdsearch($dbh);
$wdsearch = wdsearch($dbh);

循环到此为止。。

<?php foreach($wdsearch as $wds) : ?>
<!-- HTML here -->
<?php endforeach; ?>

是否有任何可能的IE相关警告?就像我说的所有其他浏览器都可以处理它。

问题出在wdsearch函数中;如果未设置$_POST['wdsubmit'],它将不返回任何内容;如果任何db操作出现任何错误,它也不会返回数组。

您需要在数据库操作中添加一些错误处理,如果失败或未发布,请返回一个空数组/在使用foreach之前检查$wdsearch是否为数组。

指定的错误发生在PHP代码中,而不是任何特定的浏览器中。

问题是,$wdsearch的数据类型没有实现iterator。这可能是由于$wdsearchnull、字符串/数字等造成的或者仅仅是一个不支持的对象。

在使用is_array($wdsearch)进入foreach循环之前,请尝试验证数据是否为数组,或者使用isset($wdsearch)验证变量是否为null。如果您认为那里有有效的数据,请检查$wdsearch中的对象是否真的支持迭代器,如果不支持,请更新它以实现!

示例:

<?php
if (isset($wdsearch)):
    foreach($wdsearch as $wds) :
        ?>
        <!-- HTML here -->
        <?php
    endforeach;
endif;
?>

如果对于相同的参数,它可以在Chrome和FF中工作,但不能在IE中工作。

你在IE中到底提交了什么。有没有一些愚蠢的东西,比如一个带图片提交的按钮?这将传递您的条件作为单击的位置,而不是实际值。

在输出到foreach之前,调试$POST中的传入参数。另外,如何处理空结果集?