我喜欢foreach。我成功地使用了很多次。虽然我不必理解它如何或为何起作用的具体细节,但直到现在,它从未阻止我使用它与期望的结果。所以这是我的情景...
我在表单的后端有一些php,允许用户上传某些类型的文件以保存到MySQL数据库中。我知道你们中的一些人会说在DB中保存一个文件并不好,但是我们暂时把它放在一边,因为对此有很多50/50的分歧意见,并没有真正有效的理由说明它是坏的,根本没有。上传功能完美无缺。我希望显示用户放入数据库的相关文件列表中的显示表。这里奇怪的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";
}
当我在数据库中得到零结果时,我没有得到任何输出(我的&#34;否则&#34;不起作用),当我上传一个文件时,我成功获得该文件的输出正如所料。当我上传了两个文件时,我得到两行,每行回显第一个文件的细节 - 重复。没有提到第二个文件。这种模式继续用于我成功上传的更多文件。如果已经上传了20个文件,我会得到20行,所有这些都很好,整齐,告诉我有关上传的第一个文件的相同信息,连续20次。
我试过修改我的
foreach ($fRes as $value) {
语法并使用:
foreach ($fRes as $value => $key) {
但我得到了同样的结果。似乎没有任何区别。从数据库中提取的数据是一个数组(你可以看到我注释掉的var_dump($ fRes);我用来检查它)。有趣的是,当我将$ fRes [0] [fileName]更改为$ fRes [1] [fileName]时,我得到了第二个文件的名称,等等。这似乎表明由于某种原因,每个文件都在一个并行的单独数组中?为什么?我如何按预期正确地工作?
由于
答案 0 :(得分:2)
我认为您希望将$fRes[0]
更改为$value
。如果使用$fRes[0]
,每次循环迭代都会得到第一条记录。
答案 1 :(得分:0)
进入foreach循环后
foreach ($fRes as $value)
从$ value
获取循环数据答案 2 :(得分:0)
你在这里和那里都没有什么错误。要清楚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";
}
}