Этот REGEXP повторяет одно, но входит в MySQL другое. Зачем? - PullRequest
1 голос
/ 13 июня 2009

У меня есть запрос, который, когда я проверяю его с помощью «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. Что должны делать участники конференции Enterprise 2.0, пока они находятся в Бостоне в конце этого месяца? # E2conf". Этот отголосок от первого, но не включен в БД INSERT. Есть мысли?

Ответы [ 2 ]

4 голосов
/ 14 июня 2009

В строке нет ни одной кавычки (моя _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);
    }
 }
0 голосов
/ 13 июня 2009

Советы по отладке PHP / MySQL

  1. Когда вы выводите отладочные операторы, убедитесь, что вы просматриваете источник вашей HTML-страницы, чтобы увидеть, что на самом деле отправляется в mysql.

  2. При просмотре источника вашей эхо-страницы скопируйте и вставьте SQL-запрос непосредственно в консоль mysql (или phpMyAdmin, если вы его используете) и посмотрите, что произойдет.

  3. Подумайте об использовании функции регистрации, а не выводите выражения 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 , которая должна работать аналогично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...