【问题标题】:MySQL: "error in your SQL syntax ... near key ..."? [closed]MySQL:“您的 SQL 语法错误......靠近键......”? [关闭]
【发布时间】:2014-01-12 00:37:06
【问题描述】:

我发现了一个非常酷的密码丢失脚本,但是这一行让我很困扰

$r = mysql_query('INSERT INTO `keys` (username,key, vreme) VALUES ("'.$user.'", "'.$acckey.'", "'.$keyexp.'"') or die(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, vreme) VALUES ("123123", "1ed2f5100a26298a55b2935cbea7d4a0", "1337991670"' at line 1

【问题讨论】:

  • 我会说“构建一个包含值的 SQL 字符串”。见Little Bobby Tables的尾部。 (除此之外,请在 CLI 中尝试查询,因为这类问题(保留字)很容易找到。我已经提炼了错误消息并将其放在标题中。)
  • @pst:你无法确定$user 和其他变量之前是如何处理的。在每个主题中阅读可能的 sql 注入(尤其是在最有可能没有任何问题的主题中,例如这个主题)会变得很烦人
  • @zerkms 这对我来说无关紧要/我不在乎:手动构建字符串 -> 工作量太大而且太容易出错。 简单一致性和可重复性使代码整洁。
  • @pst:但您知道 - 您在这里提到的 bobby-tables 完全无关紧要。问题是关于语法错误,而不是最佳实践。他不懂基本的东西,而你已经开始谈论火箭科学了。
  • @pst:在这里谈论鲍比桌确实无关紧要。您无法说查询是易受攻击的。只有在代码中很明显时才应该提及它。

标签: php mysql syntax-error


【解决方案1】:

KEY 是一个Reserved Word。如Schema Object Names 中所述:

如果标识符包含特殊字符或者是保留字,您必须在引用它时引用它。 (例外:限定名称中的句点后面的保留字必须是标识符,因此不需要引用。)

[ deletia ]

标识符引号字符是反引号(“`”):

mysql&gt; <strong>SELECT * FROM `select` WHERE `select`.id &gt; 100;</strong>

如果启用ANSI_QUOTES SQL 模式,也允许在双引号内引用标识符:

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)

因此:

mysql_query("INSERT INTO `keys` (username, `key`, vreme) VALUES ('$user', '$acckey', '$keyexp') ")

【讨论】:

    【解决方案2】:

    keyreserved keyword - 用反引号括起来

    `key`
    

    【讨论】:

      【解决方案3】:
       $r = mysql_query("INSERT INTO `keys` (username,`key`,vreme) VALUES ('$user', '$acckey','$keyexp')") or die(mysql_error());
      

      谢谢大家(:

      【讨论】:

        【解决方案4】:

        同时删除查询中的双引号并将查询封装在双引号而不是单引号中。

        在查询中使用单引号来封装值。

        【讨论】:

          【解决方案5】:
          $r = mysql_query("INSERT INTO `keys` (username,key,vreme) VALUES ('".$user."', '".$acckey."','".$keyexp."')") or die(mysql_error());
          

          【讨论】:

          • 还是一样,我现在就去睡觉,明天再试一次。
          • @Благовест Тодоров:再试一次什么?一个小时前我已经给出了答案
          • 那么 zerkms 是对的。 @zerkms我认为您的回答意味着使用保留关键字在其周围加上反引号。我从来没有使用保留关键字作为表名,所以我不知道。查询本身也很糟糕,所以我修复了它
          【解决方案6】:

          您是否在查询末尾的最后一个右括号和分号之间缺少单引号?

          【讨论】:

          • 我认为单引号实际上就在倒数第二个右括号之前,我认为这是正确的,因为那是查询结束的地方。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-18
          • 1970-01-01
          • 2022-12-19
          • 2021-03-15
          • 2011-01-11
          • 1970-01-01
          相关资源
          最近更新 更多