2017-08-29 1 views
1

Ich brauche Hilfe zwischen drei Tabellen, die von checkboxe zu verknüpfen:PDO mehrere checkboxs Einfügen oder Löschen von

Funktionen Tabelle (id, Titel, Sulg)

Beiträge Tabelle (id, titel, Butzen, hinzugefügt)

posts_features (fea_id, post_id)

<input type="text" name="title" value="$post->title"> 
<input type="text" name="slug" value="$post->slug"> 
// importing all features 
<input type="checkbox" name="featuresid[]" value="$features->id"> 

wenn diese Option aktiviert (Einsatz) wenn nicht vorhanden.

foreach ($_POST['featuresid'] as $choice) { 
$sql = $dbh->prepare("INSERT INTO posts_features (fea_id, post_id) VALUES ($choice, $id)"); 
$sql->execute(); 
} 

und wenn un-geprüft (löschen) aus posts_features

$sql = $dbh->prepare("delete form posts_features where ........ 

Vielen Dank im Voraus.

Antwort

1

Ein Kontrollkästchen nicht $_POST wenn es nicht aktiviert ist, so würden Sie nicht eine Möglichkeit haben, zu sehen (von den $_POST, sowieso), die kennzeichnet, wo nicht geprüft.

Es gibt mehrere Möglichkeiten, dies zu tun, aber ohne weitere Informationen über Ihre Anwendung ist es schwer, die „beste“ Vorschlag zu machen, aber hier ist eine Methode die $_POST nutzen wird:

Fügen Sie eine weitere „versteckte“ Eingang, mit dem entsprechenden $features->id, die „bestehenden“ Einträge einzurichten:

Hinweis: ich folge Ihre Konventionen im Code über dies zu demonstrieren, obwohl sie eindeutig Pseudo-Code sind, und wird nicht funktionieren p Roperly.

<input type="checkbox" name="featuresid[]" value="$features->id"> 
<input type="hidden" name="existing[]" value="$features->id"> 

Dann können Sie Ihre Schleife nutzen, etwa so:

foreach ($_POST['featuresid'] as $choice) { 
    $sql = $dbh->prepare("INSERT INTO posts_features (fea_id, post_id) VALUES ($choice, $id)"); 
    $sql->execute(); 
} 

// loop through ALL feature ids listed on the page 
foreach($_POST['existing'] AS $features_id) { 
    // if the feature id wasn't in the checkboxes, then delete 
    if (! in_array($features_id, $_POST['featuresid'])) { 
     $sql = $dbh->prepare("DELETE FROM posts_features WHERE ........"); 
    } 
} 
0

Nicht angekreuzte Kontrollkästchen werden nicht an PHP gesendet. Wenn Sie also durch $_POST['featuresid'] iterieren, werden nur die Kontrollkästchen angezeigt, die überprüft wurden. Dies bedeutet, dass das Löschen nicht markierter Features bedeutet, dass alle Features gelöscht werden, die nicht in der überprüften Gruppe enthalten sind.

Zuerst die ausgewählten Funktionen einfügen: wichtig DB-Abfragen nicht in einer Schleife ausführen; sie werden wirklich verlangsamen Sie Ihr Skript. Stattdessen insert all records at once. Sie sollten auch parametrisierte Abfragen verwenden. Fügen Sie keine benutzerdefinierten Werte direkt in Ihre DB-Abfragen ein!

Nach dem Einfügen, Löschen, jene Funktionen, die nicht ausgewählt wurden:

DELETE FROM posts_features WHERE fea_id NOT IN (?, ?, ?, ?) 

Jede der ? einem Wert entspricht in $_POST['featuresid']

Eine Alternative, wenn Sie PHP wollen eine explizite erhalten ausgewählt/Nicht ausgewählter Wert für jedes Feature ist die Verwendung von Ja/Nein-Optionsfeldern oder Dropdown-Listen für jedes Feature im HTML.

+0

Nizza Antwort. Ich dachte darüber nach, war aber besorgt, dass die Liste der Checkboxen nur eine Teilmenge aller post_features sein könnte, nicht die komplette Liste. (Zum Beispiel, wenn paginieren). –