2015-04-05 112 views
0

我喜欢foreach。我已经使用过很多次,成功了。虽然我不一定了解它如何或为什么起作用的具体细节,但直到现在,它从来没有阻止我使用它,并取得预期的结果。所以这里是我的场景...PHP foreach不能按预期在一种情况下工作

我有一个PHP的后端表单,允许用户上传某些类型的文件保存到MySQL数据库。我知道你们中的一些人会说在一个数据库中保存一个文件并不好,但是现在就把它放在一边,因为对此有非常多的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"; 
} 

当我有零导致DB我没有得到任何输出(我的“其他人”不工作),当我有一个文件上传我顺利拿到输出如预期的那样。当我有两个文件上传时,我得到两行,每个都回显第一个文件的细节 - 重复。没有提到第二个文件出现。这种模式对我已成功上传的更多文件持续进行。如果有20个文件已经上传,我会得到20行很好的整理,告诉我有关上传的第一个文件的相同信息,连续20次。

我试图改变我的

foreach ($fRes as $value) { 

语法和使用:

foreach ($fRes as $value => $key) { 

,但我得到了相同的结果。似乎没有任何区别。从数据库中提取的数据是一个数组(你可以看到我的var_dump($ fRes);我用来检查它)。有趣的是,当我将$ fRes [0] [fileName]更改为$ fRes [1] [fileName]时,我得到第二个文件的名称等。这似乎表明,由于某些原因,每个文件都处于并行分离数组?为什么?我如何按预期正确工作?

感谢

回答

2

我相信你想改变$fRes[0]$value。如果您使用$fRes[0],则每次循环迭代都会获得第一条记录。

+0

谢谢,正确的,并保存我实施一个i ++计数器来取代我的[0]。 :) – Cassandra 2015-04-05 03:28:04

0

一旦你foreach循环内

foreach ($fRes as $value) 

你从$值的循环数据

0

您在这里有一点差错和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"; 
} 

} 
相关问题