2 x "insert into" - Alles oder nichts

_hq_

Grünschnabel
Hallo,

ich schreibe mit folgenden Code zwei Einträge in meine Datenbank:

PHP:
$database= new mysqli('HOST', 'USER', 'PW', 'DB');
if (mysqli_connect_errno()) {
  echo 'Fehlermeldung!';
  exit();
}

$query = "insert into table_a values ('', '$a')";
$result = $database->query($query);
if (!$result) {
  echo 'Fehlermeldung!';
  $database->close();
  exit();
} 

$id = $database->insert_id;

$query = "insert into table_b values ('$id', '$b')";
$result = $database->query($query);
if (!$result) {
  echo 'Fehlermeldung!';
  $database->close();
  exit();
}

Allerdings habe ich Angst vor dem Tag, an dem Anweisung 1 ausgeführt wird und Anweisung 2 nicht. Ist es in PHP möglich, dass keine Anweisung ausgeführt wird wenn es zu einem Fehler kommt? Hat dieses Kind einen Namen?
 
Zuletzt bearbeitet:
Du kannst am schluss ein Housekeeping-Script laufen lassen
hole nach dem INSERT mit $database->insert_id die id heraus.

Wenn b jetzt auf einen Fehler läuft
SQL:
DELETE table_a
WHERE id = {$id}
 
Zuletzt bearbeitet von einem Moderator:
Danke für die Hilfe, deine Lösung klingt logisch, aber auch etwas verschachtelt. Könnte folgendes funktionieren:

PHP:
$database= new mysqli('HOST', 'USER', 'PW', 'DB'); 
if (mysqli_connect_errno()) { 
  echo 'Fehlermeldung!'; 
  exit(); 
} 

$database->autocommit(FALSE);

$query = "insert into table_a values ('', '$a')"; 
$database->query($query);
 
$id = $database->insert_id; 

$query = "insert into table_b values ('$id', '$b')"; 
$database->query($query);

if (!$database->commit()) {
	$database->rollback();
	echo 'Fehlermeldung';
	exit();
}

Ich bin zurzeit leider an keinem PC, an dem ich es testen kann.
 
Nein, der Code funktioniert leider nicht. Nur die erste Datenbankabfrage wird ausgeführt. Kennt sich jemand mit rollback/commit aus und kann den Fehler ausbessern? Vermutlich hapert es an einer Kleinigkeit (hoffe ich).
 
Zuletzt bearbeitet:
So, jetzt aber:

PHP:
$database= new mysqli('HOST', 'USER', 'PW', 'DB');  
if (mysqli_connect_errno()) {  
  echo 'Fehlermeldung!';  
  exit();  
}  

$database->autocommit(FALSE);

$query_ok = true; 

$query = "insert into table_a values ('', '$a')";  
if (!$database->query($query)) {
    $query_ok = false; 
} 
  
$id = $database->insert_id;  

$query = "insert into table_b values ('$id', '$b')";  
if (!$database->query($query)) {
    $query_ok = false; 
} 

if ($query_ok == false) { 
    $database->rollback(); 
    echo 'Fehler: ...'; 
} else {
    $database->commit();
    echo 'Eintrag erfolgreich!';
}

Allerdings wundert es mich, dass "auto_increment" (erste Spalte in table_a) weiterzählt, wenn $query_ok den Wert "false" annimmt.
 
Zuletzt bearbeitet:
Sobald du einen Eintrag mit auto_increment gemacht hast und diesen löscht, wird er dennoch gezählt. Wieso das so ist, kann viele Gründe haben. Ich weiß es nicht, kann aber spekulieren, dass es mit möglichen Updates zu tun haben könnte, welche dann neue Einträge überschreiben würden.

Jedenfalls sind bereits verwendete IDs immer ausgeschlossen von AI.
 
Weiß ich leider nicht. Ich kann es mir auch nicht vorstellen, weil wie gesagt bei gelöschten Einträgen von einer Benutzerdatenbank dann möglicherweise noch Verweise auf andere Tabellen vorhanden wären...
 
Dann musst du die ID von Hand vergeben. Ich abe mal ein SQL-Statment geschrieben, welches die erste freie ID aussucht.
MySQL First not used Id

ACHTUNG!
Eignet sich nicht um in einer Multiuser-Umgebung die IDs zu vergeben, da zwieschen ID auslesen und neuen Beitrag posten jemand anderes die ID besetzen kann.
 
Zurück