Rolf B: zusammenfassen merhere (fast) gleichen Anweisungen beim Löschen (DELETE)

Beitrag lesen

Hallo Erik_,

es gibt die Möglichkeit, in einem SQL Aufruf mehrere Anweisungen zu schicken. Die werden dann durch ein Semikolon getrennt. Das funktioniert dem Vernehmen nach allerdings nur, wenn Du über PDO auf MYSQL zugreifst. Bei anderen Datenbanken kann es sein, dass PDO das Mehrfachstatement nur simuliert und unter der Haube doch mehrere Aufrufe durchführt.

Wenn PHP und SQL Server auf dem gleichen Computer laufen (sprich: du connectest zu localhost oder 127.0.0.1), dann ist es aber auch ziemlich egal, ob Du einen oder fünf Aufrufe machst. Das fällt nur ins Gewicht, wenn der Server auf einem separaten Computer läuft.

Wenn's Dir um lesbaren Code geht, schreibe eine Funktion, die einen Delete durchführt:

function delete_id($db, $table, $id) {
   $statement = $db->prepare("DELETE FROM $table WHERE id = :id");
   if ($statement === FALSE) return false;
   return $statement->execute([ 'id' => $id] );
}

...

delete_id($pdo, "table_1", $id);
delete_id($pdo, "table_2", $id);
delete_id($pdo, "table_3", $id);
delete_id($pdo, "table_4", $id);
delete_id($pdo, "table_5", $id);

Heißten deine Tabellen tatsächlich table_1 bis table_5? Dann könntest Du das noch in eine Schleife stecken:

for ($i=1; $i<=5; $i++) {
   delete_id($pdo, "table_$i", $id);
}

Ob das unterm Strich die beste Lösung ist, sei dahingestellt. Wird die ID immer aus den Tabellen 1-5 gelöscht? In dem Fall könntest Du im SQL Server eine Stored Procedure (Routine) anlegen, die die Löschung in allen 5 Tabellen durchführt, und nur die id übergeben.

Die Frage ist aber auch, wie kritisch diese Löschoperation ist. Steckt hier eine Performance-Bremse für deine Anwendung? Hast Du das gemessen? Wenn der Code nicht kritisch ist, belasse es bei "ist schnell genug und funktioniert". Man optimiert dort, wo es weh tut. Andernfalls bleibt man bei möglichst lesbarem Code.

Eine Optimierung ist hier übrigens auch, wenn man auf den prepare() verzichtet. Das braucht nämlich zwei SQL Server Roundtrips, ein prepare lohnt nur, wenn man das Statement mehr als einmal, aber mit unterschiedlichen Parameterwerten ausführt. Wenn Du den Wert in $id ordentlich in den SQL Kontext überträgst, brauchst Du kein prepare. Das tust Du je nach Datentyp von $id mit der intval()-Funktion oder mit der $pdo->quote() Methode.

Zum Beispiel:

$sql = "DELETE FROM table_1 WHERE id = " . intval($id);
$rc = $pdo->exec($sql);
if ($rc === FALSE)
   // DELETE lief auf einen Error
else
   // $rc enthält die Anzahl gelöschter Sätze

Was übrigens grundsätzlich nicht geht, ist das Einsetzen des Tabellennamens als PDO Parameter.

Rolf

--
sumpsi - posui - obstruxi