Bir şey yankılanırken Bu regexp, ancak MySQL başka içine girer.

2 Cevap php

Ben "echo" ile test ettiğinde, iyi çalışan bir sorgu var:

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

Ben bir DB oluşturmak için bu onu değiştirmek Ama, bu bir rekor kaybeder:

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

Özellikle, atlayarak bulunuyor Tweet "amcafee?: # Enterprise 2.0 konferans katılımcıları daha sonra bu ay Boston içerisinde e2conf yaparken mutlaka emin olmalıdır nedir andyasks" dir. Bu birincisinden yankılanırken, ancak DB INSERT üzerinde bırakılır. Herhangi bir düşünce?

2 Cevap

O (benim _emphasis_ eklenmiştir) eklemek olmadığını dize tek bir alıntı var:

"Amcafee: # Enterprise 2.0 konferans katılımcıları ederken onlar ** _'_ ** Boston yeniden bu ay # e2conf yapmak için emin olmalıdır Ne andyasks"

Çıplak tek tırnak Birinci değerin sonu olarak MySQL tarafından yorumlanır ve anlamsız içine sorgunun kalanını döner. MySQL tek tırnak sizin dize parçası olduğunu bilir ki "onlar \ 're" içine tek tırnak (yani dönüş "onlar" kaçmak gerekir. Arada, tek tırnak hileler SQL enjeksiyon saldırıları ana kaynağıdır, böylece her zaman tek tırnak dikkatli olmalıdır.

Eğer mysql uzantısı kullanıyorsanız, her zaman herhangi güvenilmeyen veri mysql_real_escape_string işlevini kullanmanız gerekir:

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

PHP / MySQL ayıklama İpuçları

  1. Eğer hata ayıklama beyanlar yankılanan olduğunuzda, emin aslında mysql gönderilen neler olduğunu görmek için source HTML sayfası görüntülemek olun.

  2. Lütfen echo'd sayfanın kaynağını görüntülerken, kopyalama ve yapıştırma SQL sorgusu doğrudan mysql konsol içine (ya da phpMyAdmin bunu kullanıyorsanız) ve ne olduğunu görün.

  3. Bir günlük işlevi kullanarak yerine mysql ifadeleri yankılanıyordu düşünün. Burada kullanabileceğiniz bir beyin ölü logger var


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

Ve sonra gibi bir şey ile günlüğünü izlemek

tail -f /tmp/test.txt

Unix komut satırında. Siz benzer çalışması gerektiğini, Tail for Windows indirebilirsiniz.