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