1

我已经对此进行了两天的研究,并且几乎可以正常工作...问题是,当我在动态填充的表单上选中两个复选框时,我插入了四条记录。它变得更奇怪了……其中一条记录是独一无二的。三个有相同的信息。我完全迷失在这里。

这是表单的代码:

<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>

这是下一页插入语句的代码。

<?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

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

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

先感谢您!!!:)

4

2 回答 2

1

您正在调用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) ?>

删除最后一个,因为它只是用于调试,您可以将循环代码更改为 -

<?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();
} 
}
于 2013-08-11T17:10:18.053 回答
0

问题与您使用 mysql_query() 和您正在使用的 $query 变量有关。这是一个步行。

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

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

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

然后,您再次对变量 $results 执行操作,运行 mysql_query($query) 命令。这是您插入的另一条记录。这意味着您将在表中插入 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>";
}

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

于 2013-08-11T17:27:53.560 回答