Transaktionen mit MySQLi

philishake

javascript enthusiast
Hallo liebe Community.

Ich versuche derzeit bei mir alles auf MySQLi umzustellen. Unter anderem möchte ich auch Transaktionen mit MySQLi nutzen. Nur leider funktionert das irgendwie nicht. Bei einer Transaktion werden ja alle Anfragen gesammelt und gemeinsam als Container an die Datenbank übergeben. Sollte eine Anfrage Fehlerhaft sein, so wird auch keine von den anderen Anfragen übermittelt. Ich habe nun diese Skript bewusst mit einem Fehler versehen gehabt, trotzdem wurden alle anderen Anfragen, die korrekt waren ausgeführt. Meine Frage ist nun, was ich falsch gemacht haben könnte. Hier nun der Code ohne bewusste Fehler:

PHP:
$db = @mysqli_connect($mysqlhost,$mysqluser,$mysqlpassword);
if(!$db)
{
  print("Fehler bei dem Connect<br>".mysqli_connect_error());
  exit();
}
else
{
  print("Erfolgreich zur Datenbank verbunden!<br>");
}

mysqli_autocommit($db, FALSE);

$anfrage = "USE db167074_12";
mysqli_query($db, $anfrage);

$anfrage = "CREATE TABLE chat_user_new (
              id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
              nickname VARCHAR(50),
              pw VARCHAR(50),
              email VARCHAR(50),
              zeit TIMESTAMP)
              Type=InnoDB";
mysqli_query($db, $anfrage);

$anfrage = "CREATE TABLE chat_sessions_valid (
              session_id VARCHAR(255),
              id_registered INT,
              zeit TIMESTAMP)
              Type=InnoDB";
mysqli_query($db, $anfrage);

mysqli_commit($db);
mysqli_close($db);

Vielen Dank schonmal im voraus!
philishake
 
Ja ich weiß das man seinen Thread nicht pushen darf. Allerdings Wäre er sonst in der Sänke verschwunden.

Commit Befehle sind eigentlich alle drin. Ich habs diesmal sogar nach nem Tutorial abgetippt.

PHP:
mysqli_autocommit($db, FALSE);

schaltet commit aus. Dann folgen alle Queries und anschließend wir mittels

PHP:
mysqli_commit($db);
mysqli_close($db);

Alle Queries übermittelt.
Zumindest soll es laut Buch (PHP Workshop) so funktionieren.
 
Hi, also ich hab mir das mal durchgelesen und gestestet aber irgend schein PHP damit nichts anfangen zu können... das sieht mir auch nicht so aus, als könnte man das einfach so im PHP-Code anwenden.

Laut dem Buch heißt es, das man "autocommit" ausschalten soll. Dann alle Queries sammlen und mittels "mysqli_commit" an die Datenbank übergibt. Das tolle an den Transaktionen ist ja, das wenn eine aus der Gruppe fehlherhaft ist, keine gesendet wird.

Irgendwelche Tipps wie ich da weiter komme. Mein FTP unterstüzt PHP5 und MySQL 4.1.x. Und ich habe vollen Zugriff auf meine php.ini, in der ich bereits die Libary für MySQLi geladen habe und erfolgreich getestet habe.
 
Danke.

Der Link hat mir schon weitergeholfen. Allerdings fuktioniert es nach wie vor nicht wie ich mir das denke... weil es mir darum geht mehrere Queries nacheinander zu senden, oder besser gesagt gemeinsam. Ich poste mal eben meinen unschönen Test-Code:

PHP:
function begin() 
{
  mysql_query("BEGIN");
}
function commit()
{
  mysql_query("COMMIT");
}
function rollback()
{
  mysql_query("ROLLBACK");
}
mysql_connect($mysqlhost,$mysqluser,$mysqlpassword) or die(mysql_error());
mysql_select_db($mysqldb) or die(mysql_error());

$anfrage[0] = "CREATE TABLEs chat_user_new (
              id INT AUTO_INCREMENT NOT NULL PRIMARY KEY)
              Type=InnoDB";

$anfrage[1] = "CREATE TABLE chat_sessions_valid (
              id INT AUTO_INCREMENT NOT NULL PRIMARY KEY) Type=InnoDB";

$i = 1;

begin(); // transaction begins

echo "let's go<br>";

while($i >= 0)
{
  $error = 0;
  
  echo "<b>query:</b> ".$anfrage[$i]."<br>";
  $result = mysql_query($anfrage[$i]);
  if(!$result)
  {
    rollback(); // transaction rolls back
    echo "you rolled back: ".$i."<br>";
    $error++;
  }
  
  $i--;
}
echo "error: ".$error."<br>";
if($error >= 1)
{
  echo "epic fail";
}
else 
{
  commit(); // transaction is committed
  echo "your insertion was successful";
}
 
Also ich hab das jetzt 10x hin und her probiert, teilweise komplette Tutorials Codes kopiert und benutzt, aber es funktioniert einfach nicht. Arbeitet von euch keiner Mit Transaktionen ?
 
Zurück