0

PDO に変換していますが、ユーザー名と電子メールが使用されているかどうかを確認するセクションで変換に問題があります。

以下はコードです:

<?php
session_start();
$host     = "localhost";
$username = "root";
$password = "123";
$dbname   = "test";
$conn = new PDO("mysql:host=$host;dbname=$dbname",$username,$password);
?>

<?php
if(isset($_POST['register'])){
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];

    $usernamecheck = $conn->query("SELECT `id` FROM `user` WHERE                   username='$username'");
    $emailcheck  = $conn->query("SELECT `id` FROM `user` WHERE email='$email'");
    if(mysql_num_rows($usernamecheck) > 0){
        echo "That username is already taken";
    }elseif(mysql_num_rows($emailcheck) > 0){
        echo "That e-mail address is already in use";
}    
?>

私が得るエラーは、次の2行にあります。

if(mysql_num_rows($usernamecheck) > 0){

}elseif(mysql_num_rows($emailcheck) > 0){

前もって感謝します。

4

2 に答える 2

1

mysql_num_rows()PDOクエリに使用しています。これらの API を混在させることはできません。

また、 $_POST 変数を SQL に直接補間していますが、これはセキュリティ上は許されません。PDO を使用する利点は、代わりに SQL クエリ パラメーターを簡単に使用できることです。これは、はるかに簡単で安全です。

このタスクをコーディングする方法は次のとおりです。

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $conn->prepare("SELECT COUNT(*) AS count FROM `user` WHERE username=?");
$stmt->execute(array($username));
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  $username_count = $row["count"];
}
if ($username_count > 0) {
  echo "That username is already taken";
}

$stmt = $conn->prepare("SELECT COUNT(*) AS count FROM `user` WHERE email=?");
$stmt->execute(array($email));
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  $email_count = $row["count"];
}
if ($email_count > 0) {
  echo "That email address is already in use";
}

また、最初に確認したとしても、いつの日か 2 人のユーザーが同時に同じユーザー名を作成しようとする可能性があることを想定する必要があります。それぞれの要求のコードが間違った順序で実行された場合、両方にユーザー名が通知される可能性があります。存在しない場合は、先に進んで INSERT してください。したがって、一意である必要がある列に UNIQUE KEY を定義する必要があります。最初の INSERT のみが成功し、もう一方はエラーになります。したがって、エラーをチェックする必要があります。

于 2013-07-18T00:10:32.563 に答える