第1行的MySQL语法错误和反引号提供奇怪的解决方案

时间:2013-01-18 16:09:54

标签: php mysql sql registration

此查询

$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服务器版本对应的手册,以便在“密钥,时间”VALUES附近使用正确的语法('example@domain.net','e1e4091197640bae0a4588b8666e87b6b'在第1行。

但上面的查询有效,只需添加一些反引号(严重重音):

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

任何人都可以解释这种变化如何解决这个问题吗?

3 个答案:

答案 0 :(得分:6)

timekey是保留字。如果你打算将它们用于列名,这是一个坏主意,它们需要反引号来逃避它们。

答案 1 :(得分:4)

只要标识符的名称是保留字,就需要在MySQL中使用反引号。在您的情况下,KEY是一个保留字,会导致语法错误,除非您将其包含在内。避免创建这样的名称通常是个好主意。

您可以找到保留字here的列表。

答案 2 :(得分:1)

试试这个 - 你不能使用这样的密钥,因为它是mysql的保留关键字。在它周围使用tild(`),以便将它作为字段。

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