我有这个PHP代码,带有for循环:
$expireData = array();
for($x = 0; $x <= 10; $x++){
$stmt=$dbh->prepare("select round((expire - unix_timestamp()) / 86400) as days, count(*) as cnt from users WHERE user_by=:username group by days;");
$stmt->bindParam(":username",$userdata['username']);
$stmt->execute();
$row = $stmt->fetchAll();
#var_dump($row);
if($row["cnt"] > 0){
$expireData[] = $row["cnt"];
}else{
$expireData[] = 0;
}
}
如果我执行var_dump($row)
我得到:
array(2) {
[0]=>
array(4) {
["days"]=>
string(2) "27"
[0]=>
string(2) "27"
["cnt"]=>
string(1) "2"
[1]=>
string(1) "2"
}
[1]=>
array(4) {
["days"]=>
string(3) "116"
[0]=>
string(3) "116"
["cnt"]=>
string(1) "8"
[1]=>
string(1) "8"
}
}
但是,如果我只是echo $row['cnt'];
它没有回应任何东西 - 它是空的。为什么呢?
最终,我希望在for循环之外使用for循环中的数据 - 比如:
echo implode(',', $expireData);
但那只是给了我
0,0,0,0,0,0,0,0,0,0
我做错了什么?
答案 0 :(得分:3)
由于您使用fetchAll()
将所有行检索到$row
,因此其内容是表示多个行的二维数组。所以键['cnt']
存在,但是在数组中是一个维度。
$row['cnt']
不存在但$row[0]['cnt']
确实存在且$row[1]['cnt']
确实存在。
使用当前代码的最简单的解决方案是将$expireData
处理移到循环外部并进入自己的循环:
$expireData = array();
$stmt=$dbh->prepare("select round((expire - unix_timestamp()) / 86400) as days, count(*) as cnt from users WHERE user_by=:username group by days;");
$stmt->bindParam(":username",$userdata['username']);
$stmt->execute();
// Load all rows into $rows rather than $row...
$rows = $stmt->fetchAll();
// Loop over all rows to populate $expireData
foreach ($rows as $row) {
if ($row["cnt"] > 0){
$expireData[] = $row["cnt"];
}else{
$expireData[] = 0;
}
}
print_r($expireData);
另一种方法是从fetchAll()
切换到普通fetch()
并在while循环中将行追加到$rows
:
// Array to hold all rows
$rows = array();
// (The outer for loop is removed...)
$stmt=$dbh->prepare("select round((expire - unix_timestamp()) / 86400) as days, count(*) as cnt from users WHERE user_by=:username group by days;");
$stmt->bindParam(":username",$userdata['username']);
$stmt->execute();
// Perform single fetch() calls in a while loop
while ($row = $stmt->fetch()) {
// Append onto array of all rows
$rows[] = $row;
// Then handle $expireData in the same loop
if ($row["cnt"] > 0){
$expireData[] = $row["cnt"];
}else{
$expireData[] = 0;
}
}
根据评论中的确定,您需要最终的$expireData
数组才能拥有10个值。不要使用循环,而是使用array_pad()
将其扩展为10并用零填充。
$expireData = array_pad($expireData, 10, 0);
// turns [2,8] into [2,8,0,0,0,0,0,0,0,0]
使用外部for
外观是可疑的,因为它显然每次都执行相同的语句。那个循环可能完全不需要,你只需要它的身体。
在加载循环时,您没有看到PHP抱怨undefined index 'cnt'
这一事实表明您在开启display_errors
并且error_reporting
已启用时未开发。在开发和测试代码时,始终这样做。它可能帮助您更快地看到问题。
在您的脚本顶部:
error_reporting(E_ALL);
ini_set('display_errors', 1);