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

ahh*_*huu 1 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;
                    }
                }
           });
Run Code Online (Sandbox Code Playgroud)

这是我的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);

?>
Run Code Online (Sandbox Code Playgroud)

为了防止我的连接脚本出错,这里是:

<?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();
}

?>
Run Code Online (Sandbox Code Playgroud)

以下是该警报中出现的错误:

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
Run Code Online (Sandbox Code Playgroud)

错误末尾的0是使用该电子邮件地址找到的行数,因此语句将执行.

我究竟做错了什么?我一直使用PDO准备电子邮件地址,从来没有得到过这个错误.

编辑:就这样我没有得到更多这些评论,我知道我需要使用预准备语句来防止SQL注入.我只是这样做测试.这是电子邮件变量周围缺少的单引号.感谢大家.:)

小智 5

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

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

  • 你也想逃避它,因为你容易受到[Sql注入](http://en.wikipedia.org/wiki/SQL_injection) (3认同)