2017-03-23 1 views
0

Ich bin mit einem seltsamen Problem konfrontiert, ich versuche, eine einfache Usercheck mit PHP 7.1 zu implementieren.PHP 7.1 Abfrage für Benutzerprüfung gibt eine Warnung aus: Ein nicht-numerischer Wert in E gefunden: XAMPP htdocs

$con = getConnection(); 
 
     //check connection 
 
     if(!$con){ 
 
      die("Connection to database failed". mysql_connect_error()); 
 
     } else echo ("connection to database successfull"); 
 

 

 
     //checking if nickname already exists 
 
     $checkUserExistanceSql = "SELECT nickname FROM user WHERE nickname='" + $nickname+ "'"; 
 
     //sending query to sql database 
 
     $doesExist = mysqli_query($con, $checkUserExistanceSql) 
 
      or die ("Fehler in der Datenbankabfrage"); 
 

 
     if(mysqli_num_rows($doesExist)>=1){ 
 

 
      echo "Nickname not available, use another name"; 
 

 
     }

Aber ich bin immer diese Warnung

Warnung: Ein nicht-numerischen Wert in E angetroffen: \ XAMPP \ htdocs ... Zeile 29 Linie 29 ist die $ checkUserExistanceSql. Irgendwelche Ideen wo das Problem ist?

+2

ändern ' "SELECT Spitznamen FROM Benutzer WHERE Spitznamen = '" + $ Spitznamen + " ' "'" SELECT Spitznamen FROM Benutzer WHERE Spitznamen ='" zu'. $ Spitznamen. "'" '. Nicht speziell PHP 7.1 bezogen btw .. – Yolo

+0

@ Yolo die Warnung könnte PHP 7.1 bezogen werden. Zuvor (zumindest in 5.6) würde es die Strings still zu Ints konvertieren (normalerweise 0) und die Addition durchführen. Das ist wahrscheinlich nicht die Absicht in den meisten Fällen. – apokryfos

+0

@Yolo vielen Dank, das löste es sofort, ich suchte gerade 4 Stunden jetzt. –

Antwort

2

String-Verkettung auf PHP verwendet . (Punkt) als Operator, nicht + (plus).

Sie tatsächliche Code verwendet +:

$checkUserExistanceSql = "SELECT nickname FROM user WHERE nickname='" + $nickname+ "'"; 

Aus diesem Grund PHP ist zu sagen, dass $nickname nicht eine numerische Variable ist. Es kann keine Strings zusammenfassen, sondern nur verketten.

ändern Betreiber . und es wird funktionieren:

$checkUserExistanceSql = "SELECT nickname FROM user WHERE nickname='" . $nickname . "'"; 

Sie auch diese Syntax verwenden können, mit dem gleichen Ergebnis, aber sauberer Code:

$checkUserExistanceSql = "SELECT nickname FROM user WHERE nickname='{$nickname}'"; 

Security Alert

Sie Code ist erfolgreich zu SQL injection . Sie sollten vorbereitete Anweisungen verwenden, anstatt Ihre Variablen in die Abfrage zu verketten.

+0

Können Sie mir sagen, warum Sie geschweifte Klammern verwenden? es funktioniert ohne sie ''$ Spitzname'' – Mario

+0

Vielen Dank, das löst jetzt eine Menge Probleme für mich. Ich hätte meine Codeform auch für andere Funktionen verwendet. –

+0

@ Mario mit den Klammern vermeiden einige Fehler, wenn das nächste Zeichen ein gültiges variables Zeichen ist, zB: '" Foo $ SpitznameBar "'. PHP wird versuchen, $ NicknameBar anstelle der gewünschten Variable $ Nickname zu verketten. In dieser Situation, da das nächste Zeichen ein einfaches Anführungszeichen ist, wird dies funktionieren, aber es ist eine gute Übung mit '{}', so dass Sie nie diese Probleme haben werden. –

1

Dank der Hilfe von Yolo und Elias Soares. Das Skript läuft jetzt fehlerfrei, ich habe auch eine vorbereitete Anweisung verwendet, um dem Risiko einer SQL-Injektion entgegenzuwirken, wie von Elias erwähnt.

$con = getConnection(); 
 
     //check connection 
 
     if(!$con){ 
 
      die("Connection to database failed". mysql_connect_error()); 
 
     } else echo ("connection to database successfull"); 
 

 

 

 
     //prepared statement for sql query 
 
     $stmt = $con -> prepare("SELECT nickname FROM user WHERE (nickname=?)"); 
 
     $stmt -> bind_param("s", $nickname); 
 
     
 
     $stmt->execute(); 
 

 
     //checkking result, if nickname is already used 
 
     if($stmt->get_result()){ 
 
      echo "0"; 
 
     } else { 
 
      //insert user 
 
     }

Verwandte Themen