多个复选框插入不正确


Multiple checkboxes inserting improperly

我已经研究了两天了,几乎要让它发挥作用了。。。问题是,当我在动态填充的表单上选中两个复选框时,会插入四条记录。变得更奇怪了。。。其中一条记录是唯一的。三个有相同的信息。我在这里完全迷路了。

这是表单的代码:

<form name="form1" id="form1" method="post" action="insert_zip_codes.php?u=<?php echo $_SESSION['username'] ?>">
                            <table class="bordered" cellspacing="0">
                            <tr><th>City</th><th>State</th><th>ZIP Code</th></tr>
                            <?php while($row = mysql_fetch_array($rs)) { ?>
                                <tr><td><input name="zip_code[]" type="checkbox" id="zip_code" value="<?php echo $row[zip_code] ?>" /></td><td><?php echo $row[city] ?></td><td><?php echo $row[state] ?></td><td><?php echo $row[zip_code]?></td></tr> 
                            <?php } ?>
                            </table><br />
                              <input type="submit" name="Submit" value="Submit" />
          </form>

下面是下一页的insert语句的代码。

<?php $u = $_GET['u']; ?>
<?php var_dump($_REQUEST); ?> </br> </br>`
<?php foreach ($_POST['zip_code'] as $zip_code) {
$query = "INSERT INTO user_zip_save(username, zip_code) VALUES ('$u','".$zip_code."')";
mysql_query($query);
}  
if(mysql_query($query))
{
echo 'success';
}
else
{
echo 'failure' .mysql_error();
} 
echo $query;  // print the sql to screen for de-bugging
$results = mysql_query($query); ?>

当我点击提交时,会打印出以下内容,并成功地将其插入数据库。

 ["zip_code"]=> array(2) { [0]=> string(5) "97477" [1]=> string(5) "97478" }

看起来不错,对吧?但是数据库会得到这些记录。。。

id  40  username  ***  zip_code  97478
id  41  username  ***  zip_code  97478
id  42  username  ***  zip_code  97478
id  43  username  ***  zip_code  97477

正如你所看到的,该死的事情是只输入页面上检查过的第一个邮政编码一次(作为第四条记录),但首先输入第二个邮政编码三次。

知道为什么吗?我不知所措。

提前感谢!!!:)

您调用mysql_query() 3次,其中2次在foreach()循环之外,它将再插入最后一个$query/$zip_code 2次。

<?php foreach ($_POST['zip_code'] as $zip_code) {
$query = "INSERT INTO user_zip_save(username, zip_code) VALUES ('$u','".$zip_code."')";
mysql_query($query);  // 1st time (does query foreach zip_code)
}  
if(mysql_query($query)) // 2nd time (does query on last zip_code a second time)
{
echo 'success';
}
else
{
echo 'failure' .mysql_error();
} 
echo $query;  // print the sql to screen for de-bugging
$results = mysql_query($query); // 3rd time (does query on last zip_code a third time) ?>

删除最后一个,因为它只是为了去bug,你可以把你的循环代码改为-

<?php foreach ($_POST['zip_code'] as $zip_code) {
$query = "INSERT INTO user_zip_save(username, zip_code) VALUES ('$u','".$zip_code."')";
$result = mysql_query($query);
if($result)
{
echo 'success ';
}
else
{
echo 'failure' .mysql_error();
} 
}

问题与您使用的mysql_query()和$query变量有关。这是一条步行路线。

您通过$_POST提交两个邮政编码循环遍历$_POST数组,并将$query设置为INSERT字符串。然后将其传递到函数mysql_query()中,以执行INSERT记录的命令。

现在,您的数据库中有两条记录。您没有做任何检查来查看它们在循环期间是否单独作为插入件工作(您应该这样做)。你也没有做任何逃跑,以避免狡猾的注射篡改。(你应该)。

不管怎样,在你的循环之后,这就是一切出错的地方。然后通过再次运行mysql_query($query)来检查它是否有效。实际上,这将再次运行您作为命令生成的最后一个$query INSERT字符串。这样就可以在表中插入另一条记录。

然后,通过再次运行mysql_query($query)命令,对变量$results执行一些操作。这是你插入的另一张唱片。这意味着您将在表中插入4条记录。

建议这简直是疯了!-未测试

$u = "Whatever";
$inserted = 0;
$fatal = Array();
foreach($_POST['zip_code'] AS $z){
    if(mysql_query("INSERT INTO user_zip_save(username, zip_code) VALUES ('$u','".mysql_real_escape_string($z)."')";
        $success += mysql_affected_rows();
    } else {
        $fatal[] = mysql_error();
    }
}
echo "Inserted $success of ".count($_POST[zip_code])." records.<br />";
if(count($fatal)){
    $fatal = array_unique($fatal); 
    echo "The following error(s) occurred:<br />";
    print "<pre>";
    print_r($fatal);
    print "</pre>";
}

希望这在某种程度上有所帮助!