1

メールアドレスがユーザーデータベースにすでに存在するかどうかを確認しようとしています。私はAJAXを使用しています。SELECTステートメントを実行すると、常にエラーが返されます。ステートメントは@記号で壊れているようです。

AJAX呼び出し:

var emailok = false;
var email = $('input[name="email"]');
$(function(){
        $.ajax({
                type: "POST",
                data: "email="+email.attr('value'),
                url: "check_email.php",
                success: function(data){
                    alert(data);
                    if(data != 0) {
                        emailok = false;
                        $('#exists_message').slideDown('slow').delay(3500).slideUp('slow');
                        for(i=0;i<4;i++) {
                            email.animate({
                                backgroundColor: '#AC0A0A'
                            },300).animate({
                                backgroundColor: '#FFFFFF'
                            },300);
                        }
                    } else {
                        emailok = true;
                    }
                }
           });

そして、これが私のcheck_emailPHPスクリプトです。

<?php

include('connect.php');

$email = $_POST['email'];

try {
    $STH = $DBH->prepare("SELECT * FROM users WHERE email=$email");
    $STH->execute();
} catch(PDOException $e) {
    echo $e->getMessage();
}

$DBH = NULL;
$users =  $STH->fetchAll(PDO::FETCH_OBJ);

echo ' Matches - ' . sizeof($users);

?>

接続スクリプトにエラーが発生した場合に備えて、次のようになります。

<?php

$host   = 'localhost';
$user   = '********';
$pass   = '********';
$dbname = 'tm';
try {
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
} catch(PDOException $e) {
    echo $e->getMessage();
}

?>

そして、そのアラートで発生するエラーは次のとおりです。

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@asdf.asd' at line 1 Matches - 0

エラーの最後の0は、その電子メールアドレスで見つかった行数であるため、ステートメントが実行されます。

私は何が間違っているのですか?私は常にPDOを使用して電子メールアドレスを準備しましたが、これまでこのエラーが発生したことはありません。

編集:これらのコメントがこれ以上得られないように、SQLインジェクションを防ぐためにプリペアドステートメントを使用する必要があることを知っています。私は単にこの方法でテストしました。これは、email変数の前後に欠落している一重引用符でした。みんな、ありがとう。:)

4

2 に答える 2

5

文字列は一重引用符で囲む必要があるため、SQLは次のようになります。

"SELECT * FROM users WHERE email='$email'"

于 2012-06-18T16:02:53.103 に答える
3

プリペアドステートメントを使用しているので、「bindValue()」も使用して入力を適切にエスケープすることをお勧めします。

$STH = $DBH->prepare("SELECT * FROM users WHERE email=:email");
$STH->bindValue(':email', $email);
$STH->execute();

クエリに一重引用符を追加する必要はありません。PDOが自動的に追加します。

于 2012-06-18T16:07:58.293 に答える