2016-04-21 76 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