2009-06-12 4 views
1

Ich habe eine Abfrage, wenn ich es mit „Echo“ zu testen, funktioniert gut:Dieses REGEXP echos eine Sache, aber tritt in MySQL ein anderes ein. Warum?

$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 />"; 
    } 
} 

Aber wenn ich es so weit ändern, um eine DB zu erstellen, verliert sie einen Datensatz:

$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); 
} 
} 

Genauer gesagt, der Tweet, den es überspringt, ist "amcafee: #andyasks Was sollten Enterprise 2.0-Konferenzteilnehmer sicher tun, wenn sie später in diesem Monat in Boston sind? # E2conf". Dieser Echo von der ersten, wird aber auf dem DB INSERT weggelassen. Irgendwelche Gedanken?

+0

strpos() wird einfacher und schneller sein in diesem Zusammenhang zB if (strpos ($ current ['text'], '?')! == false) –

+0

Noch eine PHP-Funktion, um etwas über den heutigen Tag zu erfahren: Danke für den Tipp, ich bin am Punkt wo ich 90% der Funktionen nicht benutzt habe, also weiß ich nicht mal was in der Referenz nachschlagen. Vielen Dank. –

Antwort

4

Es gibt einen Apostroph in der Zeichenfolge, dass es nicht (mein _emphasis_ hinzugefügt) nicht einfügen:

„amcafee: #andyasks Was sollte Enterprise 2.0 Konferenzteilnehmer sicher sein, zu tun, während sie ** _‘ _ ** re in Boston später in diesem Monat? # e2conf "

Das nackte einfache Zitat wird von MySQL als das Ende des ersten Wertes interpretiert, und es verwandelt den Rest der Abfrage in Kauderwelsch. Sie müssen einfache Anführungszeichen umgehen (dh "sie sind" in "sie sind", so dass MySQL weiß, dass das einfache Anführungszeichen Teil Ihrer Zeichenkette ist. Übrigens sind Anführungszeichen-Tricks die Hauptquelle von SQL-Injection-Angriffen, . Sie sollten daher immer von Apostrophe vorsichtig sein

Wenn Sie die mysql Erweiterung verwenden, sollten Sie immer die mysql_real_escape_string Funktion auf jedem nicht vertrauenswürdigen Daten verwenden:

$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

PHP/MySQL-Debugging-Tipps

  1. Wenn Sie Debug-Anweisungen sind Echo, stellen Sie sicher, dass Sie die Quelle sehen Ihrer HTML-Seite zu sehen, was tatsächlich zu mysql gesendet werden.

  2. Während Sie die Quelle Ihrer Echoseite anzeigen, kopieren und fügen Sie die SQL-Abfrage direkt in die mysql-Konsole (oder phpMyAdmin, wenn Sie sie verwenden) und sehen, was passiert.

  3. Verwenden Sie eine Protokollierungsfunktion anstelle von mysql-Anweisungen. Hier ist ein hirntot Logger Sie


class BrainDeadLogger { 
    static public function log($output, $file='/tmp/test.txt') { 
     file_put_contents($file,"$output\n",FILE_APPEND); 
    } 
} 
BrainDeadLogger::log($sql); 

Und dann überwachen Sie das Protokoll mit so etwas wie

tail -f /tmp/test.txt 

auf der Unix-Kommandozeile verwenden können. Sie können Tail for Windows herunterladen, die ähnlich funktionieren sollte.

+0

Nun, das Kopieren/Einfügen in MySQL hat mir geholfen. Ich muss es als Anführungszeichen verwenden, da es meine Daten vorzeitig abschneidet. Können Sie die Protokollierungsfunktion näher ausführen? Ich verstehe nicht, wie ich es benutzen würde. Danke für die Tipps. –

+1

Die Formatierung dafür wurde korrigiert.Im Grunde würden Sie Ihre SQL-Zeichenfolge (oder was auch immer) in die Logger-Funktion übergeben und es würde den Inhalt in eine Datei ausspucken. Sie könnten dann die Datei anstelle des Webbrowsers überwachen und würden nicht durch das Codieren/Flüchten von Problemen, die beim Anzeigen von SQL-Anweisungen, die als HTML interpretiert werden, auftreten könnten, stolpern. –

Verwandte Themen