2017-05-04 2 views
1

Ich bin mir nicht sicher, wie ich dieses Thema durchsuchen soll, wenn ich die richtige Terminologie verwende.PHP - Referenz-Array mehr als einmal für verschiedene Ergebnisse

Ich habe eine Tabelle mit verschiedenen Aufzeichnungen und jeder Datensatz haben eine Kategorie festgelegt. Ich möchte die Tabelle einmal abfragen und die Ergebnisse in den relevanten Bereichen auf einer Webseite ausgeben.

Was ich bisher getan habe:

$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>'; 
     } 
    } 
} 

So derjenige Abschnitt Ich mag Aufzeichnungen übereinstimmen mit der „Bild“ Kategorie und dem nächsten Abschnitt auf dem „Fahrzeug“ Abschnitt.
Mit dem obigen Code zeigt es nur Datensätze der While-Schleife, nicht die zweite Schleife. Was soll ich anders machen?

+0

Nun, ich denke, Sie können es nicht so tun, sollten Sie 2 Abfrage verwenden. Eines mit 'Kategorie wie" image "', das zweite mit 'Kategorie wie" vehicule "' – kaldoran

Antwort

2

, das ist, weil Sie Ihre Daten mit fetch_object Methode abgerufen werden.

eher, dass fetch_object Verwendung FETCH_ALL wie folgt:

$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>'; 
     } 
    } 
} 

das ist, weil fetch_ [Objekt/array/Assoc] nur eine Ergebniszeile gibt und nicht gibt alle eingestellten Daten.

zum Beispiel:

MySQLi_Result :: FETCH_ASSOC - mysqli_fetch_assoc - Liefert einen Datensatz als assoziatives Array

und während Sie über diesen Datensatz sind Iterieren, PHP unter der Haube verwendet einige Funktionen wie next & current Schleife über das Objekt m und während die next Funktion einfach den Objekt/Array-Zeiger um eins.

next - Rückt den internen Zeiger eines Arrays

am Ende Ihrer ersten Iteration, werden Sie den letzten Wert der [object/array] 's-Zeiger, so im nächsten erreichen Iteration der Zeit werden Sie nicht in der Lage sein, über das Objekt iterieren, wenn Sie reset dass Zeiger auf 0

wie folgt: Unter der Annahme,

$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

Ich habe versucht, mit fetch_assoc, wie Sie vorgeschlagen, aber erhalten mehrere Warnungen: PHP Warnung: Illegale String-Offset 'Kategorie'. Ich habe es eine Weile behoben, aber fühle mich ein wenig verloren – Stephen

+0

Sorry, vergaß meine Frage zu aktualisieren, sollten Sie stattdessen fetch_all verwenden, checkup mein update – hassan

+0

Danke für Ihre Hilfe, die es funktioniert. – Stephen

1

Der Grund dafür ist, dass die Ergebnismenge leer ist, sobald die erste While-Schleife beendet ist. Sie müssen das vollständige Ergebnis erhalten und in eine Variable eingeben.

so etwas wie

$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); 

und dann

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

von der Syntax, es scheint, dass OP mysqli api anstelle von PDO verwendet – hassan

+0

Ja, ich kann das sehen, aber der Punkt unserer Antworten ist es, ihn in die richtige Richtung zu weisen :). Außerdem würde ich jederzeit den OOP-Ansatz wählen. – Filchev

1

yo Wenn Sie MySQLi verwenden, können Sie den Zeiger mit data_seek(0) zurücksetzen.

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

Sie sollten dabei verschiedene Abfragen für jeden Abschnitt (WHERE user_id = $user_id AND category="image") in Betracht ziehen. Das Abrufen aller Felder (SELECT *) ist möglicherweise ebenfalls nicht erforderlich.

Verwandte Themen