2014-12-28 9 views
5

Müssen Sie mysqli-Anweisungen schließen?

Problem


Ich versuche zu zählen, wenn es eine Registrierung mit der gleichen Telefonnummer und Datum gibt. Dies soll verhindern, dass Personen zwei Reservierungen am selben Datum (Uhrzeit) registrieren. Mein Problem ist, dass ich erwarte, dass die Abfrage 0 zurückgibt, weil es keine Registrierung mit den gleichen Details in der Datenbank gibt. Das Ergebnis ist jedoch 1. Das würde anzeigen, dass bereits etwas in der Datenbank mit den gleichen Informationen vorhanden ist, aber nicht. Meine Vermutung ist, dass es mit der Abfrage zu tun hat, die ich vor der aktuellen Abfrage ausführe. Ich frage mich, ob ich versuchen sollte, die Aussage zu schließen.

Was habe ich versucht


ich versucht habe, schließt die Erklärung $stmt->close() aber ohne Erfolg. Ich habe versucht, neue Variablen zu erstellen, anstatt die aus der vorherigen Abfrage zu verwenden, aber das hat auch nicht funktioniert. Ich habe die Datenbank dreifach überprüft, um sicherzustellen, dass es dort keine Registrierung mit denselben Details gibt, und ich bin 100% sicher, dass in der Datenbank nichts falsch ist.

Code


Hier ist mein Code. Ich denke das Problem liegt im ersten Abfrageteil.

$query = "SELECT count(*) as reservation_amount FROM reservation WHERE `date`= ?"; 
$stmt = $db->prepare($query); 
$stmt->bind_param("s", $datetime); 
$stmt->execute(); 
$stmt->bind_result($count); 
while($row = $stmt->fetch()){ 
    $res_count = $row; //res_count is 1 in this case. I'm thinking I need to close something here? 
} 

$query = "SELECT count(*) as registered FROM reservation WHERE `number` = ? and `date`= ?"; 
$stmt = $db->prepare($query); 
$stmt->bind_param("is", $number, $datetime); 
$stmt->execute(); 
$stmt->bind_result($count); 
while($row = $stmt->fetch()){ 
    $registered = $row; //outputs 1 but I'm expecting 0 
} 

Eingang


datetime = 2014-12-28 17:00:00 
number = 0612345678 

Datenbank


Die Datenbank enthält den folgenden Datensatz:

id name surname number email   date    amount 
5 Henk Houtman 9060666 [email protected] 2014-12-28 17:00:00 1 

Fehler


Keine Fehler.

+0

'number = 0612345678' ist' int' wird in einen anderen Dezimalwert konvertiert –

+4

'$ statement-> fetch()' gibt boolean true zurück und wird als 1 ausgewertet. Wahrscheinlich möchten Sie 'store_result()' und 'bind_result()'. http://php.net/manual/en/mysqli-stmt.bind-result.php –

Antwort

2

mysqli_stmt_fetch wird true bei Erfolg zurückgeben. Falls erfolgreich, gibt Ihre Abfrage immer nur eine Zeile zurück (weil Sie eine COUNT anfordern, wobei die eine Zeile den gesuchten Wert enthält).

while($row = $stmt->fetch()){ 
    $registered = $count; 
} 

Sie sollten die gebundene Variable $count bei der Bestimmung des Wertes in der Zeile zurückgegeben werden. (Hinweis: Sie brauchen die Variable $row nicht.)

+0

Ja, das war es. Das erste Mal mit mysqli zu arbeiten hat mich dazu gebracht, den falschen Code zu verwenden, den ich irgendwo gefunden habe. Sollte auf PDO geblieben sein;) Prost. – Bono

+0

Da dies nur eine Zeile maximal zurückgibt, wäre es besser, das 'while' gegen ein' if' zu tauschen. – halfer

+0

@halfer Ich stimme zu. (Im Allgemeinen versuche ich, so wenig Code wie möglich zu ändern. Das 'while' ist in den meisten Anwendungsfällen von' mysqli_stmt_fetch' auch "konventioneller".) –

Verwandte Themen