2016-04-21 11 views
0

Ich habe 3 Tabellen:aktualisiert mehrere Zeilen Fremdschlüssel mit ausgewählter Form

Dateien (file_id, Name, etc ..),
Gruppen (group_id, Namen, etc ...) und

file_group (file_id, group_id) => Verwendung des Fremdschlüssels hier mit den primären Schlüsseln aus beiden Tabellen (Dateien und Gruppen).

Mein Problem ist: Ich habe Probleme, ein Update auf meinem Tisch file_group.

Fehlermeldung: Integrität Einschränkungsverletzung: 1062 Duplcate Eintrag '40 -6' für Schlüssel PRIMARY ....

Ich weiß, warum es mir, dass zu sagen, aber ich kann immer noch nicht damit es funktioniert.

Der Code ist:

<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 
 
    ]); 
 
    } 
 
} 
 

 

 
?>

In meinem Tisch file_group, eine Datei 2 Gruppen haben kann. Also versucht der Code dasselbe Update mit den gleichen Daten zu machen. Für mich scheint es, als ob die Schleife nicht funktioniert!

Irgendwelche Tipps?

The Var_dump(); gibt die folgenden:

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

Datentabellenstrukturen:

-- 
-- 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);' und was siehst du? Sind die Daten sinnvoll? Wenn Sie versuchen, den Befehl über eine SQL-IDE oder -Shell auszuführen, funktioniert die Abfrage? Sie zeigen nicht, wie Sie die Daten tatsächlich an den Server senden. Kannst du diesen Code entweder in die Frage eingeben oder die Ergebnisse des 'var_dump' in die Frage einarbeiten? – Terminus

Antwort

0

Es solchen Fällen Sie Datenbank-Transaktionen verwenden. Sobald Sie eine Transaktion starten, aktualisieren Sie die Fremdschlüsselspalten und dann Commit.

<?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; 
} 

?> 

Denken Sie daran, Sie haben updateForeign() die PDO-Datenbankverbindungsinstanz in der Funktion zu erhalten.

+0

Ich habe Ihre Lösung versucht, aber es gibt false zurück. Und wenn ich die "Versuch fangen" entfernen, bekomme ich die gleiche Fehlermeldung: Integrität Verletzung doppelte Eintrag – Ryuzakis

+0

Dann ist das Problem nicht mit Fremdschlüsseln. Es ist mit Primärschlüssel. Überprüfen Sie, ob Sie die Primärschlüsselwerte duplizieren –

+0

Ich habe die Datentabellenstrukturen hinzugefügt. Und ich denke der Fehler liegt bei PHP und nicht bei den Tabellen ... – Ryuzakis

Verwandte Themen