2011-08-31 15 views
0

這真的很奇怪。奇怪的數組值不應該在那裏引起的MySQL語法錯誤?

基本上,我有發生,因爲在這種串引號一個MySQL語法錯誤:

('Justin Bieber', '12312688' 
, 'http://a2.twimg.com/profile_images/1468693614/Inkwell_normal.jpeg', '0'), 
('Nicki Minaj', '5422852' 
, 'http://a1.twimg.com/profile_images/1520039676/325789956_normal.jpg', '1'), 
('Drizzy Drake', '2989144' 
,'http://a0.twimg.com/profile_images/1483569177/drake-toronto_normal.jpg', '7'), 
('Lil Wayne WEEZY F', '3058376' 
,'http://a1.twimg.com/profile_images/712863751/lil-wayne-gq-2_normal.jpg', '6'), 
('Kanye West', '4176631' 
,'http://a3.twimg.com/profile_images/1132696610/securedownload_normal.jpeg', '4'), 
('Wiz Khalifa', '2846894' 
,'http://a3.twimg.com/profile_images/1400724773/5fa42d61-2b5e-4b12-ac9f-4e673c97ef16_8_normal.jpg', '8'), 
('Beyonce Knowles', '1607181' 
,'http://a1.twimg.com/profile_images/140949372/Beyonce_64_normal.jpg', '9'), 
('KELENDRIA ROWLAND', '1214446' 
,'http://a1.twimg.com/profile_images/1418081050/KELLY_ROWLAND_cover_8181v2_normal.jpg', '10'), 
('Lupe Fiasco', '819343' 
,'http://a2.twimg.com/profile_images/1450626759/209893_10150145920132282_8128837281_6973183_7422817_o_normal.jpg', '11'), 
('Tinie Tempah', '761045' 
,'http://a0.twimg.com/profile_images/1315150186/Tinie_Black_Jacket_Pic_normal.jpg', '13'), 
('50cent', '4918067' 
,'http://a3.twimg.com/profile_images/1508833809/street-king-energy_normal.png', '2'), 
('TRINA ', '796672' 
,'http://a1.twimg.com/profile_images/1441338027/Trina4372_normal.jpg', '12'), 
('iamdiddy', '4012130' 
,'http://a1.twimg.com/profile_images/1299211308/OG_FADER_FORT_DAY_4_19_normal.jpg', '5'), 
('mediatemple', 
'('Justin Bieber', '12312688' 
    ,'http://a2.twimg.com/profile_images/1468693614/Inkwell_normal.jpeg', '0')' 
    ,'http://a2.twimg.com/profile_images/421686554/mt-125x125-dk__d5d6295_normal.jpg', '14'), 
    ('Chris Brown ', '4284795' 
    ,'http://a2.twimg.com/profile_images/1515163027/image_normal.jpg', '3') 

更具體地說,本部分,其的賈斯汀比伯相關部分不應該存在:

('mediatemple', 
'('Justin Bieber', '12312688' 
    ,'http://a2.twimg.com/profile_images/1468693614/Inkwell_normal.jpeg', '0')' 
    ,'http://a2.twimg.com/profile_images/421686554/mt-125x125-dk__d5d6295_normal.jpg', '14') 

這裏是我的實際代碼:

$screennames = array(
       0 => "JustinBieber", 
       1 => "NickiMinaj", 
       2 => "drakkardnoir", 
       3 => "LilTunechi", 
       4 => "kanyewest", 
       5 => "RealWizKhalifa", 
       6 => "beyonce", 
       7 => "KELLYROWLAND", 
       8 => "LupeFiasco", 
       9 => "TinieTempah", 
       10 => "50cent", 
       11 => "TRINArockstarr", 
       12 => "iamdiddy", 
       13 => "mediatemple", 
       14 => "chrisbrown" 
        ); 

for($i = 0; $i < 15; $i++) { 
$xml[$i] = @simplexml_load_file('http://api.twitter.com/1/users/show.xml?screen_name=' . $screennames[$i]); 
$name[$i] = $xml[$i]->name; 
$followers[$i] = $xml[$i]->followers_count; 
$imageurl[$i] = $xml[$i]->profile_image_url; 
} 

$rank=-1; 

arsort($followers, SORT_NUMERIC); 
foreach ($followers as $key=>$value) { 
    $rank++; 
    $ranks[$key]=$rank; 
} 

for($i = 0; $i < 15; $i++) { 
    $value[$i] = "('".$name[$i]."', '".$followers[$i]."', '".$imageurl[$i]."', '".$ranks[$i]."')"; 
} 
for($i = 0; $i < 14; $i++) { 
    $value_string .= $value[$i].","; 
} 

$value_string .=$value[14]; 

作爲參考,它查詢Twitter的API,檢索有關每個$screenname值的特定數據,然後將其連接成一個大字符串(...) VALUES $value_string,但是在$value[13]上,似乎只在其中間放置$value[1]

到目前爲止我已經嘗試過;

使用implode(總是返回一個函數錯誤)。

只在第一個for循環中使用$value_string .=$value[$i].",",後面會留下尾隨,

更改$screennames左右的值。

我只是不明白是什麼可能導致此問題。

任何幫助/答案/評論將非常非常非常感謝:)!

更新1

這裏是我的代碼的最後部分,良好的措施:

include("db_conn.php"); 
$conn = mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error()); mysql_select_db($db_name) or die(mysql_error()); 

$query = "INSERT INTO twitter (name, followers, imageurl, rank) VALUES $value_string"; 
$result = mysql_query($query) or die(mysql_error()); 
mysql_close($conn); 
+2

按預期工作對我來說肯定不會增加額外的內存(在運行查詢的時候?) – 2011-08-31 04:27:29

+0

不是,但即使它不能解釋爲什麼'$ value [1]'也在'$ value [ 13]'當'$ value_string'被回顯時 – Avicinnian

+0

是可見的問題,如果你死了($ value_string);在你的最後一條語句後 – Ben

回答

2

固定:

從第一替代for循環下來

for($i = 0; $i < 15; $i++) { 
    $value_string .="('".$name[$i]."', '".$followers[$i]."', '".$imageurl[$i]."', '".$ranks[$i]."'),"; 
} 

$value_string=rtrim($value_string,","); 
echo $value_string; 

也刪除了第二個for循環毫無意義。

+0

非常感謝您的幫助! – Avicinnian

1

問題消失,對我來說,如果我使用它之前宣佈$值作爲數組:

$value = array(); // <-- here 
for($i = 0; $i < 15; $i++) { 

    $value[$i] = "('".$name[$i]."', '".$followers[$i]."', '".$imageurl[$i]."', '".$ranks[$i]."')"; 

} 

說明:我認爲這個問題是$值之前在foreach第一次使用作爲一個標量($追隨者段,然後作爲一個數組之後,奇怪的組合

@Pixelatron。如果你想繞過速率限制,只是緩存結果在一個臨時文件進行測試..

$xml[$i] = @simplexml_load_file('http://api.twitter.com/1/users/show.xml?screen_name=' . $screennames[$i]); 
file_put_contents("temp/".$screennames[$i],$xml[$i]->asXML()); 

,然後評論說斷,並加載,而不是加載遠程XML

$xml[$i] = file_get_contents("temp/".$screennames[$i]); 
$xml[$i] = simplexml_load_string($xml[$i]); 
+0

非常感謝您的幫助!感謝您的幫助,儘管這是現在已經完成了,我可以將它交付給我的客戶,下次我使用Twitter API時,我一定會記住它(它們的速率限制確實很糟糕,尤其是在您使用共享主機的情況下,Facebook允許使用類似於600請求每10分鐘)。 – Avicinnian

1

不立即解決的緩存,但我看不到你的代碼mysql_real_escape()任何呼叫。這會讓你的代碼更安全,例如'以某種方式得到你的一個字符串。

爲了追蹤您的錯誤,您應該嘗試放置一些var_dump()print_r()調用以瞭解各種陣列的值。

然後,嘗試用相應的count()結果替換遍及整個代碼的常量值。

+0

數據未發佈,所以'mysql_real_escape()'在這段代碼中並沒有真正達到目的。我已經接受了Dagon的回答,但是感謝您的幫助! – Avicinnian

+0

發佈的數據不是唯一的來源,呃,與不尋常的內容的數據。正如我所指出的,一個'''甚至可能源於可能損壞的xml文件。 'mysql_real_escape()'放入數據庫中的所有字符串最好。這可以讓你自由不必擔心放入什麼,你可以放入一切都沒有危險。 – glglgl