1

我是 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 提出将复选框值保留为数字的良好建议(确保数据库中的列应为VARCHAR)感谢@Barmar 解释explode 的使用并感谢@MarkTWebsite 分享if-else 的想法

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

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

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

我从数据库中检索复选框值的最终代码...

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

感谢堆栈溢出!

4

4 回答 4

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

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

编辑:根据要求的示例代码。请注意,我不是PHP 程序员,因此可能(并且肯定会有)语法错误,但我会尽力而为要获得用户输入,您必须简单地添加复选框的值

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

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

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

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

于 2013-09-02T09:12:52.490 回答
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>
于 2013-10-08T07:32:50.030 回答
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;
}
于 2013-09-02T09:09:45.780 回答
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 开发人员 3 年。

于 2013-09-02T09:03:30.807 回答