我在这里疯了,我从一个表单中有一系列复选框,我试图用PHP $_POST
。我的表单上的所有内容都很好,除了复选框。复选框DO发布,但顺序错误。例如,当我想要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);
}
}
P.S。我不知道为什么,但现在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>
答案 0 :(得分:3)
HTML复选框必须记住的是,如果选中它们,它们只会POST一个值。如果没有选中,则不会发布。
考虑到这一点,您应该为每个复选框命名,然后在POST中对其进行测试以检测它是否已被传回。
if (isset($_POST['MyCheckbox'])) {
} // else it wasn't checked!
答案 1 :(得分:3)
如果您可以发布一些HTML部分,这将有所帮助,以便我们可以看到您如何创建表单。看来你正在生成你的数组中没有索引的复选框,所以所有的复选框都有名称/ id“checkbox []”,如果你不关心索引就可以了,但是如果发布了,那么数组将被编号从“0”开始然后计数,这就是为什么你会发布“0”和“1”的原因,即使检查了“0”和“2”。
尝试在生成HTML时给出复选框的名称/ ID号,例如“checkbox [0]”,“checkbox [1]”,“checkbox [2]”等。因此,当选中复选框0和2时,您应该获取这些值(包括正确的索引)。
答案 2 :(得分:1)
向我们展示复选框的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)."'";
答案 3 :(得分:1)
如果你声明复选框名称(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);
et caetera。