请帮我调试我的SQL INSERT?

时间:2011-03-04 18:36:34

标签: php mysql

我从twitter查询API中撤回一些数据,并通过PHP解析它,如下所示:

    $i =0;
    foreach ($tweetArray->results as $tweet) {
        $timeStamp = strtotime($tweet->created_at);
        $tweetDateTime = date('m-d-Y H:m:s', $timeStamp);
        if($i > 0){
            $SQL .= ',';
        }
        $SQL .= "(". $tweet->id .",'" . $tweet->from_user ."','". addslashes($tweet->profile_image_url) . "','". addslashes($tweet->text). "','" . $tweetDateTime ."')";
        $i++;
    }
    $SQL .= " ON DUPLICATE KEY UPDATE 1=1";

这给我留下了一个如下所示的SQL语句:

INSERT 
    INTO 
        tblTwitterSubmit (tweetId, twitterAuthor, authorAvatar, tweetText, tweetDateTime)
    VALUES
    (111,'name','http://url.com','a string of text','03-04-2011 13:03:09'),
    (222,'anothername','http://url.com','another tweet','03-04-2011 12:03:51')
ON DUPLICATE KEY UPDATE 1=1;

我很遗憾地收到以下错误: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 '1=1' at line 1

修改 1 = 1应该不做任何事情。推文不会改变,所以如果我因任何原因将同一个推回两次,则不会发生任何事情,但它也不会引发重复的错误。

重新编辑: 问题似乎与我正在使用的关键字段有关,这是Twitter发送的推文ID。

无论如何我重新考虑了代码,因为我在文章中读到的作为“真正好主意”的内容似乎很明显。我现在在for循环中包含了一个PDO提交,所以我只是做了一堆提交而不是一个长sql字符串。

希望这是更好的做法。

保持开放状态几分钟,希望得到一些反馈,如果这样做的话。

3 个答案:

答案 0 :(得分:4)

ON DUPLICATE KEY UPDATE需要一个列名,如下所示,假设tweetId是重复的关键列。

ON DUPLICATE KEY UPDATE tweetId=tweetId+1

您的1=1实际上没有做任何事情。

答案 1 :(得分:2)

您确定使用on duplicate key update的正确语法吗?

从它的手册页面来看,似乎你必须指定列名,而不是1=1


根据我的理解,如果你想指出“当有重复的”时使用values()子句中的值,你应该使用这样的东西:

on duplicate key update your_col=values(your_col)

引用相关部分:

  

您可以使用VALUES(col_name)   函数在UPDATE子句中   参考来自的列值   INSERT语句的INSERT ... ON DUPLICATE KEY UPDATE部分。   

换句话说,   VALUES(col_name)子句中的 ON DUPLICATE KEY UPDATE指的是   col_name的价值   插入,没有重复键   冲突发生了。

这   功能特别有用   多行插入。


然后,作为旁注,您必须使用与您的API匹配的函数 - 可能是mysql_real_escape_string来逃避您的字符串 - 而不是通用的addslashes,它不知道特定的你的数据库引擎。

答案 2 :(得分:0)

问题似乎与我正在使用的关键字段有关,这是推特指定的推文ID。

无论如何我重新考虑了代码,因为我在文章中读到的作为“真正好主意”的内容似乎很明显。我现在在for循环中包含了一个PDO提交,所以我只是