Transaktion über mehrere Funktionen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Transaktion über mehrere Funktionen

    Hallo

    ich mache eine Transaktion welche zwei Funktionen (später mehrere) durchläuft. Am Ende soll der Commit oder Rollback gemacht werden. Jetzt glaube ich, dass der dbconnect() in den Funktionen einen automatischen Rollback erzeugt. Hat jemand einen Tipp wie ich die Transaktion am Leben erhalten kann? Gibts einen Weg die Datenbankverbindung in den Funktionen aufrecht zu erhalten? Oder machich sonst einen Denkfehler?

    Beispiel:

    dbconnect();
    @mysql_query("BEGIN");
    ...
    insertdurchführen()
    ...
    updatedurchführen()
    ...
    @mysql_query("COMMIT");

    function insertdurchführen() {
    dbconnect();
    $sql_I = 'insert beitrag set seitenid = ...............
    $result_I = @mysql_query($sql_I) ...
    }

    function updatedurchführen() {
    dbconnect();
    $sql_U = 'update beitrag set seitenid = ...............
    $result_U = @mysql_query($sql_U) ...
    }

  • #2
    1. Schmeiß alle @ weg. Du willst ja Fehlermeldungen sehen.
    2. wenn du zu Beginn ein dbconnect(); machst, dann solltest du das nicht mehr in den Funktionen tun.

    Ansonsten wäre konkreter Code hilfreich.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Zitat von Kropff Beitrag anzeigen
      1. Schmeiß alle @ weg. Du willst ja Fehlermeldungen sehen.
      2. wenn du zu Beginn ein dbconnect(); machst, dann solltest du das nicht mehr in den Funktionen tun.

      Ansonsten wäre konkreter Code hilfreich.

      Peter
      1. ich mach mich mal schlau wegen den @. Hab das bisher immer so gemacht.

      2. Wenn ich den dbconnect() weglasse bekomme ich den Feher: update failed because No database selected.

      Mehr Code? Gerne, hab die Essenz absichtlich herausgezogen:

      <?php session_start ();
      require_once ("funktionen.php");
      ?>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="XHTML namespace">
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
      <link rel="stylesheet" media="all" type="text/css" href="cms.css" />
      <style type="text/css">
      <!--
      .hier style {color: #000000}

      -->
      </style>
      <title>Beitrag bearbeiten</title>
      <!--parameter für tiny
      theme : "simple",
      theme : "advanced" ,
      plugins : "emotions,spellchecker,advhr,insertdatetime,preview"
      -->
      <script type="text/javascript" src="tinymce/jscripts/tiny_mce/tiny_mce.js"></script>
      <script type="text/javascript">
      tinyMCE.init({
      mode : "textareas",
      theme : "advanced" ,
      entity_encoding : "raw",
      language : "de",

      // Theme options - button# indicated the row# only
      theme_advanced_buttons1 : "newdocument,|,bold,italic,underline,|,justifyleft,justifycenter,justifyright,formatselect",
      theme_advanced_buttons2 : "cut,copy,paste,|,bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,image,|,code,preview,|, forecolor,backcolor",
      theme_advanced_buttons3 : "insertdate,inserttime,|,spellchecker,advhr,,removeformat,|,sub,sup,|,charmap,emotions",
      theme_advanced_toolbar_location : "top",
      theme_advanced_toolbar_align : "left",
      theme_advanced_statusbar_location : "bottom",
      theme_advanced_resizing : true


      });
      </script>
      </head>
      <body>

      <div id="container1">
      <div id="head">
      CMS by Markus
      </div>
      <div id="content">
      <a name="inhalt"></a>

      <h1>Beitrag bearbeiten</h1>
      <?php
      //VORVERARBEITUNG ***************************************************************************************************
      if (!isset($_SESSION['beitrag_durchlauf'])) {
      $_SESSION['beitrag_durchlauf'] = 1;
      } else {
      $_SESSION['beitrag_durchlauf'] += 1;
      }
      if ($_SESSION['beitrag_durchlauf'] == 1) { // vergessliches System :-)
      $_SESSION['beitrag_aktion'] = $_REQUEST['aktion'];
      $_SESSION['beitrag_seitenid'] = $_REQUEST['seitenid'];
      $_SESSION['beitrag_sort'] = $_REQUEST['sort'];
      $_SESSION['beitrag_beitragid'] = $_REQUEST['beitragid'];
      dbconnect();
      @mysql_query("BEGIN");
      //Bei Insert Datensatz schreiben vor anzeigen
      if ($_SESSION["beitrag_aktion"] == 'insert') {
      //LEER füllen
      beitraginsert();
      }
      //für alle beitrag lesen
      $sql_S = 'select * from beitrag where seitenid = ' . $_SESSION['beitrag_seitenid'] . ' and sort = ' . $_SESSION['beitrag_sort'] ;
      //echo($sql_S);
      $result_S = @mysql_query($sql_S);
      if (!$data_S = @mysql_fetch_array($result_S)) {
      $fehler = 'Beitrag konnte nicht gelesen werden. Bitte schliessen Sie das Fenster und versuchen es erneut.';
      echo($_SESSION['beitrag_aktion']);
      msg($fehler);
      }
      echo('beitragid:'.$data_S['beitragid']);
      echo($_REQUEST['aktion']);
      }
      //Butons verarbeiten **************************************************************************************************
      if (isset($_POST['abbrechen'])) {
      @mysql_query("ROLLBACK");
      schliessen();
      }
      if (isset($_POST['speichern'])) {
      $fehler = '';
      if ($_SESSION['beitrag_aktion'] == 'insert') {
      beitragupdate();
      } elseif ($_SESSION['beitrag_aktion'] == 'update') {
      beitragupdate();
      } elseif ($_SESSION['beitrag_aktion'] == 'delete') {
      beitragdelete();
      } else {
      $fehler = $fehler . ' Aktion: ' .$_SESSION['beitrag_aktion']. ' ist nicht definiert.';
      }

      if (!$fehler){
      @mysql_query("COMMIT");
      echo('commit');
      //schliessen();
      } else {
      msg($fehler);
      @mysql_query("ROLLBACK");
      }
      }
      ?>
      <a href="javascript:;" onmousedown="tinyMCE.execCommand('mceInsertContent',false,'<img alt=bla src=bilder/email.gif>');">Insert Image</a>
      <?php
      //form beginn *************************************************************************************
      echo '<form name="form1" id="form1" action="'.$HTTP_SERVER_VARS['PHP_SELF'].'" method="post">';
      ?>
      <table width="600px">
      <tr>
      <td>
      <?php
      echo '<textarea style="width:550px" rows="20" cols="1" id="beitrag' . '" name="beitrag' . '">' . $data_S['beitrag'] . '</textarea>';
      ?>
      </td>
      </tr>
      <tr>
      <td>
      </td>
      </tr>
      <tr>
      <td>
      <table align="center">
      <tr>
      <td>
      <?php
      if (($_SESSION['beitrag_aktion'] == 'delete') or ($_SESSION['beitrag_aktion'] == 'purge')){
      echo('<input type="submit" value="Löschen" name="speichern"/>');
      } else {
      echo('<input type="submit" value="Speichern" name="speichern"/>');
      }
      echo('<input type="submit" value="Test" name="test"/>');
      ?>
      <input type="submit" value=" Abbrechen" name="abbrechen"/>
      </td>
      </tr>
      </table>
      </td>
      </tr>
      </table>

      </form>

      </div>
      </div>
      </body>
      </html>
      <?php
      function beitraginsert() {
      global $fehler;

      if ($fehler == '') {
      //dbconnect();
      $sql_I = 'insert beitrag set seitenid = "'. $_SESSION['beitrag_seitenid'].'"';
      $sql_I = $sql_I . ',sort = ' . $_SESSION['beitrag_sort'];
      $sql_I = $sql_I . ',beitrag = ' . $_SESSION['beitrag_seitenid'];
      $sql_I = $sql_I . ',datumzeit = now()';
      echo($sql_I);
      $result_I = @mysql_query($sql_I) or die($fehler = 'insert failed because '.@mysql_error());
      }
      }
      function beitragupdate() {
      global $fehler;

      if ($fehler == '') {
      //dbconnect();
      $sql_U = 'update beitrag set beitrag = "'. mysql_real_escape_string($_POST['beitrag']).'"';
      $sql_U = $sql_U . ',datumzeit = now()';
      $sql_U = $sql_U . ' where seitenid = '. $_SESSION['beitrag_seitenid'].' and sort = ' . $_SESSION['beitrag_sort'];
      echo($sql_U);
      $result_U = @mysql_query($sql_U) or die($fehler = 'update failed because '.@mysql_error());
      }
      }

      function schliessen() {
      if (isset($_SESSION['beitrag_durchlauf'])) {
      unset ($_SESSION['beitrag_durchlauf']);
      }
      /* print ("<script language=\"JavaScript\">");
      print ("window.open('seite_verwalten.php#TOP".($_SESSION['beitrag_sort'] - 1) . "','_self');");
      print ("</script>"); */
      }
      ?>

      Kommentar


      • #4
        1. Bitte benutze im Editor PHP-Tags für deinen Code (). So kann das kein Mensch lesen. Und wird es wohl auch nicht.
        2. Bitte poste nur relevanten Code und nicht alles.

        Gruß
        Peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Hallo,

          würdest du den Code bitte vernünftig formatiert hier bereitstellen! Danke.

          Und zum zweiten, lies bitte richtig was Kropff geschrieben hat, nicht das du den connnect weg lassen sollst, sondern ihn nicht in jeder Funktion aufrufen sollst.

          Gruß Litter
          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
          http://www.lit-web.de

          Kommentar


          • #6
            Zitat von Kropff Beitrag anzeigen
            1. Bitte benutze im Editor PHP-Tags für deinen Code (). So kann das kein Mensch lesen. Und wird es wohl auch nicht.
            2. Bitte poste nur relevanten Code und nicht alles.

            Gruß
            Peter

            Dake Peter für Deine Hilfe

            ich konnte das Problem eingrenzen. Es liegt wohl daran, dass ich ein sogenanntes Affenformular benütze.
            Im ersten Druchlauf mache ich einen dbconnect und einen insert um die ID (autonumber) zu erhalten.
            Im zweiten bis n-ten Durchlauf dann machte ich den Update auf den neuen Datenbankeintrag. (diesen Weg wollte ich wählen um abhängige Einträge auf die neue ID machen zu können).
            --> Jetzt nehme ich an, dass beim zweiten Durchlauf die Datenbankverbindung getrennt wurde und ich deshalb den dbconnect nochmals machen musste. Gleichzeitig hat mir das System wohl einen Rollback gemacht, da der Commit noch nicht gemacht wurde.

            Jetz bleibt mir wohl nur den Insert selbst zu comitten und so Datenleichen in Kauf zu nehmen wenn der Anwender "Abbrechen drückt".

            Abschliessende Frage: gibts eine Möglichkeit für Transaction-handling in Affenformularen?

            Gruss Markus

            Kommentar


            • #7
              Was spricht dagegen, die Daten "temporär" in einer Session zu speichern und erst am Ende in die Datenbank zu schreiben?

              Kommentar

              Lädt...
              X