2012-01-13 107 views
1

我有一個腳本,當我提交它時,我提交了一些輸入到MySQL數據庫的字段,現在它成功通過,但是如果其中一個字段有撇號,它永遠不會被插入到數據庫中。我可以修改什麼來實現這個功能?插入MySQL時的撇號問題

if ($_POST) { 
$name = trim($_POST['your_name']); 
$email = trim($_POST['your_email']); 
$answers = $_POST['answers']; 
$i = 0; 
foreach ($answers as $a) { 
    if (trim($a)) 
     $i++; 
} 

if ($name && $email && $i >= 40) { 
    $array = array(); 
    $q = mysql_query("select * from fields"); 
    while($f = mysql_fetch_array($q)) 
     $array[$f['label']] = $answers[$f['ID']]; 

    $array = serialize($array); 
    $time = time(); 
    $ip = $_SERVER['REMOTE_ADDR']; 
    $token = md5($time); 

    $result = mysql_query("insert into data (submit_name, submit_email, submit_data, submit_confirm, submit_time, submit_ip, submit_token) 
     values ('$name', '$email', '$array', '0', '$time', '$ip', '$token')"); 
+2

這就是爲什麼'mysql_query'函數應該可能從PHP中刪除。只要有可能,幾乎**總是**,請使用[預先準備的語句](http://php.net/manual/en/pdo.prepared-statements.php)。您沒有任何理由將用戶輸入的文本直接放入SQL中。 – tadman 2012-01-13 16:30:29

+2

核心開發團隊拼命想要殺死mysql/mysqli,但網絡上有**這麼多**可怕的過時「教程」,它會破壞**這麼多**現有的垃圾代碼。 – rdlowrey 2012-01-13 16:32:15

+1

我一直在這裏更頻繁地觀看MySQL標籤,我非常害怕人們對SQL轉義的無知。這就像他們甚至懶得提及它。在一個公正的世界中,編寫這樣的代碼將會是一場**大罪行**。 – tadman 2012-01-13 16:34:04

回答

0

使用mysql_real_escape_string(),因爲這將解決您的撇號問題,並至少部分有助於避免SQL注入攻擊。如果你不想用PHP的內置PDO庫弄髒你的手,你可能會考慮一個數據庫抽象層(DBAL)。 ADODB就是一個例子。

+0

任何指向我的腳本的地方?對不起,我在這裏是一個小菜鳥,而且我有這個腳本是由其他人寫的。 – techora 2012-01-13 16:45:38

+0

@kcray:在將其添加到查詢中之前,您將用該函數包裝每個用戶提供的字符串。 – Crontab 2012-01-13 16:48:37

+0

你有幾分鐘嗎?你能聯繫我嗎? impactfactor1 [在]的Gmail [點] com – techora 2012-01-13 17:01:59

3

您需要escape characters with special meaning in MySQL in your data

快速和改善您的代碼的方法是將所有字符串通過mysql_real_escape_string之前,將它們插入到您的SQL字符串中。

更好的方法是從mysql_query切換到允許使用bound parameters (preferably with prepared statements)的東西。

+0

PHP是否有簡單的獨立ORM?或者它們是否都捆綁到CakePHP或CodeIgniter中? – tadman 2012-01-13 16:36:20

+0

如果沒有,我會感到驚訝,但我試圖避免PHP,所以我不知道。 – Quentin 2012-01-13 16:39:00

+0

任何指向我的腳本的地方?對不起,我在這裏是一個小菜鳥,而且我有這個腳本是由其他人寫的。 – techora 2012-01-13 16:47:16