如何解决 mysql_error()?

How to troubleshoot mysql_error()?

我收到如下所示的 mysql_error() 消息。我不时得到它,只需回顾一下我的语法就可以弄清楚它们。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key, label, value, description, last_modified, username, filepath, divid) SELE' at line 1

但是现在我遇到了一个我似乎无法解决的错误,所以我想问一个相当简单的问题。我如何解释 mysql_error() 消息具体来说,当它说 "near".

这是我在PHP中的实际查询语句:

mysqli_query($link, '
    INSERT INTO ' . DATASTORE . '(key, label, value, description, last_modified, username, filepath, divid)
    SELECT key, label, "' . $new_value . '", description, "' . $last_modified .'", "' . $authorized_username .'", "' . $new_filepath .'", "' . $target_divid .'"
    FROM ' . DATASTORE . '
    WHERE divid = "' . $source_divid . '"
') or die(mysqli_error($link));

要是这么简单就好了...我想 MySQL 能给你的信息就这么多了。我的建议是仅使用该消息作为错误位置的指南。

我会使用调试器或直接回显 sql,然后使用像 SQLyog 这样的数据库工具来 运行 查询。 SQLYog(或类似的东西)可以格式化查询以使其更具可读性。错误可能是错别字,也可能是括号未正确闭合。

像所有事情一样,它只是通过练习来实现的。

您的错误在 DATASTORE 值中。当您看到 mysql 表示 "near" 时,表示之前。因此,当您收到错误时,请查看 DATASTORE 的值是多少。尝试回显查询而不是执行它以查看它的外观,您将收到错误。 在您的情况下,错误是 DATASTORE 和 (. 同样正如 Perl 和其他人指出的那样,你必须反引号键,因为它是 mysql

的保留字

以这种方式编辑您的查询,它应该有效:

mysqli_query($link, '
    INSERT INTO ' . DATASTORE . ' (`key`, label, value, description, last_modified, username, filepath, divid)
    SELECT `key`, label, "' . $new_value . '", description, "' . $last_modified .'", "' . $authorized_username .'", "' . $new_filepath .'", "' . $target_divid .'"
    FROM ' . DATASTORE . '
    WHERE divid = "' . $source_divid . '"
') or die(mysqli_error($link));

我想是因为你的'key'字段,也就是SQL关键字。使用 '' 或 `` 引用该字段

mysqli_query($link, '
INSERT INTO ' . DATASTORE . '(\'key\', label, value, description, last_modified, username, filepath, divid)
SELECT \'key\', label, "' . $new_value . '", description, "' . $last_modified .'", "' . $authorized_username .'", "' . $new_filepath .'", "' . $target_divid .'"
FROM ' . DATASTORE . '
WHERE divid = "' . $source_divid . '"') or die(mysqli_error($link));