【发布时间】:2016-08-08 14:00:48
【问题描述】:
我只是在使用 PHP 和 PDO 与 MySQL 数据库进行一些试验,我有点困惑为什么在获得结果后,将它们正确存储在多维数组中并循环通过它们输出一个数组数据的两次。
基本上这是获取数据的查询:
SELECT b.Price, b.ImgURL, m.Name, f.ID, f.Family, f.URL FROM Products AS b INNER JOIN Manufacturers AS m ON m.ID = b.Manufacturer INNER JOIN FamilyLookUp AS l ON l.Product = b.ID INNER JOIN Families AS f ON f.ID = l.Family GROUP BY f.ID ORDER BY b.Price ASC
我希望这样可以为每个家庭返回 1 行,它在 PHPMyAdmin 查询和 print_r() 结果中都能正常工作。
然后我存储在:
$families[] = array('ID' => $f['ID'], 'Manufacturer' => $f['Name'], 'Family' => $f['Family'], 'URL' => $f['URL'], 'IMG' => $f['ImgURL'], 'Price' => $f['Price'], 'ScentCount' => 0);
这在执行 print_r() 时也可以正常工作,并且当仅使用 foreach 循环回显每个条目的 ID 时,它返回 1234567(所有 7 个家庭 ID)
然后我运行另一个查询:
try{
$sqlCmd = "SELECT COUNT(*) FROM FamilyLookUp WHERE Family=:fID";
$s = $pdo->prepare($sqlCmd);
foreach($families as &$fam){
$s->bindValue(':fID', $fam['ID']);
$s->execute();
$fam['ScentCount'] = $s->fetchColumn();
}
}
这也获得了正确的计数,并将它们正确地存储在数组中,用于每个系列中的项目数。到目前为止一切都很好。
问题发生在我:
foreach($families as $fam):
?>
<div class="product-listing">
<?php echo $fam['ID']; ?>
<div class="product-listing-image">
<a href="<?php echo $fam['URL']; ?>"><img alt="" src="<?php echo $fam['IMG']; ?>"></a>
</div>
<div class="product-listing-details">
<a href="<?php echo $fam['URL']; ?>"><h3><?php echo strtoupper($fam['Manufacturer']); if($fam['Family'] != ""){ echo strtoupper(' - ' . $fam['Family']);} ?></h3></a>
<?php if($fam['ScentCount'] == 1): ?>
<span class="product-scent-count"><?php echo $fam['ScentCount']; ?> Scent</span>
<span class="product-price-value">£<?php echo $fam['Price']/100; ?></span>
<?php elseif($fam['ScentCount']>1): ?>
<span class="product-scent-count"><?php echo $fam['ScentCount']; ?> Scents</span>
<span class="product-price-value">From £<?php echo $fam['Price']/100; ?></span>
<?php endif;?>
</div>
</div>
<?php
endforeach;
?>
执行此操作后,它会正确输出前 6 个数据系列,但由于某种原因,它会输出第 6 个数据的副本,而不是实际的第 7 个数据。在 foreach 循环开始之前对行中的所有数据执行 print_r 时,它会返回所有正确的数据,但在 foreach 循环中,会出现 1 个重复数组代替第 7 个原始正确数组。
任何建议都会很棒。
编辑 Kohloth 的答案(print_r 后跟 foreach vardump):
Array
(
[0] => Array
(
[ID] => 1
)
[1] => Array
(
[ID] => 7
)
[2] => Array
(
[ID] => 2
)
[3] => Array
(
[ID] => 3
)
[4] => Array
(
[ID] => 4
)
[5] => Array
(
[ID] => 6
)
[6] => Array
(
[ID] => 5
)
)
array(7) {
["ID"]=>
string(1) "1"
}
array(7) {
["ID"]=>
string(1) "7"
}
array(7) {
["ID"]=>
string(1) "2"
}
array(7) {
["ID"]=>
string(1) "3"
}
array(7) {
["ID"]=>
string(1) "4"
}
array(7) {
["ID"]=>
string(1) "6"
}
array(7) {
["ID"]=>
string(1) "6"
}
【问题讨论】:
-
猜测:在foreach循环之后添加
unset($fam);:foreach ($families as &$fam){ ...。你也可以停止使用bindParam。而是使用。 'bindValue' 还是只传递 'execute' 语句中的值? imo,您很少需要将'bindParam' 与PDO 一起使用。 imo,您也不需要'bindValue'。 imo,只需传递execute中的数据数组即可。也许有趣? PDO made really easy most of the time? -
感谢您的评论瑞恩。我已经在使用 bindValue 了。虽然对于学习 PHP 来说相对较新,但肯定会更多地关注在 execute 方法中传递数据数组。有趣的是,当我在 foreach 循环的末尾添加 unset($fam) 时,kohloth 建议它更改输出。从按顺序输出数组 1723466 = ID 为 6 的重复族,到 1723461 = ID 为 1 的重复族
-
天哪。非常感谢你的帮助。当放在 foreach 循环结束之后,未设置的东西实际上起作用了,我认为你的意思是在可执行代码结束后的循环内。我肯定会尝试仅在函数内需要时才使用 foreach 循环。无论如何,我无法想象有太多的参考文献是那么棒。非常感谢
-
不,经常使用 foreach 循环! 不要在 PHP 中使用 '&$var',除非你真的必须这样做。你不应该这样做。很高兴你把它整理好了 - 感谢收听 :)
-
查看@trincot 提供的答案以了解正在发生的事情。 :)
标签: php mysql arrays pdo foreach