2016-06-19 6 views
3

Ich versuche zu bestimmen, ob eine E-Mail bereits in meiner Datenbank ist oder nicht. Dazu schreibe ich dieses Stück Code:MySQL - Wählen Sie die Anzahl gibt zurück True

$query_checkmail = "SELECT COUNT(*) FROM user WHERE email = ?;"; 
if($stmt = mysqli_prepare($connection, $query_checkmail)) 
{ 
    mysqli_stmt_bind_param($stmt, "s", $_POST["email"]); 
    $result = mysqli_stmt_execute($stmt); 
    mysqli_stmt_close($stmt); 
} 

echo "<pre>"; 
var_dump($result, mysqli_fetch_all($result)); 
echo "</pre>"; 

Da ich die Abfrage erwarten 0 zurück, weil die E-Mail nicht in der Datenbank enthalten sein sollte, der Ausgang ist dies (von var_dump):

bool(true) 
NULL 

Ich verstehe nicht, warum ich kein mysqli-Ergebnisobjekt mit dem Wert 0 bekomme, sondern stattdessen den booleschen Wert true, der immer eine PHP-Warnung in den Protokollen auslöst, wenn ich es überprüfen will.

Ich hatte eine normale SELECT id FROM user WHERE email = ?;"; vor und bekam das gleiche Ergebnis. Ich dachte, mit COUNT könnte ich das verhindern, aber mein Versuch ist offensichtlich gescheitert.

Ich fand auch diese Stackoverflow Link aber leider half es mir nicht, mein Problem zu lösen zu wissen, ob der Wert bereits existiert oder nicht.

Jede Hilfe wird sehr geschätzt. Wenn diese Information nicht genug ist, werde ich die fehlenden Bits sofort zur Verfügung stellen.

+0

Nur aus Neugier, was würden Sie tun, nachdem Sie festgestellt hatten, ob die E-Mail existiert oder nicht? – Strawberry

+0

Dies ist der Prozess zum Hinzufügen eines neuen Benutzers. Ich darf keinen Benutzer mit dieser spezifischen E-Mail-Adresse haben, da es eindeutig sein muss, da es Teil der Login-Daten ist. Daher muss ich prüfen, ob es bereits einen Benutzer mit dieser E-Mail-Adresse gibt. Wenn ja, gebe ich einen Fehler zurück, wenn nicht, kann ich weitermachen. Ich bekomme "TRUE" als Ergebnis, auch wenn es niemanden mit dieser Mailadresse und nicht "0" gibt, den ich brauche. – JRsz

+0

Erstelle einfach einen UNIQUE Schlüssel und reiche die Email ein. Das Ergebnis der Einfügung wird Ihnen sagen, ob die E-Mail existierte oder nicht – Strawberry

Antwort

3

Die Zählung selbst gibt keine boolesche wahr oder falsch, Sie überprüfen gegen eine Variable zugewiesen von mysqli_stmt_execute(), die eine boolean zurückgibt. Dies hat nichts mit den Ergebnissen der Abfrage zu tun. Wenn Sie die Dokumentation zu dieser Funktion lesen, speziell die Rückgabewerte von mysqli_stmt_execute(), sehen Sie, dass sie entweder true oder false sind, also ist es keine Überraschung, dass ein var_dump() davon einen booleschen Wert zurückgibt.

Wenn Sie die tatsächliche Anzahl möchten, müssen Sie mysqli_stmt_bind_result() und mysqli_stmt_fetch() verwenden, um die Ergebnisse der Zählung zu erhalten. Dies würde zu den korrekten Ergebnissen führen. Die Handbücher davon würden Beispiele dafür zeigen, wenn Sie nicht sicher sind, wie Sie diese Funktionen verwenden.

Was die NULL, ist es, weil Sie einen boolean in die mysqli_fetch_all() Funktion vorbei sind, die eine MySQLi_Result erwartet, während Sie eine boolean aus der geben oben genannten Gründen.

0

Ich empfehle Ihnen, PDO anstelle von mysqli zu verwenden. Zuerst eine Verbindung herzustellen, und dann:

$stm = $pdo->prepare("select count(*) from user where email = :email"); 
    $stm->bindValue(':email', $_POST['email'], PDO::PARAM_STR); 
    if ($stm->execute()) { 
     $c = $stm->fetchColumn();   
    echo $c;  
    } 
+0

Dies könnte Arbeit, aber ich mag PDO nicht und benutze es nie und um in meinen vielen Codezeilen konsistent zu bleiben, kann ich das nicht für dieses spezielle Problem verwenden. – JRsz

0

Sie können MeekroDB verwenden, ist die perfekte PHP-MySQL-Bibliothek. Zum Beispiel mit dieser Codezeile erhalten Sie ähnliches Ergebnis:

$user = DB::query("SELECT UserId FROM user WHERE email = %s",$email); 
$count = DB::count(); 

Wie Sie sehen können, ist der Code sauberer und einfach zu schreiben. Meekro ist frei und opensource: http://meekro.com/quickstart.php

1

mysqli_stmt_execute gibt wahr oder falsch, Sie nach dem excute verwenden mysqli_stmt_get_result sollten die Daten

i kopiert Beispielcode von PHP abzurufen.NET

$result = mysqli_stmt_get_result($stmt); 
while ($row = mysqli_fetch_array($result, MYSQLI_NUM)) 
{ 
foreach ($row as $r) 
{ 
print "$r "; 
} 
print "\n"; 
} 
+0

Obwohl Ihr Code mir nicht hilft, tut der Text. Siehe meine Bearbeitung auf Quirels Antwort für den Code, der mein Problem behoben hat. Aber danke für deine Antwort :) Ich schlage vor, dass du deinen Code aktualisierst, um der Frage zu entsprechen – JRsz

Verwandte Themen