我是PHP和Mysql的新手。我要问的问题是请求有人告诉我使用准备好的陈述,所以首先让我说我正在学习这个,但还没有完成。我有一个查询,查看电子邮件地址是否在数据库中。电子邮件地址可能包含不寻常的字符,如 - ,/ | “”等我似乎无法检索它们 - 这是我的代码(重复邮件来自一个表单)。与没有此字符的电子邮件地址完美配合。
$checkemail = $_POST['repeatemail'];
$checkemail = mysqli_real_escape_string($con, $checkemail);
//Perform database to see if email exists
$query = "SELECT email FROM scorers WHERE email = '{$checkemail}'";
$result = mysqli_query($con, $query);
$row = mysqli_fetch_row($result);
if ($row[0] == $checkemail){
echo "found";
} else {
echo "not found";
}
目前我已经想知道转义字符串是否正在剥离不寻常的字符,因此一旦它被查询它就被改变了,但事实似乎并非如此。此外,我输入像simon.o'malley@nhs.uk这样的地址没有问题,但是不能用上面的代码检查它们。看了很多关于UTF等的解释,但在这一点上它有点高于我的头脑。有人可以给我一个解决方案....如何更改上面的代码,以便它会挑选出这些时髦的电子邮件地址?非常感谢
答案 0 :(得分:0)
知道了......这很好但是如果你们有任何重大问题请告诉我。它的魔术引号问题似乎是唯一的问题。所有其他角色看起来都很好
$checkemail = $_POST['repeatemail'];
$check_email_no_slashes = $checkemail;
$checkemail = mysqli_real_escape_string($con, $checkemail);
echo $check_email_no_slashes . "</br>";
//Perform database to see if email exists
$query = "SELECT email FROM scorers WHERE email = '{$checkemail}'";
$result = mysqli_query($con, $query);
$row = mysqli_fetch_row($result);
if ($row[0] == $check_email_no_slashes){ etc etc etc .......}
感谢您的投入Tim。
答案 1 :(得分:0)
您确实需要使用预准备语句。如果不这样做,则需要SQL注入问题(请参阅http://en.wikipedia.org/wiki/SQL_injection)。例如,我可以向您发送一个电子邮件地址,删除表中的所有行。
准备好的陈述并不难;这是一个例子:
$stmt = $mysqli->prepare("SELECT email FROM scorers WHERE email = ?")
// use the string in $checkemail in place of the ?
$stmt->bind_param("s", $checkemail);
// run the query
$stmt->execute();
// put the result into $email
$stmt->bind_result($email);
if ($stmt->fetch()) {
// found a matching email; do something about it
}
$stmt->close();
您可以在PHP文档中阅读有关预准备语句的更多信息:http://php.net/manual/en/mysqli.prepare.php