我有以下代码:
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?我该怎么办呢?
答案 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;
[...]
答案 2 :(得分:0)
问题是结果集只能迭代一次;它耗尽,MySQL丢弃它,你不能再次迭代它。
我从来没有尝试过这个,但要创建一个可以多次迭代的结果集,你需要一个可滚动游标,你应该能够创建正是如此:
$sqlQueryLocalityAdd = $dbh->prepare(..., [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
理论上你应该能够多次迭代结果。
如果不起作用,请使用$sqlQueryLocalityAdd->fetchAll()
将数据提取到数组中,并根据需要进行迭代。事实上,这似乎是MySQL的唯一选择:https://stackoverflow.com/a/19076778/476