2016-04-21 80 views
0

外键我有3个表:更新多行与选择的形式

文件(的file_id,名称等),
组(GROUP_ID,姓名等)和

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

我的问题是:我无法对我的表file_group进行更新。

错误消息:完整性约束冲突:1062 Duplcate进入 '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,一个文件可以有2组。 因此,代码尝试使用相同的数据进行相同的更新。对我来说,似乎循环不起作用!

任何提示?

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; 
+0

'var_dump($ _ POST);'你看到了什么?数据是否有意义?如果您尝试通过SQL IDE或shell运行该命令,查询是否工作?你不显示你实际上是如何将数据发布到服务器的。你可以将该代码编辑到问题中,还是编辑'var_dump'的结果到问题中? – Terminus

回答

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数据库连接实例。

+0

我试过你的解决方案,但它返回false。如果我删除了“try catch”,我得到了同样的错误信息:完整性违规重复条目 – Ryuzakis

+0

然后问题不在于外键。这是主键。检查你是否复制了主键值 –

+0

我添加了数据表结构。我认为这个错误是在php中,而不是在表中。 – Ryuzakis