在查询中使用@符号时MySQL抛出错误

时间:2012-06-18 15:59:36

标签: mysql

我正在尝试检查用户数据库中是否已存在电子邮件地址。我正在使用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注入。我只是这样做测试。这是电子邮件变量周围缺少的单引号。感谢大家。 :)

2 个答案:

答案 0 :(得分:5)

字符串需要用单引号括起来,所以你的SQL应该是:

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

答案 1 :(得分:3)

当你使用预备语句时,最好还是使用`bindValue()``来正确地转义输入:

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

您无需在查询中添加单引号 - PDO也会为您执行此操作。