Doorgaan bij 3 juiste querys

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Tom aan t Goor

Tom aan t Goor

13/02/2013 11:03:39
Quote Anchor link
Zoals de titel al zegt, ik wil pas doorgaan als 3 query´s succesvol zijn uitgevoerd. Als dit niet zo is, wil ik dat ze alle drie niet worden uitgevoerd.

Weet iemand hoe ik dit doe?
Want als ik het volgende script gebruik, worden ze volgens mij gelijk uitgevoerd.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}

?>

Nu worden ze dacht ik gelijk uitgevoerd, maar ik wil het zo hebben:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
*/

?>


Ik wil het zo ongeveer, is dit mogelijk, en kan iemand me hiermee helpen?
 
PHP hulp

PHP hulp

26/04/2024 07:11:03
 
Kris Peeters

Kris Peeters

13/02/2013 11:16:49
Quote Anchor link
Wel, begin eens met duidelijk te maken wat "succesvol" precies is.

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?
 
Bernhard Flokstra

Bernhard Flokstra

13/02/2013 11:18:29
Quote Anchor link
Tom,
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?
 
Tom aan t Goor

Tom aan t Goor

13/02/2013 12:07:17
Quote Anchor link
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.

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.
 
TJVB tvb

TJVB tvb

13/02/2013 12:14:32
Quote Anchor link
Zoek eens op transactions.
JE start een transactie, doet je query's.
Gaat er iets fout doe je een rollback en anders een commit.
 
Erwin H

Erwin H

13/02/2013 12:22:33
Quote Anchor link
Een query die fout gaat doordat hij niet kan worden uitgevoerd gebeurt niet al te snel. Meest voorkomende oorzaken:
- 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.
 
Kris Peeters

Kris Peeters

13/02/2013 12:53:41
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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';
}

?>
Gewijzigd op 13/02/2013 12:58:08 door Kris Peeters
 
Tom aan t Goor

Tom aan t Goor

13/02/2013 13:01:37
Quote Anchor link
@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.
 
Kris Peeters

Kris Peeters

13/02/2013 13:19:00
Quote Anchor link
O ja, dat bedoelde je...

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 )
 
Tom aan t Goor

Tom aan t Goor

13/02/2013 16:59:11
Quote Anchor link
Ik heb nu uiteindelijk dit script:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>


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?
 
Kris Peeters

Kris Peeters

13/02/2013 17:06:42
Quote Anchor link
Gebruik de ternary anders.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$all_query_ok
= array();

$all_query_ok[] = $mysqli->query("INSERT INTO logs-schiet (game) VALUES (1)") ? true : false;
...

if (in_array(false, $all_query_ok)) {
// er is een fout
}
?>
Gewijzigd op 13/02/2013 17:10:23 door Kris Peeters
 
Tom aan t Goor

Tom aan t Goor

13/02/2013 18:17:54
Quote Anchor link
Ik begrijp iets niet, ik heb er nu het volgende van gemaakt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
?>


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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.