tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
396
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    _hq_ _hq_ ist offline Mitglied
    Registriert seit
    Jan 2012
    Beiträge
    14
    Hallo,

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

    PHP-Code:
    $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?
    Geändert von _hq_ (27.01.12 um 15:20 Uhr)
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist gerade online n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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
    Code sql:
    1
    2
    
    DELETE table_a
    WHERE id = {$id}
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    _hq_ _hq_ ist offline Mitglied
    Registriert seit
    Jan 2012
    Beiträge
    14
    Danke für die Hilfe, deine Lösung klingt logisch, aber auch etwas verschachtelt. Könnte folgendes funktionieren:

    PHP-Code:
    $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.
     

  4. #4
    _hq_ _hq_ ist offline Mitglied
    Registriert seit
    Jan 2012
    Beiträge
    14
    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).
    Geändert von _hq_ (28.01.12 um 14:49 Uhr)
     

  5. #5
    _hq_ _hq_ ist offline Mitglied
    Registriert seit
    Jan 2012
    Beiträge
    14
    So, jetzt aber:

    PHP-Code:
    $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.
    Geändert von _hq_ (29.01.12 um 14:35 Uhr)
     

  6. #6
    Avatar von Lime
    Lime Lime ist gerade online frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    373
    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.
     

  7. #7
    _hq_ _hq_ ist offline Mitglied
    Registriert seit
    Jan 2012
    Beiträge
    14
    Danke für die Info. Weißt du, ob man dieses Verhalten auch unterbinden kann?
     

  8. #8
    Avatar von Lime
    Lime Lime ist gerade online frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    373
    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...
     

  9. #9
    Avatar von Raisch
    Raisch Raisch ist offline extraordinary bit
    Registriert seit
    Aug 2011
    Ort
    Berlin
    Beiträge
    333
    Zitat Zitat von _hq_ Beitrag anzeigen
    Danke für die Info. Weißt du, ob man dieses Verhalten auch unterbinden kann?
    Das zu unterbinden würde, meiner Meinung nach, dem Sinn einer relationalen Datenbank widersprechen.

    Gruß
     

  10. #10
    Avatar von Yaslaw
    Yaslaw Yaslaw ist gerade online n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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.
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

Ähnliche Themen

  1. JSF "Komponenten dynamisch rendern" oder auch "die 'nächste' Seite beeinflussen"
    Von Wutklumpen im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 22.09.09, 13:51
  2. "Windows Server 2003" oder "Widnows Small Business"
    Von flukas im Forum Microsoft Windows
    Antworten: 6
    Letzter Beitrag: 07.07.08, 08:15
  3. Antworten: 3
    Letzter Beitrag: 04.12.07, 10:36
  4. Antworten: 18
    Letzter Beitrag: 17.08.05, 08:19
  5. Antworten: 2
    Letzter Beitrag: 05.01.05, 04:07