0

私は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 などに関する多くの説明を調べましたが、現時点では頭の少し上にあります。誰かがこれに対する解決策を教えてくれませんか....上記のコードを変更して、これらのファンキーな電子メールアドレスを選択するにはどうすればよいですか? どうもありがとう

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 に答える