0

我对 PHP 和 Mysql 还很陌生。我要问的问题是乞求有人告诉我使用准备好的陈述,所以首先让我说我正在学习这个,但还没有完全做到。我有一个查询来查看电子邮件地址是否在数据库中。电子邮件地址可能包含不寻常的字符,例如 - 、 / | “”等等等。我似乎无法检索它们 - 这是我的代码(repeatemail 来自表单)。与没有此字符的电子邮件地址完美搭配。

            $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 等的解释,但此时它有点超出我的想象。有人可以给我一个解决方案....我如何更改上面的代码,以便它会挑选出这些时髦的电子邮件地址?非常感谢

4

2 回答 2

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 .......}

感谢您的输入蒂姆。

于 2013-09-08T01:20:09.903 回答
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

于 2013-09-08T01:20:26.987 回答