爆炸不起作用

时间:2014-03-26 15:30:25

标签: php loops for-loop explode

本规范适用于插入某些规格的单位。 例如,如果规格是长度,则单位是厘米,米和毫米。

当我尝试用逗号读取单个文本字段中的所有单元时,在PHP中尝试用逗号分解单元。 但是当我提交表单时,只有第一个单元被保存到DB。

这是我的数据库结构:

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 个答案:

答案 0 :(得分:1)

问题是unit_id是表中的主键,但是您尝试为此列插入具有相同值的多个记录。每次循环时,都使用相同的unit_id值插入,但使用不同的unit_name值。只要unit_id是主要(或唯一)密钥,您就无法做到这一点。

答案 1 :(得分: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) ""
}