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_email PHP 脚本:

<?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 注入。我这样做只是为了测试。这是电子邮件变量周围缺少的单引号。感谢大家。:)

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 回答