0

フォームから入力を受け取り、データベースにユーザー アカウントを作成しようとする register.php ファイルがあります。ユーザーテーブルの「ユーザー名」フィールドに「UNIQUE」キーが追加されたinnoDB MySQLデータベースがあります。これは、ユーザー名の重複を防ぐためです。

以下は私のphpコードからの抜粋です。私のデータベースには、現在「testUser」というユーザーがいます。ただし、以下のコードを で実行すると$username = testUser、データベースに重複する行が作成されていなくても、php ファイルは「アカウントが作成されました」を返します。ユーザーが既に存在する場合、例外がスローされると予想していましたか?

try{
    $stmt = $db->prepare("INSERT INTO users (username, password, salt) VALUES (:username,   :password, :salt)");
    $stmt->bindParam(':username', $username);
    $stmt->bindParam(':password', $hash);
    $stmt->bindParam(':salt', $salt);
    $stmt->execute();
}catch(PDOException $e){
    returnJSON(0,'Error creating account');
}

returnJSON(1,'Account created');

function returnJSON($errorCode, $message){
    $arr = array("returnCode" => $errorCode, "returnMessage" => $message);
    echo json_encode($arr);
    die();
}

 ----
try{
    $db = new PDO('mysql:host='.$host.';dbname='.$dbname, $username, $password);
}
catch(PDOException $e){
    $arr = array("returnCode" => 0, "returnMessage" => "unable to connect to server");
    echo json_encode($arr);
    die();
}

私の質問は、ユーザーのアカウントがデータベースに正常に追加されたかどうかを確認する方法です。

PS。最初にデータベースにクエリを実行し、このコードを呼び出す前に同じ名前のユーザーが存在するかどうかを確認するコードがあります。しかし、私はまだこれを修正/理解したいと思っています。

4

2 に答える 2

0

デフォルトでは、PDO にはサイレント エラーがあります。実際にそれらを探して、自分で確認する必要があります。

例外を使用する場合は、PDO にそのように指示する必要があります。http://php.net/manual/en/pdo.error-handling.php を確認してください

必要な特定のコードは

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

接続を作成した直後の try/catch で。

于 2012-09-23T07:25:29.003 に答える
0
catch (PDOException $er) {print("error".$er."<br />");}

エラーをキャッチすると、プログラムのフローが続行されます。エラーをキャッチして、exit() を使用してフローを停止してみてください。

私が言っているのは、たとえ例外がキャッチされたとしても、次のコード行はまだ実行されるべきだということです.

returnJSON(1,'Account created');

何らかの形で流れを止めない限り。使用している関数を含め、ファイル全体を投稿していただければ幸いです。

于 2012-09-23T06:43:51.940 に答える