php foreach 在一种情况下没有按预期工作
php foreach not working as expected in one situation
我喜欢foreach。我用过很多次,很成功。虽然我不一定了解它如何工作或为什么工作的确切细节,但直到现在,它从未阻止我使用它来获得预期的结果。所以这是我的场景...
我在表单后端有一些 php,允许用户上传某些类型的文件以保存到 MySQL 数据库中。我知道你们中的一些人会说将文件保存在数据库中不好,但让我们暂时把它放在一边,因为对此有 50/50 的分歧意见并且没有真正有效的理由说明它不好,根本.上传功能完美运行。我希望显示 table 显示用户已放入数据库的相关文件列表。奇怪的 foreach 麻烦就在这里开始了。这是我的代码:
try {
$stmt = $conn->prepare("SELECT * FROM $database.appFiles WHERE appID = :appid AND uaID = :uaid AND applicationKey = :applicationkey");
$stmt->bindParam(':appid', $appID, PDO::PARAM_INT, 11);
$stmt->bindParam(':uaid', $uaID, PDO::PARAM_INT, 11);
$stmt->bindParam(':applicationkey', $applicationKey, PDO::PARAM_STR, 8);
$stmt->execute();
$fRes = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) { catchMySQLerror($e->getMessage()); }
if(count($fRes > "0")) {
//var_dump($fRes);
foreach ($fRes as $value) {
echo " </tr>\n";
echo " <tr style=\"background: ".cycleColours()." border-bottom: 1px dotted #c0c0c0;\">\n";
echo " <td style=\"padding: 5px;\">".$fRes[0][fileName]."</td>\n";
echo " <td style=\"padding: 5px;\">".$fRes[0][fileMime]."</td>\n";
echo " <td style=\"padding: 5px;\">".$fRes[0][fileSize]."</td>\n";
echo " <td style=\"padding: 5px;\">".uts2date($fRes[0][dateUploaded])."</td>\n";
echo " <td style=\"padding: 5px;\">Del</td>\n";
}
} else {
echo " </tr>\n";
echo " <tr style=\"border-bottom: 1px dotted #c0c0c0;\">\n";
echo " <td class=\"center\" style=\"padding: 5px;\" colspan=\"5\"><i>No files have been uploaded for this application yet</i></td>\n";
}
当我在数据库中的结果为零时,我没有得到任何输出(我的 "else" 不工作),当我上传了一个文件时,我成功地获得了该文件的预期输出。当我上传两个文件时,我得到两行,每行都显示第一个文件的详细信息 - 重复。没有提到第二个文件。这种模式适用于我成功上传的更多文件。如果已经上传了 20 个文件,我会得到 20 行整齐的信息,告诉我关于第一个上传文件的相同信息,连续 20 次。
我试过修改我的
foreach ($fRes as $value) {
语法和使用:
foreach ($fRes as $value => $key) {
但我得到了相同的结果。似乎完全没有区别。从数据库中提取的数据是一个数组(你可以看到我注释掉的 var_dump($fRes); 我曾经检查过它)。有趣的是,当我将 $fRes[0][fileName] 更改为 $fRes[1][fileName] 时,我得到了第二个文件的名称,等等。这似乎表明由于某种原因每个文件都在一个并行的单独数组中?为什么?我该如何使它按预期正常工作?
谢谢
我相信您想将 $fRes[0]
更改为 $value
。如果您使用 $fRes[0]
,您将始终获得每次循环迭代的第一条记录。
进入 foreach 循环后
foreach ($fRes as $value)
您从 $value
获取循环数据
你这里没有什么错误 there.To 清楚 count($fRes > "0")
不知道它是如何让你到达 if condition
它应该像这样 count($fRes) > 0
或 !empty($fRes)
。
// its not count($fRes > "0")
// $fRes[0] is getting the first result array so change it to $value
if(count($fRes) > 0) {
//var_dump($fRes);
foreach ($fRes as $value) {
echo " </tr>\n";
echo " <tr style=\"background: ".cycleColours()." border-bottom: 1px dotted #c0c0c0;\">\n";
echo " <td style=\"padding: 5px;\">".$value['fileName']."</td>\n";
echo " <td style=\"padding: 5px;\">".$value['fileMime']."</td>\n";
echo " <td style=\"padding: 5px;\">".$value['fileSize']."</td>\n";
echo " <td style=\"padding: 5px;\">".uts2date($value['dateUploaded'])."</td>\n";
echo " <td style=\"padding: 5px;\">Del</td>\n";
}
}
我喜欢foreach。我用过很多次,很成功。虽然我不一定了解它如何工作或为什么工作的确切细节,但直到现在,它从未阻止我使用它来获得预期的结果。所以这是我的场景...
我在表单后端有一些 php,允许用户上传某些类型的文件以保存到 MySQL 数据库中。我知道你们中的一些人会说将文件保存在数据库中不好,但让我们暂时把它放在一边,因为对此有 50/50 的分歧意见并且没有真正有效的理由说明它不好,根本.上传功能完美运行。我希望显示 table 显示用户已放入数据库的相关文件列表。奇怪的 foreach 麻烦就在这里开始了。这是我的代码:
try {
$stmt = $conn->prepare("SELECT * FROM $database.appFiles WHERE appID = :appid AND uaID = :uaid AND applicationKey = :applicationkey");
$stmt->bindParam(':appid', $appID, PDO::PARAM_INT, 11);
$stmt->bindParam(':uaid', $uaID, PDO::PARAM_INT, 11);
$stmt->bindParam(':applicationkey', $applicationKey, PDO::PARAM_STR, 8);
$stmt->execute();
$fRes = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) { catchMySQLerror($e->getMessage()); }
if(count($fRes > "0")) {
//var_dump($fRes);
foreach ($fRes as $value) {
echo " </tr>\n";
echo " <tr style=\"background: ".cycleColours()." border-bottom: 1px dotted #c0c0c0;\">\n";
echo " <td style=\"padding: 5px;\">".$fRes[0][fileName]."</td>\n";
echo " <td style=\"padding: 5px;\">".$fRes[0][fileMime]."</td>\n";
echo " <td style=\"padding: 5px;\">".$fRes[0][fileSize]."</td>\n";
echo " <td style=\"padding: 5px;\">".uts2date($fRes[0][dateUploaded])."</td>\n";
echo " <td style=\"padding: 5px;\">Del</td>\n";
}
} else {
echo " </tr>\n";
echo " <tr style=\"border-bottom: 1px dotted #c0c0c0;\">\n";
echo " <td class=\"center\" style=\"padding: 5px;\" colspan=\"5\"><i>No files have been uploaded for this application yet</i></td>\n";
}
当我在数据库中的结果为零时,我没有得到任何输出(我的 "else" 不工作),当我上传了一个文件时,我成功地获得了该文件的预期输出。当我上传两个文件时,我得到两行,每行都显示第一个文件的详细信息 - 重复。没有提到第二个文件。这种模式适用于我成功上传的更多文件。如果已经上传了 20 个文件,我会得到 20 行整齐的信息,告诉我关于第一个上传文件的相同信息,连续 20 次。
我试过修改我的
foreach ($fRes as $value) {
语法和使用:
foreach ($fRes as $value => $key) {
但我得到了相同的结果。似乎完全没有区别。从数据库中提取的数据是一个数组(你可以看到我注释掉的 var_dump($fRes); 我曾经检查过它)。有趣的是,当我将 $fRes[0][fileName] 更改为 $fRes[1][fileName] 时,我得到了第二个文件的名称,等等。这似乎表明由于某种原因每个文件都在一个并行的单独数组中?为什么?我该如何使它按预期正常工作?
谢谢
我相信您想将 $fRes[0]
更改为 $value
。如果您使用 $fRes[0]
,您将始终获得每次循环迭代的第一条记录。
进入 foreach 循环后
foreach ($fRes as $value)
您从 $value
获取循环数据你这里没有什么错误 there.To 清楚 count($fRes > "0")
不知道它是如何让你到达 if condition
它应该像这样 count($fRes) > 0
或 !empty($fRes)
。
// its not count($fRes > "0")
// $fRes[0] is getting the first result array so change it to $value
if(count($fRes) > 0) {
//var_dump($fRes);
foreach ($fRes as $value) {
echo " </tr>\n";
echo " <tr style=\"background: ".cycleColours()." border-bottom: 1px dotted #c0c0c0;\">\n";
echo " <td style=\"padding: 5px;\">".$value['fileName']."</td>\n";
echo " <td style=\"padding: 5px;\">".$value['fileMime']."</td>\n";
echo " <td style=\"padding: 5px;\">".$value['fileSize']."</td>\n";
echo " <td style=\"padding: 5px;\">".uts2date($value['dateUploaded'])."</td>\n";
echo " <td style=\"padding: 5px;\">Del</td>\n";
}
}