Doorgaan bij 3 juiste querys
Weet iemand hoe ik dit doe?
Want als ik het volgende script gebruik, worden ze volgens mij gelijk uitgevoerd.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
// 3 voorbeeld query's:
$tekst1 = "INSERT INTO gebruikers (naam, leeftijd) VALUES('Tom', '16')";
$query1 = mysql_query($tekst1);
$tekst2 = "SELECT * FROM gebruikers WHERE naam='Jan'";
$query2 = mysql_query($tekst2);
$tekst3 = "UPDATE gebruikers SET leeftijd='25'";
if($query1 != true || $query2 != true || $query3 != true){
error_message();
}
?>
// 3 voorbeeld query's:
$tekst1 = "INSERT INTO gebruikers (naam, leeftijd) VALUES('Tom', '16')";
$query1 = mysql_query($tekst1);
$tekst2 = "SELECT * FROM gebruikers WHERE naam='Jan'";
$query2 = mysql_query($tekst2);
$tekst3 = "UPDATE gebruikers SET leeftijd='25'";
if($query1 != true || $query2 != true || $query3 != true){
error_message();
}
?>
Nu worden ze dacht ik gelijk uitgevoerd, maar ik wil het zo hebben:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
/*
hier de query's
als niet alle query's uitgevoerd kunnen worden{
geef error
exit;
}
voer query's uit
*/
?>
/*
hier de query's
als niet alle query's uitgevoerd kunnen worden{
geef error
exit;
}
voer query's uit
*/
?>
Ik wil het zo ongeveer, is dit mogelijk, en kan iemand me hiermee helpen?
Bedoel je
- De SELECT vindt 1 record
- De INSERT wordt uitgevoerd (=> 1 nieuw record)
- De UPDATE verandert minstens 1 record
?
Staat trouwens het veld naam als UNIQUE?
Kan je misschien iets duidelijker uitleggen wat je met uitvoeren bedoeld? Je spreekt jezelf namelijk tegen. Er moeten 3 query's worden uitgevoerd. Als deze succesvol zijn, wat moet er dan gebeuren? Wanneer deze niet succesvol zijn, wat wil je dat er dan gebeurt?
Ik wil dat als alle query's uitvoerbaar zijn (dus de or die() niet word uitgevoerd), dat ze dan allemaal uitgevoerd worden, en dat je anders een error message krijgt.
Ik hoop dat het zo wat duidelijker is.
Toevoeging op 13/02/2013 12:07:28:
Sorry, ik heb het inderdaad nogal vervelend uitgelegd.
Ik wil dat als alle query's uitvoerbaar zijn (dus de or die() niet word uitgevoerd), dat ze dan allemaal uitgevoerd worden, en dat je anders een error message krijgt.
Ik hoop dat het zo wat duidelijker is.
JE start een transactie, doet je query's.
Gaat er iets fout doe je een rollback en anders een commit.
- database server connectie kan niet worden gemaakt
- geen database geselecteerd
- fout in je query
- index die problemen geeft (dubbele waardes bijvoorbeeld)
De eerste twee kan je al afvangen voor je aan je eerste query begint.
De derde kan je afvangen door gewoon goed te testen. Als je geen fouten maakt in je query zal je hier nooit last van krijgen.
De laatste is degene die je runtime problemen kan geven die je niet tijdens het ontwikkelen volledig kan voorkomen. Dus gebruik je indexen die inserts of updates zouden kunnen blokkeren? Is dat het geval dan kan je zelfs nog de problemen voorkomen door je data vooraf te checken, of in de query op te lossen (bijvoorbeeld in een insert statement kan je 'ON DUPLICATE KEY' gebruiken.
Een transactie is een laatste mogelijkheid, maar als het je alleen gaat om query fouten te voorkomen dan raad ik je aan eerst je queries gewoon netjes op orde te hebben.
Tom Tom op 13/02/2013 12:07:17:
... Ik wil dat als alle query's uitvoerbaar zijn (dus de or die() niet word uitgevoerd), ...
Noteer ook mijn gereserveerdheid, en bekijk de reacties hier boven.
Maar ik zie wel een mogelijkheid.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$sql1 = "SELECT ...";
$sql2 = "INSERT ...";
$sql3 = "UPDATE ...";
if (
($res1 = mysql_query($sql1))
&& ($res2 = mysql_query($sql2))
&& ($res3 = mysql_query($sql3))
) {
echo 'gelukt';
}
else {
echo 'niet gelukt';
}
?>
$sql1 = "SELECT ...";
$sql2 = "INSERT ...";
$sql3 = "UPDATE ...";
if (
($res1 = mysql_query($sql1))
&& ($res2 = mysql_query($sql2))
&& ($res3 = mysql_query($sql3))
) {
echo 'gelukt';
}
else {
echo 'niet gelukt';
}
?>
Gewijzigd op 13/02/2013 12:58:08 door Kris Peeters
@Kris: Wat gebeurt er nu als de 3e query misluk, worden de 1e en 2e dan wel uitgevoerd, want daar lijkt het namelijk wel op.
Nee, je moet dan zien bij transaction.
Google eens "pdo transaction rollback" of "mysqli transaction rollback"
( http://php.net/manual/en/mysqli.rollback.php en http://php.net/manual/en/pdo.rollback.php )
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$mysqli = new mysqli("localhost", "gebruiker", "wachtwoord", "gebruiker_db");
if (mysqli_connect_errno()) {
printf("Verbinding mislukt: %s\n", mysqli_connect_error());
exit();
}
$mysqli->autocommit(false);
$all_query_ok=true; // our control variable
//we make 4 inserts, the last one generates an error
//if at least one query returns an error we change our control variable
$mysqli->query("INSERT INTO logs-schiet (game) VALUES (1)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO logs-schiet (game) VALUES (2)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO logs-schiet (game) VALUES (3)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO logs-schiet (game) VALUES (4)") ? null : $all_query_ok=false; //duplicated PRIMARY KEY VALUE
//now let's test our control variable
$all_query_ok ? $mysqli->commit() : $mysqli->rollback();
$mysqli->close();
?>
$mysqli = new mysqli("localhost", "gebruiker", "wachtwoord", "gebruiker_db");
if (mysqli_connect_errno()) {
printf("Verbinding mislukt: %s\n", mysqli_connect_error());
exit();
}
$mysqli->autocommit(false);
$all_query_ok=true; // our control variable
//we make 4 inserts, the last one generates an error
//if at least one query returns an error we change our control variable
$mysqli->query("INSERT INTO logs-schiet (game) VALUES (1)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO logs-schiet (game) VALUES (2)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO logs-schiet (game) VALUES (3)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO logs-schiet (game) VALUES (4)") ? null : $all_query_ok=false; //duplicated PRIMARY KEY VALUE
//now let's test our control variable
$all_query_ok ? $mysqli->commit() : $mysqli->rollback();
$mysqli->close();
?>
Als ik een fout maak in een query zie ik niks en komt er niks in de database.
Maar als ik de query's goed doe zie ik ook niks en komt er nog steeds niks in de database.
Zie iemand wat er hier fout gaat?
bv. zo
$all_query_ok = $mysqli->query("INSERT INTO logs-schiet (game) VALUES (1)") ? true : false;
---
Die variabele $all_query_ok zal trouwens overschreven worden (bv. tweede INSERT faalt; derde is goed).
Best dus iets gebruiken als
Code (php)
Gewijzigd op 13/02/2013 17:10:23 door Kris Peeters
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
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
<?php
$mysqli = new mysqli("localhost", "gebruiker", "wachtwoord", "gebruiker_db");
if (mysqli_connect_errno()) {
printf("Verbinding mislukt: %s\n", mysqli_connect_error());
exit();
}
$mysqli->autocommit(false);
$all_query_ok = array();
//we make 4 inserts, the last one generates an error
//if at least one query returns an error we change our control variable
$all_query_ok[] = $mysqli->query("INSERT INTO `logs-schiet` (game) VALUES (1)") ? true : false;
$all_query_ok[] = $mysqli->query("INSERT INTO `logs-schiet` (game) VALUES (2)") ? true : false;
$all_query_ok[] = $mysqli->query("INSERT INTO `logs-schiet` (game) VALUES (3)") ? true : false;
$all_query_ok[] = $mysqli->query("INSERT INTO `deze-tabel-bestaat-niet` (game) VALUES ('Hallo meneer, hoe gaat het?')") ? true : false;
if (in_array(false, $all_query_ok)) {
echo 'Er is iets fout gegaan!';
exit;
}
$mysqli->commit();
$mysqli->close();
?>
$mysqli = new mysqli("localhost", "gebruiker", "wachtwoord", "gebruiker_db");
if (mysqli_connect_errno()) {
printf("Verbinding mislukt: %s\n", mysqli_connect_error());
exit();
}
$mysqli->autocommit(false);
$all_query_ok = array();
//we make 4 inserts, the last one generates an error
//if at least one query returns an error we change our control variable
$all_query_ok[] = $mysqli->query("INSERT INTO `logs-schiet` (game) VALUES (1)") ? true : false;
$all_query_ok[] = $mysqli->query("INSERT INTO `logs-schiet` (game) VALUES (2)") ? true : false;
$all_query_ok[] = $mysqli->query("INSERT INTO `logs-schiet` (game) VALUES (3)") ? true : false;
$all_query_ok[] = $mysqli->query("INSERT INTO `deze-tabel-bestaat-niet` (game) VALUES ('Hallo meneer, hoe gaat het?')") ? true : false;
if (in_array(false, $all_query_ok)) {
echo 'Er is iets fout gegaan!';
exit;
}
$mysqli->commit();
$mysqli->close();
?>
Maar nu worden er alsnog 3 rijen in de database opgeslagen, ondanks de exit;
(Ik krijg wel de error)
Kan iemand me dit uitleggen?
Gewijzigd op 13/02/2013 18:20:57 door Tom aan t Goor