php foreach在一种情况下没有按预期工作

时间:2015-04-05 03:10:39

标签: php foreach

我喜欢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]时,我得到了第二个文件的名称,等等。这似乎表明由于某种原因,每个文件都在一个并行的单独数组中?为什么?我如何按预期正确地工作?

由于

3 个答案:

答案 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";
}

}