2016-09-15 20 views
-2

Wie überprüfe ich, ob die E-Mail bereits in der Datenbank existiert und die Registrierung ablehnt?Überprüfen, ob bereits eine E-Mail existiert

MySQL war derjenige, der mir beigebracht wurde und ich bin derzeit an einer Wand mit MySQLi. Hier

ist der Code, den ich aktuell mit MySQLi gerade arbeite:

<?php 
$cookie_name = "loggedin"; 

$servername = "localhost"; 
$username = "root"; 
$password = ""; 
$database = "scholarcaps"; 
$conn = mysqli_connect($servername, $username, $password, $database); 

if (!$conn) { 
    die("Database connection failed: ".mysqli_connect_error()); 
} 

if (isset($_POST['login'])) 
{ 
    $user = $_POST['username']; 
    $pass = $_POST['password']; 

    $phash = sha1(sha1($pass."salt")."salt"); 

    $sql = "SELECT * FROM users WHERE username='$user' AND password='$phash';"; 

    $result = mysqli_query($conn, $sql); 
    $count = mysqli_num_rows($result); 

    if ($count == 1) 
    { 
     $cookie_value = $user; 
     setcookie($cookie_name, $cookie_value, time() + (180), "/"); 
     header("Location: personal.php"); 
    } 
    else 
    { 
     echo "Username or password is incorrect!"; 
    } 
} 
else if (isset($_POST['register'])) 
{ 
    $user = $_POST['username']; 
    $email = $_POST['email']; 
    $pass = $_POST['password']; 

    $phash = sha1(sha1($pass."salt")."salt"); 

    $sql = "INSERT INTO users (id, email, username, password) VALUES ('','$email', '$user', '$phash');"; 

    $result = mysqli_query($conn, $sql); 
} 
?> 
+0

macht eine Abfrage zu überprüfen, ob die E-Mailadresse bereits vorhanden ist. Implementieren Sie diese Abfrage in Ihrem Code und Sie sind fertig. – Natrium

+0

ist Ihre E-Mail-Adresse = Benutzername? – Ish

+0

hast du das beantwortet? –

Antwort

1

Trotz Verwendung von mysqli ist Ihr Code immer noch anfällig für SQL-Injektion, da Sie Variablen direkt in die SQL-Anweisungen einbetten - verwenden Sie vorbereitete Anweisungen, um böse Überraschungen zu vermeiden. Das Folgende wird nicht getestet, sollte aber zeigen, wie Sie vorbereitete Anweisungen verwenden können. Es gibt bessere Möglichkeiten, das Passwort-Hashing - wie password_hash und auch password_verify obwohl diese in PHP-Versionen nicht verfügbar sind, vor 5,5

$response=array(); 
$cookie_name='loggedin'; 


$dbhost = 'localhost'; 
$dbuser = 'root'; 
$dbpwd = ''; 
$dbname = 'scholarcaps'; 
$db = new mysqli($dbhost, $dbuser, $dbpwd, $dbname); 




if(isset($_POST['login'])) { 

    $user = $_POST['username']; 
    $pass = $_POST['password']; 
    $phash = sha1(sha1($pass . "salt") . "salt"); 

    $sql='select `username`, `password` from `users` where `username`=? and `password`=?'; 
    $stmt=$db->prepare($sql); 

    if($stmt){ 

     $stmt->bind_param('ss', $username, $phash); 
     $result=$stmt->execute(); 

     if(!$result) $response[]='Query failed'; 


     $stmt->store_result(); 
     $stmt->bind_result($name, $pwd); 
     $stmt->fetch(); 

     if($stmt->num_rows()==0) $response[]='No such user'; 
     else { 

      $stmt->free_result(); 
      $stmt->close(); 
      $db->close(); 

      setcookie($cookie_name, $user, time() + 180, "/"); 
      exit(header("Location: personal.php")); 
     } 


     $stmt->free_result(); 
     $stmt->close(); 
     $db->close(); 

     /* show errors */ 
     if(!empty($response)){ 
      echo '<ul><li>',implode('</li><li>',$response),'</li></ul>'; 
     } 
    } 

} elseif($_POST['register']){ 

    $user = $_POST['username']; 
    $email = $_POST['email']; 
    $pass = $_POST['password']; 
    $phash = sha1(sha1($pass . "salt") . "salt"); 



    /* Does the email address already exist? */ 

    $emailfound=false; 

    $sql='select `email` from `users` where `email`=?'; 
    $stmt=$db->prepare($sql); 
    if($stmt){ 

     $stmt->bind_param('s',$email); 
     $result=$stmt->execute(); 
     if($result){ 
      $stmt->store_result(); 
      $stmt->bind_result($emailfound); 
      $stmt->fetch(); 
      $stmt->free_result(); 
     } 
    } 

    if($emailfound){ 
     echo 'Sorry, that email address already exists in our database. Please try again with a different address.'; 
     $stmt->close(); 
     $db->close(); 

    } else { 

     /* the `id` should be automatically generated I assume - hence being omitted here */ 
     $sql='insert into `users` (`email`, `username`, `password`) values (?,?,?);'; 
     $stmt=$db->prepare($sql); 

     if($stmt){ 

      $stmt->bind_param('sss', $email, $username, $phash); 
      $result=$stmt->execute(); 

      $stmt->free_result(); 
      $stmt->close(); 
      $db->close(); 

      if($result) header('Location: login.php'); 
      else{ 
       /* failed to register the user */ 
      } 
     } 
    } 
} 
+1

[passord_compat] (https://github.com/ircmaxell/password_compat) von ircmaxell bringt die 'password_ *' -Funktionen zu php> = 5.3.7 – Neat

+0

danke, Mann, das funktioniert, und ja, ich lerne die anderen Hashing-Techniken. – DingoDile

-1

die Sie interessieren, diesen Code hinzufügen, nachdem sha1

$result = mysql_query("select COUNT(id) from users where email='".$email."'"); 
$count = mysqli_num_rows($result); 
if($count > 0){ 
    echo "email exist"; 
}else 
{ 
    $sql = "INSERT INTO users (id, email, username, password) VALUES ('','$email', '$user', '$phash');"; 
    $result = mysqli_query($conn, $sql); 
} 
0

ich dieses Problem gelöst durch meine E-Mail-Spalte Einstellung mit einzigartigem Attribut. Nach der Registrierung können Sie die mysqli_errno() fangen. So sehen Sie, ob es einen doppelten Eintrag gibt.

Mit dieser Lösung speichern Sie eine Prüffrage.

+1

Bei der Implementierung dieses Ansatzes müssen Sie berücksichtigen, dass alle Schlüsselverletzungen den gleichen Fehlercode auslösen und es gibt keine integrierte Methode, um herauszufinden, um welchen Schlüssel es sich handelt. Wenn es mehrere Kandidaten gibt (und dies scheint der Fall zu sein, weil ich annehme, dass "Benutzername" ebenfalls eindeutig sein muss), müssen Sie sich mit der Analyse von Fehlernachrichten befassen, um den Schlüsselnamen zu extrahieren. –

-1

Wenn Sie möchten, um die E-Mail nicht übereinstimmen, wollen Sie nur um sicher machen eine E-Mail-Adresse vorhanden ist, könnten Sie ...

$sql = "SELECT * FROM users WHERE username='$user' AND password='$phash' AND email<>'';"; 

oder eine Mindestlänge angeben ...

$sql = "SELECT * FROM users WHERE username='$user' AND password='$phash' AND LEN(email) > 0;"; 
-1

Verwenden Sie diese pHP-Funktion für die Aufzeichnung cou erhalten nt in db

$count=mysqli_num_rows($result) 

nach dem Check es mehr als 0 oder nicht

Verwandte Themen