Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 根据选中的复选框更新数据库_Php_Mysql_Sql_Database - Fatal编程技术网

Php 根据选中的复选框更新数据库

Php 根据选中的复选框更新数据库,php,mysql,sql,database,Php,Mysql,Sql,Database,我的数据库中有以下表格布局和一些数据。 我通过复选框进行输入,以便用户可以选择所有适用的事故道路条件,并将其保存到数据库中。我想说,如果您要添加一条新记录,您只需循环通过checkboexs checked并将其插入数据库中就可以了 第一个信息现在保存在数据库中,现在用户出于任何原因决定更改路况,用户返回并将其更改为以下内容 现在我的问题是,我应该如何更新我的表。我想到的第一件事是删除已经存在的记录并插入新的记录 我这里真正的问题是,假设用户之前选择了3个项目,但更改了两个或一个,那么我如

我的数据库中有以下表格布局和一些数据。

我通过复选框进行输入,以便用户可以选择所有适用的事故道路条件,并将其保存到数据库中。我想说,如果您要添加一条新记录,您只需循环通过checkboexs checked并将其插入数据库中就可以了

第一个信息现在保存在数据库中,现在用户出于任何原因决定更改路况,用户返回并将其更改为以下内容

现在我的问题是,我应该如何更新我的表。我想到的第一件事是删除已经存在的记录并插入新的记录

我这里真正的问题是,假设用户之前选择了3个项目,但更改了两个或一个,那么我如何删除那些未检查的项目你知道我在说什么。下面是我一直在尝试的一些代码片段

$accidentRoadConditions = AccidentRoadConditions::findAccidentRoadConditions($acc_det_id);
$wc_array = [];

while ($roadConditions = $accidentRoadConditions ->fetch(PDO::FETCH_OBJ)) {
    $wc_array[] = $roadConditions ->rc_id;
}
上面我选择了数据库中已经存储的所有路况

if (isset($_POST['rta_ad_rc'])) {
    foreach ($_POST['rta_ad_rc'] as $rc_id) {
        //AccidentRoadConditions::save(array(null, $ad_lsid, $rc_id));
        // $tmprory = AccidentRoadConditions::findByADAndRCIds($acc_det_id, $rc_id);
        // if(!$tmprory){
        //  AccidentRoadConditions::save(array(null, $acc_det_id, $rc_id));
        // }
        if(in_array($rc_id, $wc_array)){
            $errors[] =  "in array <br />";
            unset($wc_array[0]);
        }
    }
}
if(isset($\u POST['rta\u ad\u rc'])){
foreach($\u POST['rta\u ad\u rc']作为$rc\u id){
//意外路况::保存(数组(null,$ad_lsid,$rc_id));
//$tmprory=AccidentRoadConditions::findByadRcids($acc_det_id,$rc_id);
//如果(!$tProry){
//意外路况::保存(数组(null,$acc_det_id,$rc_id));
// }
if(在数组中($rc\u id,$wc\u数组)){
$errors[]=“在数组中
”; 未设置($wc_数组[0]); } } }
所以我的问题是如何根据用户检查的内容更新数据库中的值,并删除以前检查过的未检查的值。变得有点复杂,所以简单地说,如何根据上述场景更新数据库


有什么想法吗

我认为这是你应该做的

  • 在ad_id和rc_id上创建复合唯一约束
  • 删除不在所选复选框ID中的所有行
  • 尝试插入所有行,但用户插入忽略。如果记录不存在,这将插入该记录,或者忽略该记录。当您使用某个框架时,请查看如何做到这一点。 如果不能,则只需使用try/catch包装它,如果错误与约束冲突有关,则忽略它

这样,您就不需要检查这些值是否存在,也不会有任何不必要的插入。

我认为您需要执行以下操作

  • 将所选支票存储在数组中
  • 如果其中任何一个已保存或未保存,请检入数据库
  • 如果是,则跳过它们,否则将它们添加到数组中

    $old_rc_数组=[]; $new_rc_array=[]

    而($roadConditions=$accidentRoadConditions->fetch(PDO::fetch_OBJ)){ $old_rc_array[]=$roadConditions->rc_id; }

    如果(isset($_POST['rta\u ad\u rc'])){

    foreach($\u POST['rta\u ad\u rc']作为$rc\u id){

    } }

    foreach($rc\u旧数组作为$rc\u to\u删除){ 意外路况::deleteByADIdAndRCId($hidden_acc_det_id,$rc_to_delete); }

    foreach($rc\u新数组作为$rc\u to\u插入){ 意外路况::保存(数组(null,$hidden_acc_det_id,$rc_to_insert)); }


删除所有相关行并再次插入是实现这一点的简单方法。正如问题中所述,这是我之前所想的,只是想知道是否还有其他方法,否则我可以使用该选项。无论如何,谢谢@Thiagofranaçathis是我用代码做的
$tmprory=acidentroadconditions::findbyaandrcids($acc_det_id,$rc_id);如果(!$tmprory){AccidentRoadConditions::save(数组(null,$acc_det_id,$rc_id));/}
Yes,但首先检查记录是否存在,然后插入。可以通过添加复合唯一约束来避免这种情况。上面的代码检查数据库中的记录是否已经存在如果没有插入新的,否则什么都不做try catch块下的所有操作我已经在这里转储了完整的代码是的,我明白了,但是您正在进行两个DB调用,首先检查行是否存在,然后插入。如果您有唯一约束,则无需检查行是否存在,如果存在,则DB将抛出错误,您可以忽略该错误。谢谢@Sharif,我将自己整理格式
if(in_array($rc_id, $old_rc_array)){
    unset($old_rc_array[array_search($rc_id, $old_rc_array)]);
}else{
    $new_rc_array[] = $rc_id;
}