2012-08-01 36 views
-1

所以我有這個腳本需要一堆json文件並將它們發送到我的數據庫。該腳本文件的8777工作正常,但我得到了下面的MySQL語法錯誤的文件70:「你的SQL語法錯誤」發生在8777次中的70次

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Shea', '', '190', '1981-4-30', 'Right', '106', '13', '25', '65', '39', '64', '61' at line 1 

這裏是我使用的循環,我爲長查詢道歉:

For($id=1; $id<=205600; $id++) 
{ 
if (file_exists('data/players/'.$id.'.json')) 
    { 
     //read json file 
     $json_file = file_get_contents('data/players/'.$id.'.json'); 
     $file_data = json_decode($json_file, true); 

     //my super long query 
     $query = 'INSERT INTO `db`.`table` (`id`, `first_name`, `last_name`, `common_name`, `height`, `dob`, `foot`, `club_id`, `league_id`, `nation_id`, `attribute1`, `attribute2`, `attribute3`, `attribute4`, `attribute5`, `attribute6`, `rare`, `rating`, `type`) VALUES (\''.$id.'\', \''.$file_data['Player']['FirstName'].'\', \''.$file_data['Player']['LastName'].'\', \''.$file_data['Player']['CommonName'].'\', \''.$file_data['Player']['Height'].'\', \''.$dob.'\', \''.$file_data['Player']['PreferredFoot'].'\', \''.$file_data['Player']['ClubId'].'\', \''.$file_data['Player']['LeagueId'].'\', \''.$file_data['Player']['NationId'].'\', \''.$file_data['Player']['Attribute1'].'\', \''.$file_data['Player']['Attribute2'].'\', \''.$file_data['Player']['Attribute3'].'\', \''.$file_data['Player']['Attribute4'].'\', \''.$file_data['Player']['Attribute5'].'\', \''.$file_data['Player']['Attribute6'].'\', \''.$file_data['Player']['Rare'].'\', \''.$file_data['Player']['Rating'].'\', \''.$file_data['Player']['ItemType'].'\');'; 
     mysql_query($query); 

     //record loop status 
     if (mysql_error()) 
     { 
      $error = mysql_error(); 
      echo $error.'<br/>'; 
      $errors ++; 
     } 
     else 
     { 
      $entries ++; 
     } 
    } 
} 

那麼我該如何解決這個錯誤?

+0

我會假設這些70個文件有一定的格式或字符(S)目前,其他8707沒有。你知道這是什麼嗎? – 2012-08-01 22:42:51

+0

如果'Shea','','190','1981-4-30','Right','應該對應於''id','first_name','last_name','common_name',''高度「我認爲在現場順序中有些錯誤,或者在某些記錄中可能缺少一個字段? – fvu 2012-08-01 22:45:23

+1

我剛剛看完名單,大部分名字都顯得愛爾蘭人。所以也許這裏有一個像O'shea和O'Connor那樣的姓氏 – 2012-08-01 22:46:12

回答

4

Escaping your SQL對於解決這個問題將會有很長的路要走。

如果你在生產中使用這個功能,你很幸運,你有很多成功的交易。

固定起來的例子看起來更像是這樣的:

$dbh = new PDO(...); 

$stmt = $dbh->prepare('INSERT INTO `db`.`table` (`id`, `first_name`, `last_name`, ...) 
    VALUES (:id, :Player_FirstName, :Player_LastName, ...)'); 
$stmt->bindParam(':id', $id); 
$stmt->bindParam(':Player_FirstName', $file_data['Player']['FirstName']); 
$stmt->bindParam(':Player_LastName', $file_data['Player']['LastName']); 
// ... Etc... 

// insert one row 
$stmt->execute(); 
+3

好吧,在閱讀PDO後,我設法將所有內容切換到PDO。該腳本現在導入%100。 – 2012-08-02 07:17:16

+0

這就是PDO的全部內容。工作很好。 – tadman 2012-08-02 15:09:15

5

使用mysql_real_escape_string你的變量之前將它們添加到查詢:

$commonName = mysql_real_escape($file_data['Player']['CommonName']); 

在查詢然後使用$commonName

雖然你真的應該使用PDO。介紹請參見First steps with PDO

+2

這樣做對所有事情都是一點一滴的煩人。最好的計劃是使用PDO。 – tadman 2012-08-01 22:43:17

+1

@tadman我在添加此評論:P – 2012-08-01 22:43:35

+0

+1是一個PDO助推器。 – tadman 2012-08-01 22:50:02

相關問題