使用选择表单更新多行外键

时间:2016-04-21 02:19:12

标签: php sql pdo jquery-chosen

我有3张桌子:

  

文件(的file_id,姓名,等等。),
  组(group_id,name等等)和

     

file_group(的file_id,GROUP_ID)=>在这里使用外键与主键   来自两个表(文件和组)的密钥。

我的问题是:我无法在我的桌子file_group上进行更新。

  

错误消息:完整性约束违规:1062 Duplcate条目   关键PRIMARY的'40 -6'......

我知道为什么它会告诉我,但我仍然无法使它发挥作用。

代码是:

<form method="post" action="edit.php">

<select multiple="multiple" name="groups" class="form-control" >
   <option value=1>Admin</option>
  <option value=2>project_1</option>
  <option value=11>Project_Bio</option>
  <option value=12>Project_3</option>
  <option value=20>Project_Off</option>
  <option value=22>Project_zed</option>
</select>
</form>

<?php
$id = 40;

if(!empty($_POST)){

  //signleton to get the table where i want to make the update
  $fc = $app->getTable('fc');

  $new_grps = $_POST['groups'];

  foreach($new_grps as $k => $new_grp){
    $fc->update($id,[
      'group_id' => $new_group
    ]);
  }
}


?>

在我的表file_group中,一个文件可以有两个组。 因此,代码尝试使用相同的数据进行相同的更新。对我来说,似乎循环不起作用!

任何提示?

Var_dump();给出以下内容:

array(2){
   [0]=>string(1)"11" 
   [1] =>string(2)"20"
}

数据表结构:

--
-- Table structure for file
--
CREATE TABLE files (
  file_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  description TEXT DEFAULT NULL,
  owner VARCHAR(255) DEFAULT NULL,
  date DATETIME DEFAULT NULL,
  last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY  (file_id),
  KEY idx_title (title)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Table structure for table `groups`
--

CREATE TABLE groups (
  group_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(25) NOT NULL,
  last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY  (group_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Table structure for table `file_group`
--

CREATE TABLE file_group (
  file_id SMALLINT UNSIGNED NOT NULL,
  group_id TINYINT UNSIGNED NOT NULL,
  last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (file_id, group_id),
  CONSTRAINT fk_file_group_file FOREIGN KEY (file_id) REFERENCES files (file_id) ON DELETE RESTRICT ON UPDATE CASCADE,
  CONSTRAINT fk_film_group_group FOREIGN KEY (group_id) REFERENCES groups (group_id) ON DELETE RESTRICT ON UPDATE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

1 个答案:

答案 0 :(得分:0)

在这种情况下,您必须使用数据库事务。启动事务后,更新外键列然后提交。

<?php
$id = 40;
if(!empty($_POST)){
    //signleton to get the table where i want to make the update
    $fc = $app->getTable('fc');
    $new_grps = $_POST['groups'];
    updateForeign($new_goups,$fc); 
}

function updateForeign($new_groups,$fc){
    //$dbh is your database connection
    $dgh = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
    $dbh->beginTransaction();
    try{
        foreach($new_grps as $k => $new_grp){
                $fc->update($id,[
                    'group_id' => $new_group
                ]);
        }   
    }
    catch(\Exception $e){
        $dbh->rollback();
        return false;
    }
    $dbh->commit();
    return true;
}

?>

请记住,您必须在函数updateForeign()中获取PDO数据库连接实例。