这个REGEXP回应了一件事,但又进入了MySQL。为什么?

时间:2009-06-12 20:49:03

标签: php mysql regex

我有一个查询,当我用“echo”测试时,效果很好:

$url = "http://search.twitter.com/search.json?q=&ands=&phrase=&ors=&nots=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=&nots=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上被遗漏了。有什么想法吗?

2 个答案:

答案 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=&nots=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调试技巧

  1. 当您回显调试语句时,请确保查看HTML页面的以查看实际发送到mysql的内容。

  2. 在查看echo页面的来源时,将SQL查询直接复制并粘贴到mysql控制台(如果你正在使用它,则复制并粘贴到phpMyAdmin),看看会发生什么。

  3. 考虑使用日志功能而不是回显mysql语句。这是一个你可以使用的脑死记录器


  4. 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,它应该可以正常工作。