且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用新值更新联结表

更新时间:2023-02-05 09:28:49

我知道这很老,但是花了我一段时间才找到答案,这个问题在google上排名很高.

I know this is old, but it took me a while to find the answer and this question ranks high on google.

我找到了以下代码并对其进行了修改:

I found the following code and modified it:

INSERT IGNORE INTO my_table VALUES (1,1), (1,2), (1,3);

DELETE FROM my_table WHERE c1 NOT IN (1,2,3) AND my_table = 1;

源代码的来源: http://borzacchiello.it/how- to-update-a-junction-table/



我修改为与PHP变量&一起使用的代码PDO循环:



My code that I modified to use with PHP variables & PDO loops:

    $a_id = $my_main_id //this would be c1 in the above question

    //Set Variable From Post
    $var_1 = isset($_POST['var_1']) ? $_POST['var_1'] : '';
    $var_2 = isset($_POST['var_2']) ? $_POST['var_2'] : '';
    //etc, etc, etc

    //put variables into array
    $data = array('var_1'=>$var_1, 'var_2'=>$var_2, 'var_3'=>$var_3, 'var_4'=>$var_4, 'tarp_5'=>$tarp_5);

                       //get count of variable that contain data and not empty
                       $data_array_count = 0;
                       foreach ($data as $column => $value) {     
                                if($value != '') {
                                    $data_array_count = ++$data_array_count;
                                }
                       }

                       //if contains atleast one variable run update code     
                       if($data_array_count != 0) {

                            //loops through and inserts each varible in array
                            foreach ($data as $column => $value) {

                                //ignores variables without any data
                                if($value != '') {  
                                    $insert = $db->prepare("INSERT IGNORE my_table (a_id, b_id) VALUES (:a_id, :b_id)"); 
                                    $insert->execute(array(':a_id' => $a_id,
                                                           ':b_id' => $value ));        
                                }
                            }


                                //sets up variables in array to remove any records that need to be deleted
                                $columns = "";  
                                $holders = "";  
                                foreach ($data as $column => $value) {     
                                    if($value != '') {      
                                       $columns .= ($columns == "") ? "" : ", ";  
                                       $columns .= $column;  
                                       $holders .= ($holders == "") ? "" : ", ";  
                                       $holders .= ":$column";  
                                    }
                                }


                                $delete = $db->prepare("DELETE FROM my_table WHERE accessory_id NOT IN ($holders) AND (carrier_id = :a_id)"); 

                            //bind value for main id     
                            $delete->bindValue(":a_id", $a_id);

                            //loop to bind value for each variable stored in array with data
                            foreach($data as $placeholder => $value) {
                                if($value != '') {
                               $delete->bindValue(":" . $placeholder, $value);
                                }
                            }

                            $delete->execute();      

                    } 


使用原始问题的示例,您将必须为要更新的每个c1 id号运行此代码(在我的示例中,c1等同于$a_id变量).


Using the example from the original question you would have to run this code for each c1 id number that you wanted to update (c1 would be the equivalent of the $a_id variable in my example).