MH: MYSQL Query leer

Moin zusammen, Ich arbeite gerade an einer Kommentarfunktion für eine Website. Die Kommentare werden in einer andere Tabelle gespeichert wie die Artikel. Ich hab als eine Abfrage dafür geschrieben, welche die relevanten Informationen aus der kommentar tabelle holt aber nur wenn die ArtikelID mit der des Artikel übereinstimmt. Als ich die Abfrage im phpMyAdmin ausprobiert haben, hat alles funktioniert und ich haab die zwei Testdatensätze angezeigt bekommen. Wenn ich die Abfrage aber im PHP-Script habe klappt das nicht und ich bekomme eine leere Abfrage zurück. Hat jemand eine Idee woran das liegt?

Das ist die Abfrage und das Speicher in dem Array:

$query = sprintf(
	"SELECT kommentare.ID, kommentare.Autor, kommentare.Inhalt, kommentare.Datum, kommentare.ArtikelID, artikel.id AS `Artikel ID`, artikel.titel AS `Artikel Titel`
	FROM kommentare, artikel
	WHERE kommentare.ArtikelID = artikel.id AND artikel.titel = '%s'",
	$mysqli->real_escape_string('Test')
);
$abf = $mysqli->query($query);

$kommentare = array();
while($data = $abf->fetch_array(MYSQLI_ASSOC)){
	$kommentare[] = array(
		'ID' => $data['ID'],
		'Autor' => $data['Autor'],
		'Inhalt' => $data['Inhalt'],
		'Datum' => $data['Datum']
	);
}

Das ist dann das abrufen aus dem Array:

<?php	if(count($data['kommentare']) >= 1):
	foreach($data['kommentare'] as $kommentar): ?>
		<div class="comment">
<?php echo $kommentar['Autor'];	?> schrieb um <?php echo $kommentar['Datum'];	?>:
			<p>
				<?php echo $kommentar['Inhalt'];	?>
			</p>
		</div>
<?php 		endforeach;
	else:	?>
		<p class="info">
			Es sind keine Kommentare vorhanden
		</p>
<?php 	endif;	?>

Gruß Matthias

  1. Hey,

    while($data = $abf->fetch_array(MYSQLI_ASSOC)){
    

    Ist das einzige was ich grad sehe und komisch aussieht, wie wärs direkt mit $abf->fetch_assoc().

    Edit: Dann sparst du dir auch die Zuweisung der Werte zu den Keys, was du im Query schon machst/machen kannst.

    Gruß
    Jo

    1. Tach!

      while($data = $abf->fetch_array(MYSQLI_ASSOC)){
      

      Ist das einzige was ich grad sehe und komisch aussieht, wie wärs direkt mit $abf->fetch_assoc().

      Zitat Handbuch: "By using the MYSQLI_ASSOC constant this function will behave identically to the mysqli_fetch_assoc(),"

      Es bleibt sich also gleich, was man da nimmt. fetch_assoc() ist nur kürzer zu notieren.

      Edit: Dann sparst du dir auch die Zuweisung der Werte zu den Keys, was du im Query schon machst/machen kannst.

      Das kann man sich in beiden Fällen sparen. Das ...

      while($data = $abf->fetch_array(MYSQLI_ASSOC)){
      	$kommentare[] = $data;
      }
      

      ... ist identisch zu dem ...

      while($data = $abf->fetch_assoc()){
      	$kommentare[] = $data;
      }
      

      ... und ergibt dasselbe Ergebnis wie der Originalcode, ist nur kürzer und damit weniger anfällig für eventuelle Tippfehler.

      dedlfix.

    2. fetch_array(MYSQLI_ASSOC) und fetch_assoc liefern das gleiche Ergebnis. Ich kenne den Source-Code nicht, würde aber vermuten, dass unter der Haube fetch_assoc eine Umleitung auf fetch_array(MYSQLI_ASSOC) ist.

      Das Kopieren des $data Array in ein neues Array kann man in beiden Fällen lassen. Das hier geht mit beidem:

      while($data = $abf->fetch_assoc()) {
         $kommentare[] = $data;
      }
      

      Oder noch kürzer:

      while($kommentare[] = $abf->fetch_assoc()) { }
      

      Rolf

      1. Tach!

        Oder noch kürzer:

        while($kommentare[] = $abf->fetch_assoc()) { }
        

        Nö, das ergibt ein false als letztes Array-Element von $kommentare. Wenn kurz dann

        $kommentare = $abf->fetch_all(MYSQLI_ASSOC);
        

        Aber auch nur nach vorhergehender Prüfung, dass mysqli::query() ein mysql_result-Objekt geliefert hat und nicht false.

        dedlfix.

  2. Tach!

    Als ich die Abfrage im phpMyAdmin ausprobiert haben, hat alles funktioniert und ich haab die zwei Testdatensätze angezeigt bekommen. Wenn ich die Abfrage aber im PHP-Script habe klappt das nicht und ich bekomme eine leere Abfrage zurück. Hat jemand eine Idee woran das liegt?

    Ich hab als Idee nur, dass nun das Debugging anfängt. Schau nach, ob alle Ergebnisse von Funktionsaufrufen und Variablenzuweisungen das Ergebnis bringt, das du erwartest. var_dump() eignet sich dafür am besten. Stell das error_reporting auf E_ALL und display_errors auf on, um alle Fehlermeldungen und Hinweise zu sehen.

    Wenn die Abfrage im phpMyAdmin läuft und hier nicht, dann lass dir das generierte Statement anzeigen und kopier es in den phpMyAdmin. Es geht nicht, dass dasselbe Stateent hier läuft und da nicht, es sei denn, es ist ein Berechtigungsproblem. Dann gibt es aber auch eine Fehlermeldung. Apropos Fehlermeldung. Dein Script hat keine Prüfungen auf fehlerhaft ausgeführte mysql_*()-Funktionen drin. Im Fehlerfall ist der Rückgabewert nicht geeignet, nachfolgende Funktionen damit aufzurufen.

    dedlfix.

    1. Moin,
      Nachdem ich mit var_dump() die Variablen mir ausgegeben lassen habe, habe ich rausgefunden das das an $data lag. Das Array $kommentare hatte die Daten aus der Tabelle richtig abgerufen. var_dump($data) zeigte mir NULL an. Ich hab das jetzt rausgeschmissen und jetzt funktioniert es. Danke
      Matthias

      1. Tach!

        Nachdem ich mit var_dump() die Variablen mir ausgegeben lassen habe, habe ich rausgefunden das das an $data lag. Das Array $kommentare hatte die Daten aus der Tabelle richtig abgerufen. var_dump($data) zeigte mir NULL an. Ich hab das jetzt rausgeschmissen und jetzt funktioniert es.

        Jetzt wo du es sagst ... die Variable $data ist im ersten Teil eine Hilfsvariable, die nur innerhalb der while-Schleife einen sinnvollen Inhalt hat. Im zweiten Teil greifst du dann auch auf $data['kommentare'] zu, und es ist da nicht ersichtlich, wo dieses Array herkommt. Aber vermutlich meintest du $kommentare stattdessen.

        Daraus folgen zwei Punkte: Benennung von Dingen ist eines der schwierigsten Themen beim Programmieren. $data ist sehr allgemein gehalten und kann alles und nichts enthalten. In der while-Schleife wäre der Name $row (oder $zeile, wenn es unbedingt deutsch sein muss) angebrachter, um zu zeigen, dass es nur eine Zeile aus der Ergebnismenge ist. Das sollte dann im weiteren Verlauf auffallen, wenn du die Gesamtheit meinst, aber die Variable nur $row heißt.

        Der zweite Punkt ist, dass PHP dich auf das vermutlich nicht vorhandene $data['kommentare'] hingewiesen hätte, wenn du das error_reporting wie erwähnt einstellst. E_ALL ist eine sehr hilfreiche Einstellung beim Entwickeln. Für den Produktivbetrieb hingegen sollte man display_errors ausschalten, damit nicht unnötig Interna ausgegeben werden.

        dedlfix.