PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Transaktion über mehrere Funktionen (https://www.php-resource.de/forum/php-developer-forum/102758-transaktion-ueber-mehrere-funktionen.html)

ratmalwer 15-03-2012 12:37

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

Kropff 15-03-2012 12:41

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

ratmalwer 15-03-2012 13:19

Zitat:

Zitat von Kropff (Beitrag 659859)
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>"); */
}
?>

Kropff 15-03-2012 13:21

1. Bitte benutze im Editor PHP-Tags für deinen Code (http://www.php-resource.de/forum/images/editor/php.gif). So kann das kein Mensch lesen. Und wird es wohl auch nicht.
2. Bitte poste nur relevanten Code und nicht alles.

Gruß
Peter

litterauspirna 15-03-2012 13:24

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

ratmalwer 17-03-2012 02:02

Zitat:

Zitat von Kropff (Beitrag 659862)
1. Bitte benutze im Editor PHP-Tags für deinen Code (http://www.php-resource.de/forum/images/editor/php.gif). 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

TobiaZ 17-03-2012 12:19

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


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:01 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG