dedlfix: Try & Catch sauberer Stil oder zu aufwändig?

Beitrag lesen

echo $begrüßung;

Mittlerweile hab ich das Problem erfolgreich nachgestellt. Es sieht so aus, als ob PDO die Verschachtlung nicht verkraftet, und nicht merkt, dass der Fehler zum inneren Statement gehört.

Wenn du zuerst mit fetchAll() die komplette Ergebnismenge abholst, dann darüber iterierst (foreach) und dabei das INSERT ausführst, kommt die extra Exception nicht mehr.

Eine Frage bleibt aber:


$result = $DBO->query("SELECT dep_name FROM departments") or warning($DBO);
while ($row = $result->fetch()) {
  if (strtoupper($d_name) != strtoupper($row['dep_name'])) {
    try {
      $DBO->exec("INSERT INTO departments (dep_name) VALUES ('$d_name')");
      $DepartmentsID = $DBO->lastInsertId();
    } catch(PDOException $e) {
      print "Error / FEHLER!: " . $e->getMessage() . "<br/>";
    }
  } else {
    $department_check = "same";
  }
}//while

Welche Aufgabe hat dieses Codestück eigentlich? Ich sehe je eine Zuweisung an $DepartmentsID und an $department_check innerhalb der Schleife, doch ihre Werte werden gar nicht verwendet. Stattdessen kann es vorkommen, dass sie ein paar Mal einfach nur neu gesetzt werden.

Mir scheint, das Konstrukt soll nur dann etwas einfügen, wenn es bisher noch nicht vorkam. Wenn dem so ist, tät ich das wohl ungefähr so machen:

if ((INSERT IGNORE INTO departments (dep_name) VALUES($d_name))->rowCount())
    // eingefügt
  else
    // schon vorhanden

oder (ohne IGNORE)

try
    INSERT INTO departments (dep_name) VALUES($d_name)
    // eingefügt
  catch
    // schon vorhanden

oder

if ((SELECT count(*) ... WHERE dep_name = $d_name)->fetchColumn(0))
    // schon vorhanden
  else
    INSERT INTO departments (dep_name) VALUES($d_name)
    // eingefügt

echo "$verabschiedung $name";