2012-03-25 5 views
1

Das Problem, mit dem ich konfrontiert bin, ist, mysql_num_rows gibt mir eine Ausgabe von 1 alle durch den Code, aber wenn ich es in einer if-Anweisung wil 0, gibt es wahr und tut den Code. so $ Lizenz gibt zurück ........ anstelle von seinem tatsächlichen Wert.mysql_num_rows in einer if-Anweisung

Ich habe versucht, das Problem mit diesen selbst zu debuggen.

  • Versucht print_r, um zu sehen, ob Daten vorhanden sind. - Ja.
  • Versucht, die $ Lizenz im ersten Teil zurückzugeben - gibt den richtigen Wert zurück.
  • Versucht, den Wert von mysql_num_rows Überprüfung - liefert 1.
  • es mit 0 in ein passender if-Anweisung - true zurückgibt, wenn es falsch sein sollte, da der Wert 1.

Jede Hilfe zu diesem Thema ist?

$check = mysql_query("SELECT * FROM licenses WHERE email='$email'") or die(mysql_error 
                      ()); 
if (mysql_num_rows($check) > 0) 
{ 
    while ($data = mysql_fetch_array($check)) 
    { 
     print_r($data); // for test 
     $name = $data['name']; 
     $license = $data['pid']; 
     echo $license; // test print 1 
     $comments = $data['comments']; 
    } 

    if ($license == "Sgsmorgan") 
     $license = "EWP Discounted Basic (Simpleleveraging)"; 
} 

$count = mysql_num_rows($check); // for test 
echo $count; // returns 1. 
if (mysql_num_rows($check) == 0) 
    $name = ""; 
$license = "..........."; 
echo $license;// test print 2 
$comments = "Email doesnt exist in the database"; 
+2

Die MySQL-Erweiterung ist veraltet und auf dem Weg nach deprecation. Neuer Code sollte mysqli oder PDO verwenden, die beide wichtige Vorteile haben, wie etwa die Unterstützung vorbereiteter Anweisungen. Apropos: Der Beispielcode ist potenziell anfällig für [SQL-Injektion] (http://unixwiz.net/techtips/sql-injection.html). Parametriere die Anweisung, um die Widerstandsfähigkeit zu schließen. – outis

+3

Verwenden Sie nicht ['SELECT *'] (http://stackoverflow.com/questions/321299/), es sei denn, Sie schreiben ein DB-Administrationsprogramm; Wählen Sie nur die Spalten aus, die Sie benötigen. – outis

+2

Aus Gründen der Lesbarkeit wählen Sie bitte einen [Einzugsstil] (http://en.wikipedia.org/wiki/Indent_style) aus und wenden ihn an. – outis

Antwort

3

Sicherlich meinen Sie das:

if (mysql_num_rows($check)==0) 
{ 
    $name = ""; 
    $license = "..........."; 
    echo $license; //Test print 2 
    $comments = "Email doesnt exist in the database"; 
} 

Statt

if (mysql_num_rows($check)==0) 
$name = ""; 
$license = "..........."; 
echo $license; //Test print 2 
$comments = "Email doesnt exist in the database"; 

Wenn Sie die geschweiften Klammern nicht verwenden, bedeutet dies, dass nur die erste Zeile unterhalb der if-Anweisung enthalten ist. So ist $license immer auf ........... eingestellt.

Verwenden Sie immer geschweifte Klammern.

+0

@Kishor - Um die Theorie von Michael zu bestätigen, was ist der Wert, auf den $ name am Ende eingestellt ist? – Anthony

+0

Das hat es behoben. Ich werde das im Hinterkopf behalten, und werde das Zeug nicht wieder wiederholen :) Danke – Kishor

+1

@Kishor: Ich bekomme immer noch auf einer wöchentlichen Basis Fehler von Bedingungen wie 'if ($ x = 1)' statt 'if ($ x == 1) ', ich wette, du wirst wieder alle möglichen Sachen wiederholen. Sie werden besser darin, sich auf den Kopf zu schlagen, wenn es so ist. – Anthony

1

Ich glaube, dass die Probleme sind, dass an diesem Punkt gibt es keine Zeilen mehr übrig, als while Schleife alle von ihnen geholt hat.

Wenn ich mich nicht irre, dieser Code:

while ($ignored = mysql_fetch_array($check)) { 
    echo "Got a row! Rows left: " . mysql_num_rows($check); 
} 

Sollte Ausgang so etwas wie:

Got a row! Rows left: 3 
Got a row! Rows left: 2 
Got a row! Rows left: 1 
Got a row! Rows left: 0 
+0

Es wird nur 1 Zeile geben, wo email = '$ email' Ich überprüfte den Wert von mysql_num_rows als $ count, kurz bevor es in der if-Anweisung mit 0 übereinstimmt. $ count sagt 0, die if-Anweisung wird auch wahr. – Kishor

+0

Schöner Fang, David. – Anthony

+0

@Kishor - Nun, wenn es nicht die while-Schleife ist, was passiert dann, wenn Sie die Bedingung wie folgt ändern: 'if ($ count == 0)'? – Anthony

1

auf Davids Ursachen- Anknüpfend, ist hier eine wirklich einfache Lösung:

$check = mysql_query("SELECT * FROM licenses WHERE email='$email'") 
     or die(mysql_error()); 

if (mysql_num_rows($check) > 0) { 
    while ($data = mysql_fetch_array($check)) { 
     $name = $data['name']; 
     $license = $data['pid']; 
     $comments = $data['comments']; 
    } 

    $license = ($license == "Blahblah") ? "This is a second level license" : $license; 

} else { 
    $name = ""; 
    $license = "..........."; 
    $comments = "Email doesnt exist in the database"; 
} 
+0

$ Lizenz = ($ Lizenz == "Blahblah")? "Dies ist eine Lizenz der zweiten Ebene": $ Lizenz; Scheint ein bisschen verwirrend, da ich gerade PHP lerne. Wie auch immer, es fehlten mir geschweifte Klammern unter der letzten if-Anweisung. – Kishor

+1

Ja, ein Teil davon, warum du es verpasst hast, denke ich, liegt daran, dass du die schlechte Angewohnheit aufgegriffen hast, nicht einzeilige Bedingungen in geschweiften Klammern zu schließen, was zwar gültig, aber sehr schwer zu lesen ist und schnell zum Verlust führen kann verfolgen, wo Ihre anderen Bedingungen öffnen und schließen. Befolge Michaels Rat und verwende immer geschweifte Klammern. Der Grund, warum ich diese eine Zeile geändert habe (in die bedingte Syntax, bekannt als [ternary] (http://us3.php.net/manual/en/language.operators.comparison.php)) ist, weil es oft hilft, einige der Punkte zu bereinigen, wo man einfach nicht 3-5 Zeilen Code haben möchte, um 1 Var zu setzen. – Anthony

Verwandte Themen