我从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字符串。
希望这是更好的做法。
保持开放状态几分钟,希望得到一些反馈,如果这样做的话。
答案 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提交,所以我只是