【问题标题】:Does anyone see anything wrong with this? Mysql+PHP Error有人看到这有什么问题吗? mysql+php错误
【发布时间】:2010-08-30 03:08:52
【问题描述】:

我正在运行以下行:

mysql_query("INSERT INTO tags 
                SET tag = '".$onesearch."',  
                SET date = '".date('d-m-Y')."'") or die(mysql_error());

...它的死是这样说的:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“SET date = '29-08-2010'' 附近使用正确的语法

我不知道出了什么问题。

【问题讨论】:

  • 日期列的字段类型是什么?
  • 表:日期列:id (int11) (auto inc) tag (varchar 20) date (varchar 11)
  • 不是语法错误的来源,但您应该知道 MySQL 不接受 DD-MM-YYYY 格式的日期文字。只有 YYYY-MM-DD 和 YY-MM-DD。见dev.mysql.com/doc/refman/5.1/en/datetime.html

标签: php sql mysql mysql-error-1064


【解决方案1】:

从插入查询中删除第二个 SET。它应该是:

mysql_query("INSERT INTO tags 
                SET tag = '".$onesearch."',  
                date = '".date('d-m-Y')."'") or die(mysql_error());

【讨论】:

  • 恭喜并 +1 -- 我从未见过 INSERT 中的 SET 子句(一种复制标准 SQL 的 INTOVALUES 的特殊方式,其他引擎都支持as 做 mysql!-),所以我删除了我的指定 INTOVALUES 的 A(但看起来 @OMG 可能不想删除他的,可能是为了避免肆意,我猜,当完全好的等效标准 SQL 结构可用时,非标准 SQL 结构的使用是无用的,我猜-)。
  • @Alex Martelli 同意。不同的数据库供应商 ANSI 实现使最终用户感到困惑。可能是 MySQL 团队 REUSES 更新语句:)。至少我觉得一个优势是,如果您的列数超过 7,开发人员可以轻松编写此查询而不是 INSERT-VALUES。
【解决方案2】:

语法无效,您应该只使用一个 SET:

mysql_query("INSERT INTO tags 
            SET tag = '".$onesearch."',  
            date = '".date('d-m-Y')."'") or die(mysql_error());

这是有效的 INSERT 语法,仅供参考(针对其他答案之一)。

【讨论】:

    【解决方案3】:

    您是否能够输出实际正在运行的查询?可能是该标签包含一个单引号,它转义了结束引号并导致问题......这就是您要使用的原因:

    mysql_query("INSERT INTO tags 
                    SET tag = '". mysql_real_escape_string($onesearch) ."',  
                        date = '".date('d-m-Y')."'") or die(mysql_error());
    

    你想在这里做什么?
    您从 INSERT 语法开始,但在表引用之后转换为使用 UPDATE 语法。

    插入

    mysql_query("INSERT INTO tags 
                   (tag, date) 
                 VALUES 
                   ('".$onesearch."', '".date('d-m-Y')."')") or die(mysql_error());
    

    更新

    mysql_query("UPDATE tags 
                    SET tag = '".$onesearch."',  
                        date = '".date('d-m-Y')."'") or die(mysql_error());
    

    ...但是您将在表中获得这两个值的记录。你会想要一个WHERE 子句...

    【讨论】:

    • OP 的 UPDATE 类型语法是有效的 INSERT 语法,只是其中的 SET 单词太多。 dev.mysql.com/doc/refman/5.1/en/insert.html 见第二个例子。
    • @permiso:给我的消息,谢谢。为了混淆,我仍然会避免使用该语法。
    • 糟糕——我的回答是一样的,但mysql 确实支持INSERT 中的SET 子句,@Adeel 说得对,它只是重复 SET 这是一个错误。所以 +1 给她,我删除了我的 A(我向你推荐相同的课程!-)。
    • @OMG Ponies,我同意你的看法:)
    • 此外,UPDATE 也不接受两个 SET 关键字。 :)
    【解决方案4】:

    我认为其他人已经回答了您的问题。但你应该照顾那个 $onesearch 变量。如果没有正确清理,其中的引号也可能会破坏您的代码。如果你还没有这样做,你应该考虑使用mysql_real_escape_string()来保护你免受错误和sql注入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      相关资源
      最近更新 更多