2014-03-26 38 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