PHP Erkennen eines leere assoz. Arrays

Überkinger

Lieutenant
Registriert
Juli 2010
Beiträge
600
Hallo,

ich lese eine Datenbanktabelle aus, die leer ist und zwar mit:

PHP:
$select_last = "SELECT * From ext ORDER BY id DESC LIMIT 1";
$result_last = mysql_query($select_last,$link_db) OR die('Datenbankfehler. Kein Datensatz vorhanden' . mysql_error());

while ($array = mysql_fetch_array($result_last,MYSQL_ASSOC)) {
       $last_id = $array["lastid"];
}

Die Datenbank ist jetzt noch leer, so dass natürlich auch das Array leer ist. Ich prüfe das array ob es leer ist mit:

PHP:
if(empty($array)) {
     echo "leeres Array entdeckt";
}
else {
     echo "Array vorhanden";
}

Jetzt erhalte ich überhaupt keine Meldung. Ich komme einfach nicht weiter... Wie gehe komme ich weiter?

Ziel ist es, dass wenn noch kein array vorhanden ist, einige Variablen auf einen Wert gesetzt werden müssen, damit das Script durchläuft.
 
Hancock schrieb:
Keine Meldung?
Dir sollte außerdem bewusst sein, dass mysql_fetch_array einfach false zurückgibt, falls das Ergebnis leer sein sollte.

Ja, ich habe auch schon das array auf == FLASE geprüft, gibt aber keine Meldung aus.
 
Ich versteh die Logik nicht ganz.

Am Ende der Schleife ist das Ding immer false - egal ob die DB leer oder voll ist... Es gibt doch auch die Möglichkeit abzufragen, wieviele Zeilen zurückgeliefert wurden, eventuell wäre das ein besserer Weg... ansonsten in der Schleife einfach nen Flag umsetzen, dass es Werte gibt...

Und in solchen Fällen gib doch mal ne Meldung direkt vor dem IF aus, nur um zu sehen, ob der Code überhaupt erreicht wird...
 
1668mib schrieb:
Ich versteh die Logik nicht ganz.

Am Ende der Schleife ist das Ding immer false - egal ob die DB leer oder voll ist... Es gibt doch auch die Möglichkeit abzufragen, wieviele Zeilen zurückgeliefert wurden, eventuell wäre das ein besserer Weg.

Ein echo $array vor dem IF liefert auch nichts zurück.

Das ist ein Ansatz den ich gerade verfolge:

if (mysql_num_rows($result_last) == 0) {
$a = "1";
$b = "2";
usw...
 
Ich habe gesagt eine Meldung... irgendwas, was du auch sehen musst ...
echo "Hier sind wir"

oder sowas ...
 
1668mib schrieb:
Ich habe gesagt eine Meldung... irgendwas, was du auch sehen musst ...
echo "Hier sind wir"

oder sowas ...

while ($array = mysql_fetch_array($result_last,MYSQL_ASSOC)) {
echo "test";
}

Gibt nichts zurück, so dass ich annahme, dass auch das array nicht angelegt wurde. Jetzt erstmal googln, wie ich das prüfe. :-)
 
Versuch's mal damit:
PHP:
error_reporting(E_ALL);
echo 'Schleife durch Array';
while ($array = mysql_fetch_array($result_last,MYSQL_ASSOC)) {
  var_dump($array);
}
echo 'Ende Schleife durch Array';
Die erste Zeile sollte am besten als erstes ins Skript. Bekommst du immer noch keine Ausgabe, liegt der Fehler schon vorher, vermutlich beim Abfragen der Daten aus der Datenbank.
 
Wie Darlis zeigt, ist es immer auch sinnvoll, unmittelbar vor einer Problemstelle eine sichere Ausgabe zu machen, um zu sehen, ob die Stelle überhaupt erreicht wird.

$dataBaseEmpty = true;
while ($array = mysql_fetch_array($result_last,MYSQL_ASSOC)) {
$dataBaseEmpty = false;
}

if ($dataBaseEmpty) {
...
}
 
PHP:
    $select_last = "SELECT * From ext ORDER BY id DESC LIMIT 1";
    $result_last = mysql_query($select_last,$link_db) OR die('Datenbankfehler. Kein Datensatz vorhanden' . mysql_error());
     
    if ($array = mysql_fetch_array($result_last,MYSQL_ASSOC)) {
     $last_id = $array["lastid"];
    } else {
      echo 'Array ist leer';
    }

So einfach ;) Wenn du aber keine deiner beiden Meldungen bekommst, solltest du deinen Code vielleicht mal mit ein paar echos dekorieren und schauen, ob er überhaupt in die richtigen Programmteile kommt. Vielleicht sind auch errors abgeschaltet so dass deine SQL Abfrage einen Error wirft und das Program beendet wird, du aber nichts siehst. Teste das am Besten mal mit einer absichtlich falschen Abfrage auf eine nicht existente Tabelle.
 
@mambokurt: Stimmt, weil es ja nen Limit von 1 gibt... das sollte an der Stelle aber auch erwähnt sein.
 
1668mib schrieb:
Wie Darlis zeigt, ist es immer auch sinnvoll, unmittelbar vor einer Problemstelle eine sichere Ausgabe zu machen, um zu sehen, ob die Stelle überhaupt erreicht wird.

$dataBaseEmpty = true;
while ($array = mysql_fetch_array($result_last,MYSQL_ASSOC)) {
$dataBaseEmpty = false;
}

if ($dataBaseEmpty) {
...
}

Danke schön.

In der Tat, $dataBaseEmpty bleibt auf true stehen. MYSQL_ASSOC liefert ebenfalls ein FALSE an $array aus.

Da dieser Fall nur einmal auftritt, nämlich nach Anlegen der DB und Erstauftuf des Scriptes, behelfe ich mir mit:

if (mysql_num_rows($result_lastprog) == 0)) {
// Benötigte Variablen mit Mindestwerten setzen;

$lastid = 0;
$zweck ="";
}
 
ist doch ganz einfach.. ein leeres array hat einen count von 0
PHP:
    if(count($array) > 0) {
    echo 'leeres Array entdeckt';
    }
    else {
    echo 'Array vorhanden';
    }
 
@komann83: Dein Code ist in diesem Zusammenhang falsch. mysql_fetch_array kann FALSE zurück liefern und der Rückgabewert von count(FALSE) ist 1!

is_array() wäre der bessere Ansatz. Denn entweder gibt es ein Array mit der ausgelesenen Zeile oder gar keines.
 
Wurde denn überhaupt überprüft ob RESULT nicht FALSE ist (und somit ein Fehler bei der Query vorliegt, welchen man per mysql_error() auslesen kann)?
 
Hancock schrieb:
OK, aber nur, wenn das Array leer ist (aber wer macht eine Abfrage ohne eine einzige Spalte^^?).

Jein, die meisten Datenbanktreiber geben direkt false zurück wenn kein Ergebnis vorliegt (muß kein Fehler sein, wenn ich auf LIKE 'Mueller' abprüfe aber nur Schulzes in der Tabelle habe, krieg ich auch keine Sätze). Schöner wärs ja, wenn man ein leeres assoziatives Array mit den jeweiligen Spaltennamen als Schlüssel kriegen würde, aber das hat sich irgendwie nicht eingebürgert. $erg ist in dem Fall also kein leeres Array sondern wirklich ein Boolean mit false als Wert.

EDIT: das nehm ich zurück, wär ziemlich mühsam jedesmal prüfen zu müssen, ob das Ergebnis wirklich Werte enthält. Da ist false schon nicht die schlechteste Lösung :D
 
Zuletzt bearbeitet von einem Moderator:
Außerdem: Wie soll ein leeres assoziatives Array aussehen?

Es kann ja sein, dass ich nur eine Spalte abfrage, und der abfragte Wert in der Spalte leer ist und es gibt genau einen Treffer. Sowas könnte man nicht vernünftig von einem von dir beschriebenen leeren Array unterscheiden.

An sich wäre es halt schön, wenn das assoziative Array manchmal wie ein Objekt wäre...
dass man sowas machen könnte
$result = mydatabasequeryzeugs
if ($result->isEmpty()) {
.. keine Treffer
} else {
...
}

Wobei es AFAIK ja auch Datenbank-Bibliotheken gibt, die zumindest sowas in die Richtung ermöglichen...
 
Zurück
Oben