我有一个查询,当我用“echo”测试时,效果很好:
$url = "http://search.twitter.com/search.json?q=&ands=&phrase=&ors=¬s=RT%2C+%40&tag=andyasks&lang=all&from=amcafee&to=&ref=&near=&within=15&units=mi&since=&until=&rpp=50";
$contents = file_get_contents($url);
$decode = json_decode($contents, true);
foreach($decode['results'] as $current) {
if(preg_match("/\?/", "$current[text]")){
echo $current[text]."<br />";
}
}
但是当我将其更改为创建数据库时,它会丢失一条记录:
$url = "http://search.twitter.com/search.json?q=&ands=&phrase=&ors=¬s=RT%2C+%40&tag=andyasks&lang=all&from=amcafee&to=&ref=&near=&within=15&units=mi&since=&until=&rpp=50";
$contents = file_get_contents($url);
$decode = json_decode($contents, true);
foreach($decode['results'] as $current) {
$query = "INSERT IGNORE INTO andyasks (questions, date, user) VALUES ('$current[text]','$current[created_at]','Andy')";
if(preg_match("/\?/", "$current[text]")){
mysql_query($query);
}
}
具体来说,它正在跳过的推文是“amcafee:#andyasks本月晚些时候,当他们在波士顿时,企业2.0会议与会者应该做些什么?#e2conf”。这是来自第一个的回声,但是在DB INSERT上被遗漏了。有什么想法吗?
答案 0 :(得分:4)
字符串中有一个单引号未插入(我的 _emphasis _ 已添加):
“amcafee:#andyasks本月晚些时候,当他们在波士顿举行会议时,Enterprise 2.0会议参加者应该做些什么?#e2conf”
单个引号被MySQL解释为第一个值的结尾,它将查询的其余部分变成乱码。您需要转义单引号(即将“它们”转换为“它们”,以便MySQL知道单引号是您的字符串的一部分。顺便说一下,单引号技巧是SQL注入攻击的主要来源,所以你应该总是警惕单引号。
如果您使用的是mysql
扩展程序,则应始终对任何不受信任的数据使用mysql_real_escape_string
函数:
$url = "http://search.twitter.com/search.jsonq=&ands=&phrase=&ors=¬s=RT%2C+%40&tag=andyasks&lang=all&from=amcafee&to=&ref=&near=&within=15&units=mi&since=&until=&rpp=50";
$contents = file_get_contents($url);
$decode = json_decode($contents, true);
foreach($decode['results'] as $current)
{
$query = "INSERT IGNORE INTO andyasks (questions, date, user) VALUES ('$current[text]','$current[created_at]','Andy')";
if(preg_match("/\?/", "$current[text]"))
{
mysql_real_escape_string($query);
mysql_query($query);
}
}
答案 1 :(得分:0)
PHP / MySQL调试技巧
当您回显调试语句时,请确保查看HTML页面的源以查看实际发送到mysql的内容。
在查看echo页面的来源时,将SQL查询直接复制并粘贴到mysql控制台(如果你正在使用它,则复制并粘贴到phpMyAdmin),看看会发生什么。
考虑使用日志功能而不是回显mysql语句。这是一个你可以使用的脑死记录器
class BrainDeadLogger {
static public function log($output, $file='/tmp/test.txt') {
file_put_contents($file,"$output\n",FILE_APPEND);
}
}
BrainDeadLogger::log($sql);
然后用
之类的东西监视日志tail -f /tmp/test.txt
在Unix命令行上。您可以下载Tail for Windows,它应该可以正常工作。