【问题标题】:PHP checkbox problemPHP复选框问题
【发布时间】:2011-03-15 05:24:57
【问题描述】:

我在这里发疯了,我有一个表单中的复选框数组,我正在尝试使用 PHP $_POST。除了复选框之外,我的表单上的所有内容都很好。复选框确实发布,但顺序错误。例如,当我想要checkbox[0]checkbox[2] 时,我实际上得到了checkbox[0]checkbox[1]

我尝试了许多不同的方法来获取复选框的值,包括isset,但我仍然遇到同样的问题。如果复选框确实被选中,我只需要将 on 的复选框值存储在我的数据库中。

我的代码如下。 $in_production 是复选框。如果需要,我也可以提供生成复选框的代码。

提前致谢。

if ($_GET['action'] == 'Edit_Product'){

    include("../dbinfo.php");

    $q_id = $_GET['q_id'];

    for ($i = 0; $i < count($_POST['p_id']); $i++){

        $result = mysql_query('SELECT * FROM products WHERE q_id = '.$q_id);
        $num = mysql_num_rows($result);

        $p_id = ($_POST['p_id'][$i]);
        $in_production = ($_POST['in_production'][$i]);
        $p_name = ($_POST['p_name'][$i]);
        $p_price = ($_POST['p_price'][$i]);

        $p_name_conflict = FALSE;

        for ($ii = 0; $ii < $num; $ii++){
            $row = mysql_fetch_array($result);
            $p_name_conflict_check = $row['p_name'];
            $p_id_conflict_check = $row['p_id'];

            if($p_name_conflict_check == $p_name &&
              $p_id_conflict_check != $p_id){
                $p_name_conflict = TRUE;
            }

        }

        if ($p_name_conflict == FALSE){
            $query = "UPDATE products SET p_name='$p_name',
              p_price='$p_price', in_production='$in_production',
              last_modified=CURDATE() WHERE p_id = '$p_id'";
            mysql_query($query);
        }

        else{
            $update_failures =+1;
        }

    }

    mysql_close($link);

    if($update_failures == 0){
        header("Location: Products_Updated.html");
    }

    elseif ($update_failures != 0){
        header("Location: Products_Exist.php?update_failures=".$update_failures);
    }

}

附:我不知道为什么,但代码块图标现在没有出现在 SO 上……所以我的代码并不漂亮。另外,我知道我的代码效率极低,但我只是想让它立即工作,然后再进行微调。我也对效率建议持开放态度,但这不是我提出这个问题的主要目标。

编辑:这是来自 HTML 的表单...

        <form id="form" name="form" method="post" action="/Management/Products/Product_Management.php?action=Edit_Product&q_id=<?php echo "$q_id" ?>">

                <?php

                    include("../dbinfo.php");   

                    $result = mysql_query('SELECT * FROM products WHERE q_id =' . $q_id);
                    $num = mysql_num_rows($result);
                    mysql_close($link);

                    for ($i = 0; $i < $num; $i++){
                        $row = mysql_fetch_array($result);

                        $p_id = $row['p_id'];
                        $p_name = $row['p_name'];               
                        $p_price = $row['p_price'];
                        $in_production = $row['in_production'];
                        $date_added = $row['date_added'];
                        $last_modified = $row['last_modified'];

                        if($in_production == 'on'){
                            $checked = 'checked';
                        }

                        else{
                            $checked = '';
                        }

                        echo "<div>Product ID# " . $p_id . "<label style=\"font-style:italic\"> (Originally added on " . $date_added . ", last modified on " . $last_modified . ")</label></div><br/>";
                        echo "<input id=\"p_id" . $p_id . "\" class=\"text\" type=\"hidden\" name=\"p_id[]\" value=\"" . $p_id . "\"/>";

                        echo "<label>Product Name *</label><br/>";
                        echo "<div><label style=\"font-style:italic\">(Product still in production <input type=\"checkbox\" name=\"in_production[]\"" . $checked . " style=\"width:15px\"/>)</label></div>";    
                        echo "<input id=\"p_name" . $p_id . "\" class=\"text\" type=\"text\" name=\"p_name[]\" maxlength=\"20\" onfocus=\"on_focus(this)\" onblur=\"on_blur(this)\" value=\"" . $p_name . "\"/><br/><br/>";

                        echo "<label>Product Price *</label><br/>";
                        echo "<div><label style=\"font-style:italic\">(Without taxes)</label></div>";
                        echo "<input id=\"p_price" . $p_id . "\" class=\"text\" type=\"text\" name=\"p_price[]\" maxlength=\"6\" onkeypress=\"return currency(this, event)\" onchange=\"currency_format(this)\" onfocus=\"on_focus(this)\" onblur=\"on_blur(this)\" value=\"" . $p_price . "\"/><br/><br/><br/><br/>";

                    }

                ?>

            <input class="button" type="button" value="Submit" onclick="product_edit_form_check()"/><br/><br/>

        </form>

【问题讨论】:

    标签: php forms checkbox


    【解决方案1】:

    如果您可以发布一些 HTML 部分,这样我们就可以看到您是如何创建表单的,这将很有帮助。似乎您生成的复选框没有数组中的索引,因此所有复选框的名称/id 为“checkbox []”,如果您不关心索引,这没关系,但如果发布,数组将被编号从“0”开始,然后向上计数,这就是为什么会发布“0”和“1”的原因,即使选中了“0”和“2”。

    在生成 HTML 时尝试提供复选框的名称/ID 编号,例如“checkbox[0]”、“checkbox[1]”、“checkbox[2]”等。因此,选中Checkbox 0和2时,您应该收到已发布的那些值(包括正确的索引)。

    【讨论】:

    • 我会试一试,但我的问题是,当我的所有其他帖子都正常工作时,为什么方括号之间的数字必须带有复选框(就像你所说的 checkbox[0])方括号之间没有数字(例如other_inputs[])?
    • 这行得通,而且很容易解决,但是就像我在上面的评论中所说的那样,为什么有必要在方括号之间用复选框指定一个数字,而不是用我的其他输入?我为所有输入以完全相同的方式生成 HTML...这没有意义!
    • 据我所知,您的 p_id、p_name 和 p_price 不是复选框,因此即使未输入任何内容,数组也会完全发布。正如 Sohnee 已经指出的那样,如果未选中复选框,则不会提交复选框,因此如果您未在 HTML 中提供索引,您的 checkbox[]-array 将在 POST 上重新编号。
    【解决方案2】:

    使用 HTML 复选框必须牢记的是,它们仅在被选中时才发布一个值。如果未选中,则不会发布。

    考虑到这一点,您应该为每个复选框命名,然后在 POST 中对其进行测试以检测它是否已被传回。

    if (isset($_POST['MyCheckbox'])) {
    
    } // else it wasn't checked!
    

    【讨论】:

    • 我确实意识到复选框仅在选中后才会发布一个值,并且据我所知,该值是on。我所有的复选框都在同一个数组中,所以我应该能够使用 $checkbox = ($_POST['checkbox'][$i]); 在 for 循环中获取复选框的值,但这不起作用......
    【解决方案3】:

    向我们展示复选框的 HTML。

    此外,您还有等待发生的 SQL 注入攻击 - 用户可以在查询末尾获取他们喜欢的任何 SQL。这样的事情说明了您应该如何处理不受信任的数据:

    //we're expect a number, so ensure we get one
    $q_id = intval($_GET['q_id']); 
    
    //get into the habit of quoting query params, 
    //or better yet, use a wrapper library to help you
    $sql="select * from products where q_id='".mysql_real_escape_string($q_id)."'";
    

    【讨论】:

    • 使用intval后是否需要转义?
    • 不,我试图说明好的做法。通常,参数的来源和用法位于不同的代码块或不同的文件中,因此养成始终转义查询参数的习惯是一种很好的做法。
    【解决方案4】:

    如果您声明复选框名称如 (p_id[]),这就像告诉 PHP“我正在向数组添加元素,为我枚举它”。就像在 php $array[] = 't';如果您有多个名称不同的表单元素,并且想要同步 ID,则 HAVE 添加索引,否则浏览器将/可能仅发送选定的元素,PHP 将连续枚举它。

    您可以使用 p_id[INDEX] 等来指定索引,其中 index 可以是任何东西(我建议使用数字或字母数字)。

    此外,复选框的值可以更改,我鼓励您这样做。 value="1" 有帮助,那么您肯定会得到它。

    <input type="checkbox" name="p_id[0]" value="1" />
    

    在 PHP 中你会收到

    $_POST['p_id'] ===> array(0 => 1);
    

    等等。

    【讨论】:

    • 最初我使用10 作为复选框的值,因为将10 用于复选框适用于JavaScript。不幸的是,我无法让它与 PHP 一起使用,并且我读到复选框发布到 PHP 的值是 on 如果选中,如果未选中则什么都没有。不过感谢您的解释,它变得越来越清楚了。
    猜你喜欢
    • 2012-10-16
    • 2020-08-12
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多