Raketenwilli: Geht auch bei beliebigen Tabellennamen + Hinweis zu Constraints.

Beitrag lesen

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

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

Nicht nur dann. Der Name kann beliebig sein:

$arTables' = [ 'foo', 'bar', 'baz' ];
# …
foreach ( $arTables as $item ) {
    delete_id( $pdo, $item, $id );
}

Aber, es könnten Probleme auftreten. Wie ich das sehe braucht es hier, besonders im Hinblick aufhier möglicherweise korrekt verwendete Constraints, wohl etwas mehr Aufmerksamkeit bei Fehlern.

Denkbar wäre z.B. mit $pdo->beginTransaction() zu beginnen (Handbuch) , nach dem letzten erfolgreichen DELETE mit $pdo->commit() zu reagieren und im Fehlerfall $dbo->rollBack(); anzuwenden. Nicht zu vergessen die Reaktionen im User-Interface und Logeinträge fürs Debugging…

<?php
$arTables = [ 'foo', 'bar', 'baz' ];
# …
$pdo -> beginTransaction();
$has_error = false;
foreach ( $arTables as $item ) {
    if ( false === delete_id( $pdo, $item, $id ) ) {
        $dbo -> rollBack();
        $has_error = true;
        trigger_error( "Fehler beim Löschen von ID $id aus Tabelle $item", E_USER_WARNING );
        break;
    }
}
if ( false === $has_error )  {
    $pdo -> commit();
}

Hinweis: Der hier gezeigte Code ist ein Beispiel und im Hinblick auf den Aufwand mit der hierfür zu schaffende Testumgebung außer mit dem Linter (reine Syntaxprüfung) nicht getestet.


Wenn jemand grundlos auf [-1] klicken will ohne einen Fehler benennen zu wollen (weil er es nicht kann), dann soll ES das halt in der hier schon oftmals gezeigten Absicht tun, die Stimmung im Forum zu „verbessern“…