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

timekey是保留字。如果您打算将它们用作列名,这是一个坏主意,它们需要反引号来转义它们。

于 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 回答