2011-01-04 10 views
0

Ich möchte Folgendes erreichen:Überprüfen Sie mehrere Bedingungen, wenn sich ein Benutzer anmeldet

Wenn ein Benutzername oder ein Kennwort-Feld null ist, benachrichtigen Sie den Benutzer. Wenn der Benutzername bereits vorhanden ist, fügen Sie ihn nicht in die Datenbank ein und benachrichtigen Sie den Benutzer, um einen anderen Namen zu erstellen. Wenn der Benutzername eindeutig ist und das Passwort nicht null ist, geben Sie den Benutzernamen an den Benutzer zurück. Ab sofort gibt es immer "Bitte geben Sie einen anderen Benutzernamen ein." Ich glaube, das Problem hat mit der Datenbankabfrage zu tun, aber ich bin mir nicht sicher. Wenn jemand einen Blick darauf werfen kann, ob ich einen Fehler mache, schätze ich das sehr, danke.

if ($userName or $userPassword = null) 
{ 

    echo "Please enter a user name and password or return to the homepage."; 

} 

elseif (mysql_num_rows(mysql_query("SELECT count(userName) FROM logininfo WHERE userName = '$userName'")) ==1) 

{ 

    echo "Please enter a different user name."; 

} 

elseif ($userName and $userPassword != null) 

{ 

    echo "Your login name is: $userName"; 

} 
+0

Nur eine Anmerkung - wie ist '$ userName' entkommen? Weil Sie es in zwei verschiedenen Kontexten verwenden - SQL und (vorausgesetzt) ​​HTML, die beide unterschiedliche Escapes erfordern. – alex

Antwort

0

Sie könnten die folgenden benötigen. Sehr einfach.

isset($_POST['username']) or die('username not given'); //#1 
isset($_POST['password']) or die('password not given'); //#2 

$escapedUsername = mysql_real_escape_string($_POST); 
$result = mysql_fetch_array(mysql_query("SELECT count(userName) FROM logininfo WHERE  userName = '$escapedUsername'")) 

if ($result){ 
    echo "Hello, $escapedUsername"; //#3 
}else{ 
    echo "Invalid Password"; //#4 
} 

Aber ich kann etwas anderes vorschlagen. Sie müssen jedoch einige Teile Ihrer App ändern.

  • haben diese Datei als eine login.php
  • Verwendung dieser für Login/Passwort-Reset/registrieren/etc ..
  • eine GET zwischen diesen Anfragen
  • Verwendung AJAX zu unterscheiden haben.
  • In diesem Fall ersetzen die folgende etwa wie folgt:
    • # 1: die('{"RESULT":"ERROR", "DESC" : "USERNAME NOT GIVEN"}');
    • # 2: die('{"RESULT":"ERROR", "DESC" : "PASSWORD NOT GIVEN"}');
    • # 3: die('{"RESULT":"ERROR", "DESC" : "INVALID USERNAME/PWD"}');
    • # 4: die('{"RESULT":"SUCCESS", "DESC" : "$escapedUsername"}'); // can also use json_encode($result) here.

Dies sind nur meine Vorschläge. Ich habe angenommen, dass mysql dir kein Problem gibt. :-)

+0

Wenn er diese aus einem normalen Anmeldeformular sendet, gibt isset immer true zurück. Ein leeres Formularfeld sendet Ihnen weiterhin eine leere Zeichenfolge. –

+0

Ich habe AJAX vorgeschlagen. Das ist der Grund, warum ich das getan habe. :-) – SuperSaiyan

0
if ($userName or $userPassword = null) 

if (($userName == null) or ($userPassword == null)) 

jedoch sein sollte, ich vermute, dass Sie eigentlich gar nicht überprüfen möchten, wenn diese Null sind. Angenommen, Sie füllen diese Variablen aus Eingabefeldern, ist ein leeres Textfeld NICHT NULL; Es ist eine leere Zeichenfolge. Sie können !empty($userName) tun, um nach einem leeren Textfeld zu suchen.

Wenn Sie zwei Variable in einer einzigen Bedingung überprüfen möchten, müssen Sie jede Überprüfung getrennt schreiben - ($userName and $userPassword != null) wird nicht so funktionieren, wie Sie es erwarten, es sollte ($userName != NULL and $userPassword != null) sein.

Wenn Sie außerdem prüfen, ob eine Variable mit etwas übereinstimmt, müssen Sie den Operator verwenden. Andernfalls weisen Sie die Variable diesem Wert zu, was praktisch nie der Fall ist.

1
if ($userName or $userPassword = null) 

Diese prüft, ob die $userNametrue (entspricht $userName == true) ist, und du bist null zu $userPassword zuweisen. Sie möchten etwas wie $userName == '' || $userPassword == ''.

"SELECT count(userName) FROM logininfo WHERE userName = '$userName'" 

Risiko von SQL injection. Verwenden Sie mysql_real_escape_string, bevor Sie Werte in Abfragen einfügen!

Auch mysql_num_rows wird immer return 1 Zeile, daher ist dieser Ausdruck immer true. Sie müssen den Wert dieser Zeile betrachten.

elseif ($userName and $userPassword != null) 

Wenn diese Überprüfung war, was Sie vorhatten, wäre es überflüssig mit der ersten Überprüfung.

Verwendung so etwas wie dieses:

function validateUser($username, $password) { 
    if ($username == '' || $password == '') { 
     return 'Please enter a user name and password or return to the homepage.'; 
    } 

    $query = sprintf("SELECT COUNT(*) as `count` FROM `logininfo` WHERE `userName` = '%s'", 
        mysql_real_escape_string($username)); 
    $result = mysql_query($query); 
    if (!$result) { 
     trigger_error(mysql_error()); 
     return false; 
    } 
    $result = mysql_fetch_assoc($result); 
    if ($result['count'] > 0) { 
     return 'Please enter a different user name.'; 
    } 

    return "Username: $username"; 
} 

$result = validateUser($username, $password); 
if (!$result) { 
    // something went wrong, deal with it 
} else { 
    echo htmlentities($result); 
} 

Beachten Sie, dass dies bei weitem noch nicht ideal Code ist, aber ich hoffe, Sie bekommen die Idee.

+0

'$ userName' darf * bereits * für SQL maskiert sein. Aber dann wäre es nicht sinnvoll, sie wie in einem String zu interpolieren (siehe OP-Beispiel). Etwas ist nicht ganz richtig :) – alex

+1

@alex Um ehrlich zu sein bezweifle ich, dass es entkommen ist. : o) – deceze

+0

Dieser Code funktioniert so weit wie die Überprüfung, um sicherzustellen, dass beide Formularfelder nicht null sind, und es funktioniert auch, um die Datenbank zu überprüfen; Allerdings werden jetzt keine Benutzernamen mehr angezeigt, die gültig sind und zur Datenbank hinzugefügt wurden. Ich bin sicher, dass es etwas ist, das ich vermisse. – paul

Verwandte Themen