hulp mysql transactions
ik heb een vraag over transactions ik zal hieronder 2 query's weergeven die door middel van een transaction moeten worden uitgevoerd:
1ste:
INSERT INTO
tabel SET
tabel_naam = 'omar'
2e :
UPDATE
tabel SET
tabel_gebruikersnaam = 'deb(id van 1ste query)'
is dit mogelijk als dit mogelijk is hoe kan ik dit dan het beste doen?
Let wel op foutafhandeling, etc.
Overigens is het:
kan ik het niet met meerdere query's uitvoeren zonder dat php ertussen komt
Of je gebruikt mysql_insert_id() om de laatste ID op te halen.
is dat een mysql functie?
Omar, één tip: leer SQL en PHP, alvorens je moeilijke (voor een beginner) dingen gaat proberen te schrijven.
Ik zal even kort omschrijven wat er precies moet gebeuren een bezoeker meldt zich aan op mijn site en op basis van zijn aanmelding moet er automatisch een gebruikersnaam worden aangemaakt die gebaseerd is op de id van de laatst toegevoegde bezoeker als ik de query onderbreek door dit met php te doen zou het kunnen dat als twee bezoekers tegelijke tijd registreren dat de gegevens verkeerd worden verwerkt daarom wil ik dit met een transaction doen.
Mbv transactions kan PHP ook gewoon tussendoor hoor.
Al doe je 100 losse queries in php, dan kan het nog 1 transaction zijn.
PDO aan de gang. Maar waarschijnlijk is het beter om eerst de basics te leren.
Of ga met Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
$query = "START TRANSACTION;";
if(!mysql_query($query))
{
echo 'Query failed';
}
else
{
$q[] = "UPDATE table SET balance=balance-200 WHERE client_id=1;";
$q[] = "UPDATE table SET balance=balance+200 WHERE client_id=2;";
foreach($q as $query)
{
if(!mysql_query($query))
{
$error[] = mysql_error();
}
}
if(!empty($error))
{
echo 'Er is een fout opgetreden tijdens de transactie';
mysql_query("ROLLBACK;");
//je zou hier nog de errors kunnen afhandelen.
}
else
{
echo 'De query is geslaagd';
mysql_query("COMMIT;");
}
?>
$query = "START TRANSACTION;";
if(!mysql_query($query))
{
echo 'Query failed';
}
else
{
$q[] = "UPDATE table SET balance=balance-200 WHERE client_id=1;";
$q[] = "UPDATE table SET balance=balance+200 WHERE client_id=2;";
foreach($q as $query)
{
if(!mysql_query($query))
{
$error[] = mysql_error();
}
}
if(!empty($error))
{
echo 'Er is een fout opgetreden tijdens de transactie';
mysql_query("ROLLBACK;");
//je zou hier nog de errors kunnen afhandelen.
}
else
{
echo 'De query is geslaagd';
mysql_query("COMMIT;");
}
?>
is trouwens uit mijn hoofd dus weet niet of dit werkt.
Gewijzigd op 01/01/1970 01:00:00 door Jurgen assaasas
Om met Transactions te werken zul je wel InnoDB moeten gebruiken en geen MyISAM
Je kunt de complete transactie, inclusief start en commit, in 1 array zetten. Deze array ga je met een foreach uitlezen en het resultaat van de individuele query controleren. Mislukt de query, geef je een rollback en spring je met een break uit de foreachlus. Klaar!
http://www.phphulp.nl/forum/showtopic.php?cat=12&id=44495&page=180 en met gebruik van de mysql functie LAST_INSERT_ID()
Bedankt voor jullie hulp het is me gelukt met behulp van deze forum Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$bError = false;
$q[] = "START TRANSACTION";
$q[] = "INSERT INTO tabel1(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "INSERT INTO tabel2(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "INSERT INTO tabel3(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "COMMIT";
foreach($q AS $query){
if(!mysql_query($query)){
mysql_query("ROLLBACK;"); // foutafhandeling is hier niet nodig
$bError = true;
break; // spring uit de foreach lus, de rest heeft geen zin meer
}
}
?>
$bError = false;
$q[] = "START TRANSACTION";
$q[] = "INSERT INTO tabel1(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "INSERT INTO tabel2(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "INSERT INTO tabel3(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "COMMIT";
foreach($q AS $query){
if(!mysql_query($query)){
mysql_query("ROLLBACK;"); // foutafhandeling is hier niet nodig
$bError = true;
break; // spring uit de foreach lus, de rest heeft geen zin meer
}
}
?>
pgFrank schreef op 13.04.2008 13:40:
Dit voorbeeldje is ietsjes beter, met álle queries (behalve de ROLLABACK) in één array.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$bError = false;
$q[] = "START TRANSACTION";
$q[] = "INSERT INTO tabel1(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "INSERT INTO tabel2(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "INSERT INTO tabel3(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "COMMIT";
foreach($q AS $query){
if(!mysql_query($query)){
mysql_query("ROLLBACK;"); // foutafhandeling is hier niet nodig
$bError = true;
break; // spring uit de foreach lus, de rest heeft geen zin meer
}
}
?>
$bError = false;
$q[] = "START TRANSACTION";
$q[] = "INSERT INTO tabel1(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "INSERT INTO tabel2(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "INSERT INTO tabel3(bla,bla1,bla2) VALUES (1,2,3);";
$q[] = "COMMIT";
foreach($q AS $query){
if(!mysql_query($query)){
mysql_query("ROLLBACK;"); // foutafhandeling is hier niet nodig
$bError = true;
break; // spring uit de foreach lus, de rest heeft geen zin meer
}
}
?>
Mooie oplossing Frank.. Zodra ik aan de gang ga met InnoDB zal ik dit zeker toe gaan passen!