2014-03-26 71 views
-1

此代碼用於插入特定規格的單位。例如,如果規格是長度,則單位是釐米,米和毫米。爆炸不起作用

當我嘗試使用逗號讀取單個文本字段中的所有單位並嘗試使用逗號爆炸單位時。 但是,當我提交表格時,只有第一個單元被保存到數據庫。

這是我的數據庫結構:

CREATE TABLE IF NOT EXISTS `tbl_unit` (
    `unit_id` varchar(5) NOT NULL, 
    `unit_name` varchar(50) NOT NULL, 
    `specification_id` int(11) NOT NULL, 
    PRIMARY KEY (`unit_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

這是我的代碼:

<?php 
include("../config.php"); 
$uid=$_POST['unitid']; 
$unit=$_POST['unitname']; 
$spec=$_POST['specification']; 

$arr1 = explode(',',$unit); 
$size=count($arr1); 

for($i=0;$i<$size;$i++) 
{ 
    mysql_query("insert into tbl_unit values('".$uid."','$arr1[$i]','".$specification."')"); 

} 
header('Location:addunit.php'); 
?> 

什麼是困惑我的是,當我嘗試插入$arr1[0]$arr1[1]$arr1[2]單獨的值是保存。我認爲for循環只執行一次。 for循環有什麼問題?

+2

您的代碼易受SQL注入影響。你應該閱讀[如何在PHP中防止它們](http://stackoverflow.com/q/60174/53114)。 – Gumbo

+1

歡迎來到Stack Overflow!此外[不推薦使用mysql擴展](http://www.php.net/manual/en/function.mysql-query.php)。您應該切換到[MySQLi](http://www.php.net/manual/en/book.mysqli.php)或[PDO](http://www.php.net/manual/en/ref.pdo -mysql.php)並使用預準備語句。 – TimWolla

+0

'var_dump($ arr1);'看到爆炸的作品,我不會爆炸盲人。我會考慮一個strpos檢查,比如'if(strpos($ unit,',')!== FALSE){echo「INPUT IS READY TO EXPLODE」; }'。您不應該在循環中查詢,爲什麼不檢查Query的返回值(請參閱http://php.net/mysqli_query)... – pce

回答

0

您對unit_id有'主鍵'約束,因此第一次插入成功,但所有後續的都失敗。

還有許多其他的事情,我可以在這裏指出,但不具有完整的圖片,我剛剛上市的一些主要的:

1)在MySQL中,最好是一個int主鍵,所以它即使你不使用它,也最好明確地列出這樣的列。如果你想強制執行它,那麼是一個varchar的'unit_id'列仍然可以有'唯一鍵'約束。

2)如果你對'unit_id'有一個唯一的約束,你將不得不重新考慮你的表規範。關於如何捕捉多個單位。也許它應該只是索引沒有一個獨特的約束?

3)您沒有逃脫或在表中插入之前消毒從$ _ POST輸入 - 使得它容易受到SQL注入式攻擊

4)根據不同的數組的大小,你可以做一個'批量插入',而不是爲每個插入循環 - 即提供多個行值的單個mysql插入調用。

5)'explode()'上的小事 - 它在空字符串上有一個非常微妙的行爲,所以最好檢查一下(也許作爲第3點中提到的數據清理檢查的一部分) - 例如:

php -r '$a = explode(",", ""); var_dump($a);' 

array(1) { 
    [0]=> 
    string(0) "" 
} 
+0

Thnx很多朋友.. :)我知道了..只是添加了$ uid ++;內循環.. – Shiji

+0

thnx的建議.. :) – Shiji

1

問題是unit_id是表中的主鍵,但您試圖插入具有相同值的多個記錄。每次通過循環時,使用相同的unit_id值插入,但是不同的值爲unit_name。只要unit_id是主要(或唯一)密鑰,您無法這樣做。

+0

thnx很多.. :)我知道了 – Shiji