2017-05-04 71 views
1

我不知道如何搜索我遇​​到的這個問題,也不知道我是否使用了正確的術語。PHP - 參考數組不止一次針對不同的結果

我有一個表與各種記錄,每個記錄有一個類別集。我想查詢一次表格並將結果輸出到網頁上的相關部分。

我迄今已完成:

$result_f1 = $db->query("SELECT * FROM files WHERE user_id = $user_id ") or die('cannot show tables'); 

... some html ... 

if($result_f1) { 
    while($row3 = $result_f1->fetch_object()) { 
     if ($row3->category == "image") { 
      echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row3->filename,'" alt="Photo"></div>'; 
     } 
    } 
} 

...more html onto next section... 

if($result_f1) { 
    while($row4 = $result_f1->fetch_object()) { 
     if ($row4->category == "vehicle") { 
      echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row4->filename,'" alt="Photo"></div>'; 
     } 
    } 
} 

所以一個部分,我想用「圖像」類和「車輛」一節下一節匹配記錄。
使用上面的代碼,它只顯示while循環的記錄,而不是第二個循環。我應該做什麼不同?

+0

嗯,我認爲你不能這樣做,你應該使用2查詢。類似於「image」的類別'',類似於「vehicule」的第二類'' – kaldoran

回答

2

那是因爲你正在使用fetch_object方法獲取數據。

寧可fetch_object使用fetch_all如下:

$result_f1 = $db->query("SELECT * FROM files WHERE user_id = $user_id ") or die('cannot show tables'); 

$dataSet = $result_f1->fetch_all(MYSQLI_ASSOC); 

if($dataSet) { 
    foreach($dataSet as $row3) { 
     if ($row3['category'] == "image") { 
      echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row3['filename'],'" alt="Photo"></div>'; 
     } 
    } 
} 

...more html onto next section... 

if($dataSet) { 
    foreach($dataSet as $row4) { 
     if ($row4['category'] == "vehicle") { 
      echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row4['filename'],'" alt="Photo"></div>'; 
     } 
    } 
} 

這是因爲fetch_ [對象/陣列/ ASSOC]僅返回一個結果行並且不會返回所有數據集。

例如:

mysqli_result :: FETCH_ASSOC - mysqli_fetch_assoc - 獲取結果列 作爲關聯數組

和當你在遍歷該數據集,PHP罩蓋下方使用一些函數如next & current來遍歷該對象m,而next函數只是將對象/數組指針前進1。

下 - 在第一個迭代結束推進陣列

的內部指針,你將到達[對象/數組]的最後一個值的指針,所以在下一迭代時間,你將無法遍歷該對象,除非你reset該指針爲0

如下:

$result_f1 = $db->query("SELECT * FROM files WHERE user_id = $user_id ") or die('cannot show tables'); 

... some html ... 

if($result_f1) { 
    while($row3 = $result_f1->fetch_object()) { 
     if ($row3->category == "image") { 
      echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row3->filename,'" alt="Photo"></div>'; 
     } 
    } 
} 

...more html onto next section... 

$result_f1->data_seek(0); 

if($result_f1) { 
    while($row4 = $result_f1->fetch_object()) { 
     if ($row4->category == "vehicle") { 
      echo '<div class="col-sm-6"><img class="img-responsive" src="/site/data/' .$user_id. '/',$row4->filename,'" alt="Photo"></div>'; 
     } 
    } 
} 
+0

我試着按照你的建議使用fetch_assoc,但得到幾個警告: PHP警告:非法的字符串偏移量'category'。 我一直在排除故障,但感覺有點失落 – Stephen

+0

對不起,忘了更新我的問題,你應該使用fetch_all代替,結帳我的更新 – hassan

+0

感謝您的幫助,使它工作。 – Stephen

1

發生這種情況的原因是,因爲一旦第一個while循環完成,結果集爲空。你需要得到完整的結果集並放入一個變量。

$sth = $dbh->prepare("SELECT name, colour FROM fruit"); 
$sth->execute(); 

/* Fetch all of the values of the first column */ 
$results = $sth->fetchAll(PDO::FETCH_COLUMN, 0); 

然後

foreach (results as key => value){ 
// use hte results 
} 
+0

從語法上來看,似乎OP是使用mysqli API而不是PDO – hassan

+0

是的,我可以看到,但我們的答案的重點是指出他在正確的方向:)。我也隨時採用面向對象方法。 – Filchev

1

假設喲您正在使用MySQLi,您可以使用data_seek(0)來重置指針。

http://php.net/manual/en/mysqli-result.data-seek.php

您應該考慮每個部分(WHERE user_id = $user_id AND category="image")做不同的查詢。並且獲取所有字段(SELECT *)也可能不是必需的。