dedlfix: scheitere an der benutzung von 'mysql_num_rows'

Beitrag lesen

echo $begrüßung;

Das Problem ist die Zeile

$result = (mysql_query($query) or die(mysql_error()));
das ist etwas zu gewagt. Der Operator "or" gibt Dir einen boolschen Wert zurück. Eine Anweisung der Form
$result = ($a or $b);
setzt $result auf TRUE (und nicht auf $a), wenn $a != 0 ist. Und TRUE ist sicher keine gültige mysql-Ressource.

Die Klammern kamen mir auch spanisch vor, hab sie aber nicht direkt als Ursache vermutet. Es ist jedoch tatsächlich so, dass durch die Klammern das Ergebnis des Ausdrucks nach boolean umgewandelt wird. Lässt man die Klammern weg bekommt man das gewünschte Ergebnis: eine Ressourcenkennung.

Etwas merkwürdig ist die Konstruktion noch aus einem anderen Grund: die Funktion die() hat keinen Rückgabewert und ist somit kein Ausdruck. "or" will aber zwei Ausdrücke auswerten.

Nein, das will es nicht in jedem Fall. Wenn das Ergebnis bereits durch Auswertung eines Operanden feststeht, dann wird der zweite nicht mehr ausgewertet. Wenn bei einem or der erste Teilausdruck bereits true ergeben hat, dann ändert der zweite am Ergebnis nichts mehr. Das gleiche gilt für and, da aber für false. Der Begriff dazu lautet Kurzschlussverfahren.

Wenn das mysql_query() also einen Wert zurückliefert, der als true angesehen wird, dann interessiert das was die Funktion die() macht oder zurückgibt nicht mehr.

Jetzt ist das natürlich

  • erstens hier egal, weil die() ggf. das Skript ohnehin beenden würde, bevor "or" ausgewertet wird
  • und zweitens auch nicht ganz richtig, weil eine Funktion ohne definierten Rückgabewert technisch gesehen dann glaube ich NULL zurückgibt, was von "or" ausgewertet werden kann, so dass es in der Praxis funktionieren würde,

Da im Gutfall nichts ausgeführt wird, ist es auch egal, ob oder was zurückgegeben würde. Doch ja, der Rückgabewert einer Funktion ohne explizites return ist null. Allerdings sind "die" und "exit" genaugenommen keine Funktionen sondern Sprachkonstrukte.

aber eine Funktion ohne definierten Rückgabewert sollte nicht als Ausdruck ausgewertet werden, sagt mir mein Sinn für PHP-Ästhetik.

Es geht bei Konstrukten dieser Art nicht (nur) um ein Ergebnis sondern um die Ausführung oder Nicht-Ausführung des zweiten Teilausdrucks. Diese Konstrukte findet man auch häufig in Shell-Scripten. Statt eines mehrzeiligen if-bedingung-then notiert man es hintereinander und nutzt die Eigenschaften das Kurzschlussverfahren.

echo "$verabschiedung $name";