2016-09-15 10 views
-2

電子メールが既にデータベースに存在し、登録を拒否しているかどうかを確認するにはどうすればよいですか?電子メールが既に存在するか確認する

MySQLは私に教えられたもので、私は現在MySQLiを使って壁にいる。ここで

は、私は現在、MySQLiをを使用して働いているコードは次のとおりです。

<?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

はEMAILADDRESSが既に存在する場合、クエリを確認することにします。コード内にこのクエリを実装すれば、完了です。 – Natrium

+0

はメールアドレス=ユーザー名ですか? – Ish

+0

あなたはこれに答えましたか? –

答えて

1

はまだ、SQLインジェクションに対して脆弱です。以下はテストされていませんが、準備されたステートメントをどのように使用できるかを示す必要があります。あなたはあなただけを確認する、電子メールと一致しない場合、これらは前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

ircmaxellの[passord_compat](https://github.com/ircmaxell/password_compat)は、 'password_ *'関数をphp> = 5.3.7に持ち込みます。 – Neat

+0

これはうまくいっています。 – DingoDile

-1

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

後にこのコードを追加し、これを試してみてください、私は私の電子メールの列を設定することにより、この問題を解決しましたユニークな属性を持つ登録後、mysqli_errno()を受け取ることができます。重複したエントリがあるかどうかを確認します。

このソリューションでは、確認クエリを保存します。厄介な驚きを避けるために準備されたステートメントを使用する - あなたが直接SQL文で変数を埋め込むようmysqliあなたのコードを使用しているにもかかわらず

+1

このアプローチを実装するときは、すべてのキー違反が同じエラーコードを引き起こし、どのキーであるかを調べるための組み込みの固い方法がないことを考慮する必要があります。いくつかの候補がある場合(これは、 'username'が一意でなければならないと仮定しているためです)、エラーメッセージを解析してキー名を抽出する必要があります。 –

-1

へのPHPのバージョンでは使用できませんけれども、このようなpassword_hashpassword_verifyとして - パスワードをハッシュのより良い方法があります。メールアドレスは...あなたはできる、

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

が存在するか、...

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

使用レコードCOUを得るため、このPHP関数を最小の長さを指定しますNTデシベルで

$count=mysqli_num_rows($result) 

確認した後に、それ以上の0か

関連する問題