4

このクエリ

$email = $mysqli->real_escape_string($_POST['email']); // User's email.
$key = RandomString(128); // A random string of 128 characters.
$newTime = $_SERVER['REQUEST_TIME'] + 1800; // Expiration timer.
$queries[] = "INSERT INTO verification (
        email, 
        key, 
        time
    ) VALUES (
        '$email', 
        '$key', 
        $newTime
    )";
$errors = false;

$mysqli->autocommit(false);
foreach ($queries as $query) {
    if (!$mysqli->query($query)) {
        $errors = true;
    }
}

次のエラーが表示されます:

SQL 構文にエラーがあります。使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。1 行目付近で 'key, time) VALUES ('example@domain.net', 'e1e4091197640bae0a4588b8666e87b6b' を使用します。

しかし、上記のクエリは、いくつかのバッククォート (アクサン グラーブ) を追加するだけで機能します。

$queries[] = "INSERT INTO verification (
        `email`, 
        `key`, 
        `time`
    ) VALUES (
        '$email', 
        '$key', 
        $newTime
    )";

この変更がどのように問題を解決するのか、誰か説明できますか?

4

3 に答える 3

6

timeおよびkeyは予約語です。それらを列名に使用する場合、これは悪い考えですが、それらをエスケープするためにバッククォートが必要です。

于 2013-01-18T16:11:00.270 に答える
4

MySQLでは、識別子の名前が予約語である場合は常にバックティックが必要です。あなたの場合、KEYは予約語であり、そのように囲まない限り構文エラーが発生します。通常、そのような名前を作成することは避けてください。

予約語のリストはここにあります。

于 2013-01-18T16:14:27.070 に答える
1

これを試してみてください -- これは mysql の予約キーワードであるため、そのようなキーは使用できません。フィールドとして取得できるようにチルド (`) を使用します。

$queries[] = "INSERT INTO verification (
        email, 
        `key`, 
        time
    ) VALUES (
        '$email', 
        '$key', 
        $newTime
    )";
于 2013-01-18T16:11:00.610 に答える