PHP:如何从数据库中获取相同ID的多个复选框值?

时间:2013-09-02 08:58:52

标签: php mysql

我是php&的新手这里需要一些帮助。 我已经按照代码将多个复选框值插入到相同ID的表中:

在我的表格上我有:

<input type="checkbox" name="subcat[]" value="Mech">Mech
<input type="checkbox" name="subcat[]" value="Ele">Ele
<input type="checkbox" name="subcat[]" value="Civ">Civ
<input type="checkbox" name="subcat[]" value="Air">Air
<input type="checkbox" name="subcat[]" value="BSL">BSL

我检查了“Mech”,“Ele”和“BSL”

和要插入的PHP:

$subcat = $_POST['subcat'];
    for($i=0; $i<sizeof($subcat);$i++){
    $sql1="INSERT INTO mst_scatadd (party_code,scid)
    VALUES ('$pcode',$subcat[$i])";
    mysql_query($sql1,$con);
    }

db看起来像......

sctid  | party_code  |   scid
---------------------------------
  1    |   01S001    |    Mech
  2    |   01S001    |    Ele
  3    |   01S001    |    BSL
  4    |   01K207    |    Main

现在,如果我想编辑复选框,如何从db到我的表单中检索这些值以获取相同的ID?如果我想编辑复选框,我们如何检查它们?

很少得到帮助!!

谢谢你。

编辑1:

你好再见!

我已经完成了使用implode和explode插入和检索复选框值并且工作正常。 感谢@Antoniossss提供良好的建议,将复选框值保存为数字(确保db中的列应为VARCHAR) 感谢@Barmar解释爆炸和爆炸的使用感谢@MarkTWebsite分享if-else

的想法

插入多个复选框值的代码:

foreach ($_POST['subcat'] as $_subcat)
    {
        $checksub[] = $_subcat;
    }   $finalsub = implode(',', $checksub);

$sql="INSERT INTO vendor_mst(party_code, subcat) VALUES ('$pcode','$finalsub')";

我从db ...

中检索复选框值的最终代码
sql="SELECT * FROM vendor_mst WHERE party_code like '".$searchname."'";
$result=mysql_query($sql,$con);
while ($row=mysql_fetch_array($result, MYSQL_BOTH)){
$checksub  = explode(',',$row['subcat']);
}
if(in_array("1",$checksub))echo '<input type="checkbox" name="subcat[]" value="1" checked >Mech'; else echo '<input type="checkbox" name="subcat[]" value="1">Mech';
if(in_array("2",$checksub))echo '<input type="checkbox" name="subcat[]" value="2" checked >Ele';  else echo '<input type="checkbox" name="subcat[]" value="2">Ele';
if(in_array("3",$checksub))echo '<input type="checkbox" name="subcat[]" value="3" checked >Civ';  else echo '<input type="checkbox" name="subcat[]" value="3">Civ';
if(in_array("4",$checksub))echo '<input type="checkbox" name="subcat[]" value="4" checked >Air';  else echo '<input type="checkbox" name="subcat[]" value="4">Air';
if(in_array("5",$checksub))echo '<input type="checkbox" name="subcat[]" value="5" checked >BSL';  else echo '<input type="checkbox" name="subcat[]" value="5">BSL';

感谢stackoverflow!

4 个答案:

答案 0 :(得分:1)

我宁愿将复选框作为二进制标志,并将其二进制OR操作作为整数存储到DB中。它实现起来非常简单,并且可以简化数据库中的记录关系。为此,您需要将复选框的值更改为2 ^ n值。例如

<input type="checkbox" name="subcat[]" value="1">Mech
<input type="checkbox" name="subcat[]" value="2">Ele
<input type="checkbox" name="subcat[]" value="4">Civ
<input type="checkbox" name="subcat[]" value="8">Air
<input type="checkbox" name="subcat[]" value="16">BSL

选择MechCiv应该在DB中存储为5(二进制00101),Air + BSL将为24(11000b),依此类推。要恢复此过程,您只需测试存储值的每一位,并在循环中选中/取消选中相应的框。我希望你能明白我的观点。

编辑:请求的示例代码。 请注意我不是一个PHP程序员所以可能(并且肯定会)语法错误但我会尽我所能 要获得用户输入,您只需添加复选框的值

$selected=0;
foreach($POST['subcat'] as $checkedBox){
    $selected=$selected+$checkedBox
    }

所以现在变量$selected将具有所有复选框的编码状态 要检查哪些框(我从来没有遇到过这个词的麻烦)应该检查或不检查DB中的每一位存储值。我不知道你是如何生成你的观点的,所以我只提供一个模板,你必须弄清楚如何将它应用到你的项目

$valueFromDb= ///  some value fetched from DB
$maxValue= //// the highest value of your checkboxes, in my eg. 16
for($testValue=1;$testValue<=$limit;$testValue=$testValue << 1){
    $result=($valueFromDb & $testValue) > 0;
    // do something with checked result for current checkbox
}
上面的

变量result将具有相应复选框的checked状态(布尔值)。每个循环迭代按照从Mech到BSL的顺序对应不同的复选框。 或者,您可以直接打印复选框,并使用if inscruction将其设置为已选中     $ valueFromDb = //获取值

<input type="checkbox" name="subcat[]" value="1" <?php if($valueFromDb & 1 >0) echo('checked') ?php>Mech
<input type="checkbox" name="subcat[]" value="2" <?php if($valueFromDb & 2 >0) echo('checked') ?php>>Ele
<input type="checkbox" name="subcat[]" value="4" <?php if($valueFromDb & 4 >0) echo('checked') ?php>>Civ
 .... and so on and on and on

我刚刚注意到,将这两种方法结合起来会导致在循环中动态生成checbox,因此代码将更具可读性。您只需要提供checbox值标签的地图:) 我希望如此。以上将明确说明如何应用此类解决方案。

答案 1 :(得分:1)

<?php
 $checksub = array('1','2','3');

?>

<form action="<?php echo site_url('index/do_upload') ?>" method="post" enctype="multipart/form-data">
    <label>Select file : <input type="file" name="userfile"></label>
    <input type="submit" name="action">
    <input type="checkbox" name="subcat[]" value="1" <?php if (in_array(1,$checksub)){ echo "checked"; }?>/> 

</form>

答案 2 :(得分:0)

您需要使用PHP if语句; 我真的不了解你的数据库结构,否则我会提供代码,但如果你使用PHP,如果,对于每个复选框,检查数据库,看看它是否被选中; 如果选中

echo '<input type="checkbox" name="subcat[]" value="Mech" selected>Mech';

否则;

echo '<input type="checkbox" name="subcat[]" value="Mech">Mech';

你明白我的意思吗?

源; HTML / CSS / PHP Developer 3年。

答案 3 :(得分:0)

您可以使用以下方法检索子类:

SELECT party_code, GROUP_CONCAT(scid) scids
FROM mst_scadd
GROUP BY party_code

然后,当您从数据库中提取行时,您可以执行以下操作:

$scids = array_flip(explode(',', $row['scids']));

这将创建一个关联数组,其键是子类别。然后,显示复选框的代码可以是:

foreach ($all_subcats as $sc) {
    echo '<input type="checkbox" name="subcat[]" value="' . $sc . '" ' .
        (isset($scids[$sc]) ? 'checked' : '') . '>' . $sc;
}