MySQLi - num_rows = 0. Warum?

Trash

Erfahrenes Mitglied
moin,
ich probiere mich gerade an MySQLi und habe 2 Fragen. Die erste ist, warum ergibt folgendes Statement bei $ergebnis->num_rows = 0, obwohl ein Ergebnis in der while-Schleife ausgegeben wird?

PHP:
	$db = @new mysqli(_SERVERROOT, _DBUSER, _DBPASS, _DBNAME);
	
	if (mysqli_connect_errno() == 0) {
	$sql = "SELECT `email` FROM `st_users` WHERE `email` = ?";
	$ergebnis = $db->prepare($sql);
	$ergebnis->bind_param('s',$this->username);
	$ergebnis->execute();
	$ergebnis->bind_result($email);
	echo	$ergebnis->num_rows;
	while ($ergebnis->fetch()) {
 	echo "ergebnis" . $email;
 	}
	}

Und kann ich im Prinzip ALLES in meiner Select-Abfrage durch bind_param beeinflussen? Also wäre folgender Fall möglich?

PHP:
	$db = @new mysqli(_SERVERROOT, _DBUSER, _DBPASS, _DBNAME);
	
	if (mysqli_connect_errno() == 0) {
	$sql = "SELECT `?` FROM `?` WHERE `email` = ?";
	$ergebnis = $db->prepare($sql);
	$ergebnis->bind_param('sss', $dbfield, _USERS, $this->username);
	$ergebnis->execute();
 	}
	}

Danke!

Edit:
Was mir eben aufgefallen ist:
mysqli_errno($db) gibt mir den Error-Code der letzten MYSQL-Anweisung zurück. Als ich das mit $db->mysql_errno probiert habe, ging es nicht. Wie kann das denn sein? Evtl. ist das das gleiche Problem wie bei $ergebnis->num_rows ?
 
Zuletzt bearbeitet:
Was num_rows angeht, musst du das Ergebnis erst buffern mit der Methode store_result(). Andernfalls kannst du erst in der Schleife, also während der ersten Iteration darauf zugreifen.

Die MySQLi Klasse gibt nur Fehler der Verbindung zurück, die Fehler eines Queries musst du auch in der Statement Klasse abfragen, bei dir also in $ergebnis.
 
Danke Felix. Demnach ist es so korrekt, oder spielt es eine Rolle ob ich store_result VOR oder nach dem bind_result ausführe?

PHP:
	$sql = "SELECT `email` FROM `st_users` WHERE `email` = ?";
	$ergebnis = $db->prepare($sql);
	$ergebnis->bind_param('s',$this->username);
	$ergebnis->execute();
	$ergebnis->store_result();
	echo	$ergebnis->num_rows;
	$ergebnis->bind_result($email);

Und gibt es eine Möglichkeit auf $email zuzugreifen, ohne eine Schleife zu benutzen? Ich erwarte hier maximal nur ein Ergebnis, da email UNIQUE in der DB sein muss...
 
Wenn es nur ein Ergebnis geben wird, sollte es reichen fetch() einfach auszuführen, ohne die Schleife.
 
Öhm. Bei $ergebnis->fetch() ohne Schleife kommt einfach "1" raus. Ich benutze ja auch die vorher gebundene Variable $email nicht... aber wie geht das? :)
 
PHP:
$ergebnis->bind_result($email);  
$ergebnis->fetch();
echo $email;

Versuch es mal einfach so? Habe momentan leider keinerlei Möglichkeiten es zu testen.
 
Zurück