本规范适用于插入某些规格的单位。 例如,如果规格是长度,则单位是厘米,米和毫米。
当我尝试用逗号读取单个文本字段中的所有单元时,在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循环有什么问题?
答案 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) ""
}