Verketten von Bedingungen - verstehe ich was falsch?

Klein0r

Erfahrenes Mitglied
Hallo,

ich glaube ich bin gerade wirklich zu dumm! Oder geht das ganze in PHP nicht?
Folgendes Stück Quelltext:
PHP:
		if($erg = mysql_query("SELECT id FROM tracklist_user WHERE uname = '$uname' LIMIT 1", $conn) && mysql_num_rows($erg) == 1) {
			// Benutzer existiert bereits
			$uid = mysql_fetch_object($erg)->id;
		}
		elseif ($erg_new = mysql_query("INSERT INTO tracklist_user(uname) VALUES ('$uname');", $conn) && mysql_num_rows($erg_new) == 1) {
			echo 'Eingefügt';
			exit;
		}
		else {
			echo 'Allgemeiner Fehler: #0001';
			exit;
		}
Ausgabe:
Code:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\Program Files\xampp\htdocs\main\scripts\tracklist\index.php on line 27

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\Program Files\xampp\htdocs\main\scripts\tracklist\index.php on line 31
Allgemeiner Fehler: #0001
27 und 31 sind if und elseif

For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.

So nach meinem Verständnis läuft das ganze so ab:
PHP:
if($erg = mysql_query("SELECT id FROM tracklist_user WHERE uname = '$uname' LIMIT 1", $conn) && mysql_num_rows($erg) == 1) {

Falls der Query fehl schlägt liefert mysql_query false zurück und durch das doppelte & wird die zweite Bedingunge nichtmehr ausgeführt. Das dürfte aber nur passieren falls das mySQL-Statement falsch ist.
In diesem anderen Fall ist die Bedingung richtig und in $erg steht ein gültiges mySQL-Result (egal ob mit oder ohne Ergebnis). Dann könnte ich doch mit mysql_num_rows auf $erg zugreifen, oder? Aber er liefert mir immer diese Fehlermeldungen. Wie kommt es zu stande das es da zu einem Fehler kommt?! Verstehe ich nicht ganz!

Bitte helft mir auf die Sprünge.
Bin doch nicht zu doof für die einfachsten Abfragen, was? :)

lg
 
Mal abgesehen davon das mysql_num_rows nicht für INSERT-Statements funktioniert musste ich das ganze nun anders gestalten:

PHP:
		$erg = mysql_query("SELECT id FROM tracklist_user WHERE uname = '$uname' LIMIT 1;", $conn);
		
		if($erg && mysql_num_rows($erg) == 1) {
			// Benutzer existiert bereits
			$uid = mysql_fetch_object($erg)->id;
		}
		else {
			if ($erg_new = mysql_query("INSERT INTO tracklist_user(uname) VALUES ('$uname');", $conn)) {
				echo 'Der Benutzer '.$uname.' wurde angelegt - Bitte die Seite aktualisieren';
				exit;
			}
			else {
				echo 'Allgemeiner Fehler: #0001';
				exit;
			}
		}

Ich wüsste trotzdem warum die 1. oben genannte Verkettung so nicht funktioniert und das zweite Beispiel funktioniert.

lg
 
Moin,

Das Ergebnis steht erst nach der Klausel zur Verfügung, du müsstest es so machen:
Code:
if($erg = mysql_query("SELECT id FROM tracklist_user WHERE uname = '$uname' LIMIT 1", $conn)) 
        {
            if(mysql_num_rows($erg) == 1)
              {
                // Benutzer existiert bereits
                $uid = mysql_fetch_object($erg)->id;
              }
        }
 
Keine Ahnung warum das nicht geht...
In C würde sowas doch z.B. auch gehen, oder?

PHP:
$t = 0;
if ($t = 3 && $t == 3) {
	echo 'wa';
}

Macht er aber nicht...
Versteh ich nicht aber okay - ist schade

lg
 
Du musst die Rangfolge der Operatoren berücksichtigen. Der &&-Operator hat einen höheren Rang als der =-Operator, weswegen der Ausdruck mit folgendem äquivalent ist:
PHP:
$erg = (mysql_query("…", $conn) && (mysql_num_rows($erg) == 1))
 
Das hängt irgendwie mit print() zusammen. Denn:
PHP:
var_dump(print(null));            // => int(1)
var_dump(print(null) && false));  // => int(1) ?
var_dump(1 && false);             // => bool(false)
 

Neue Beiträge

Zurück