query array gibt leeren, überflüssigen schlüssel aus

Neurodeamon

Erfahrenes Mitglied
Erstaunlicherweise gibt mein Query eine leeren überflüssigen key aus.
Weiß jemand wie ich das verhindern kann. Ich stehe grad auf dem schlauch...
In der Datenbank sind in diesem Beispiel nur 2 Einträge.
mysql_num_rows gibt auch nur "2" aus.
Wieso bekomme ich dann nicht nur 2 rows ausgegeben? :-)

PHP:
$query = $connect->db_mysql_query_assoc("SELECT * FROM menu ORDER BY `order` DESC");

Code:
Array
(
    [0] => Array
        (
            [menuid] => 1
            [order] => 0
            [title] => titel
            [link] => index.php
            [description] => titel
        )

    [1] => Array
        (
            [menuid] => 2
            [order] => 1
            [title] => blubb
            [link] => index.php
            [description] => blubb
        )

    [2] => 
)
 
Zuletzt bearbeitet:
Benutzt du evtl. eine [phpf]for[/phpf]-Schleife beim Auslesen und dabei als Indikator die Anzahl von num_rows?
 
Noch einmal genau:

Es ist die pure Ausgabe von mysql_fetch_array() die den array key 2 mit im array speichert (also row 3 - das aber nicht existiert). Das alles bereits bevor ich es verarbeite.
Natürlich könnte ich jetzt noch beim array abarbeiten den letzten eintrag ignorieren, aber mich stört das der php befehl sich so verhält und überhaupt einen leeren eintrag generiert.
 
Ja, aber [phpf]mysql_fetch_assoc[/phpf] liest von sich aus nur einen Eintrag aus, sprich du wirst dort eine Art von Schleife benutzen um alles in Array zu packen und dann zurückzugeben... Wie sieht diese Konstruktion aus?
 
Noch einmal genau:

Es ist die pure Ausgabe von mysql_fetch_array() die den array key 2 mit im array speichert (also row 3 - das aber nicht existiert). Das alles bereits bevor ich es verarbeite.
[phpf]mysql_fetch_array[/phpf] gibt nur eine einzige Ergebniszeile zurück, also ist das schon mal nicht die "pure Ausgabe". Das zurückgegebene Array hast du vermutlich selbst erstellt. Da genau dort der Fehler sein wird, können wir dir nur helfen, wenn du einfach den Quellcode dieser Methode rausrückst.

Grüße, Matthias

Edit: Alternativ könntest du dir auch den Rückgabewert mal per [phpf]var_dump[/phpf] ausgeben lassen. Ich vermute, dass dann rauskommt, dass am Index 2 im Array ein bool(false) steht (nicht ganz zufällig der Rückgabewert von [phpf]mysql_fetch_array[/phpf], wenn es keine weiteren Ergebniszeilen mehr zu holen gibt).
 
Zuletzt bearbeitet:
Ich sag doch ich steh' auf dem Schlauch, sorry :-)

Dies ist die entsprechende Methode in der Klasse:
PHP:
function db_mysql_query_array($db_query){
		if ($this->db_cid){
			$this->query = mysql_query($db_query,$this->db_cid);
			while($row[] = mysql_fetch_assoc($this->query)){};
				$this->resnum = mysql_num_rows($this->query);
				$this->result = $row;
				if ($this->query == false){echo mysql_errno() . ": " . mysql_error() . "\n";}
		}
		return $this->resnum;		
		return $this->result;
        $this->db_mysql_close();

Diese Klasse verwende ich eigentlich immer und bisher hatte ich dieses Problem nicht. Soweit in der PHP Doku ersichtlich ist dies eine der üblichen Varianten die Tabellenzeilen in ein Array zu schreiben.
System: Linux mit Apache 2.2.11, MySQL 5.1.30, PHP 5.2.8
 
Ich sag doch ich steh' auf dem Schlauch, sorry :-)
Macht nichts, dafür sind wir schließlich da :)

Dies ist die entsprechende Methode in der Klasse:
PHP:
function db_mysql_query_array($db_query){
		if ($this->db_cid){
			$this->query = mysql_query($db_query,$this->db_cid);
			while($row[] = mysql_fetch_assoc($this->query)){};
				$this->resnum = mysql_num_rows($this->query);
				$this->result = $row;
				if ($this->query == false){echo mysql_errno() . ": " . mysql_error() . "\n";}
		}
		return $this->resnum;		
		return $this->result;
        $this->db_mysql_close();
Du hängst hier das Ergebnis von [phpf]mysql_fetch_assoc[/phpf] zuerst an das Array $row an und überprüfst danach ob false zurückgegeben wurde. Richtig wäre z.B.:
PHP:
while ($r = mysql_fetch_assoc($this->query)) $row[] = $r;

Abgesehen davon hast du unerreichbaren Code (alles nach dem ersten return) in der Methode, was etwas komisch aussieht.

Diese Klasse verwende ich eigentlich immer und bisher hatte ich dieses Problem nicht.
Kann ich mir ehrlich gesagt nicht vorstellen…

Grüße, Matthias
 
Danke Matthias,
das war definitiv mein Lattenzaun der mir vor der Stirn klebte. Dein Code ist in der Tat genau meine Problemlösung. Eigentlich hätte ich da selbst drauf kommen müssen :-)
Nur wenn true - zuweisen....

Abgesehen davon hast du unerreichbaren Code (alles nach dem ersten return) in der Methode, was etwas komisch aussieht.

Ja, bissl unordentlich, habe zu viel getestet und vergessen einige Zeilen zu entfernen :-)

P.S.: Ich habe wirklich immer so abgefragt, weil in der PHP Doku folgendes Beispiel steht:
PHP:
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
    printf ("ID: %s  Name: %s", $row[0], $row["name"]);
}
 
Zuletzt bearbeitet:
Zurück