Meerdere queries tegelijk uitvoeren
Het zal vast wel eens voorgekomen zijn dat je in een script op een punt komt waar je meerdere queries moet uitvoeren. Een van de nieuwe features die beschikbaar zijn in de mysqli extensie, is de mogelijkheid om meerdere queries tegelijkertijd uit te voeren. Met tegelijkertijd bedoel ik dan het uitvoeren van de queries in 1 stap oftewel door maar 1 keer de query() methode te gebruiken.
Voorbeeld 8: Het uitvoeren van meerdere queries tegelijk
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
$mysqli = new mysqli('host', 'user', 'password', 'database');
if(mysqli_connect_errno())
{
trigger_error('Fout bij verbinding: '.$mysqli->error);
}
$sql = "
INSERT INTO gegevens (naam, email)
VALUES ('Piet', '[email protected]')
;
UPDATE inserts
SET last_insert = NOW()
WHERE naam = 'Piet'
";
if(!$mysqli->multi_query($sql))
{
trigger_error('Fout in query: '.$mysqli->error);
}
else
{
do
{
if($mysqli->affected_rows > 0)
{
echo 'Query gelukt <br>';
}
}
while($mysqli->next_result());
}
?>
Allereerst hebben we hier twee queries samengevoegd door ze te scheiden met een ;. Vervolgens gebruiken we de multi_query() methode om deze queries uit te voeren. Als blijkt dat die queries gelukt zijn, gebruiken we een do/while loop voor het controleren van de resultaten.
Het gebruik van deze methode is een beetje tricky aangezien de controle van de queries nogal lastig gaat. In dit geval controleren we de waarde van de affected_rows eigenschap in de do/while loop om te zien of er iets in de database aangepast is. Met de next_result() methode zorgen we dat het resultaat van de volgende query gecontroleerd wordt. Het lastige van dit hele verhaal is dat je de queries niet afzonderlijk kunt controleren, het do gedeelte van de loop verandert namelijk niet en wordt toegepast op het resultaat van ieder query.
In het volgende voorbeeld zal dat duidelijker worden.
Voorbeeld 9: Meerdere SELECT queries
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
$mysqli = new mysqli('host', 'user', 'password', 'database');
if(mysqli_connect_errno())
{
trigger_error('Fout bij verbinding: '.$mysqli->error);
}
$sql = "SELECT naam, email FROM tabel; SELECT naam FROM tabel";
if(!$mysqli->multi_query($sql))
{
trigger_error('Fout in query: '.$mysqli->error);
}
else
{
do
{
if($result = $mysqli->store_result())
{
while($row = $result->fetch_assoc())
{
echo $row['naam'].'-'.$row['email'].'<br>';
}
}
if($mysqli->more_results())
{
echo 'Resultaat van volgende query:<br>';
}
}while($mysqli->next_result());
}
?>
Het verschil met het vorige voorbeeld is dat we nu te maken hebben met een resultaat set waar we gegevens uit willen halen. Daartoe gebruiken we de methode store_result() om beschikking te krijgen over een mysqli_result object. Vervolgens kunnen we met de fetch_assoc() methode de resultaten fetchen en daarna weergeven.
De more_results() methode retourneert TRUE als er nog meer resultaat sets zijn die verwerkt kunnen worden. Om de volgende resultaat set te laden gebruiken we de next_result() methode.
Het probleem waar ik het al over had zit hem dus in het do-gedeelte van de loop. Dat gedeelte verandert niet en wordt dus toegepast op het resultaat van elke query. In dit geval zal de tweede query dus een probleem opleveren aangezien daar geen veld 'email' opgehaald wordt. Het script zal dus een aantal notices geven aangezien de variabele $row['email'] niet zal bestaan.
Let dus goed op als je deze methode gebruikt om meerdere queries uit te voeren. Ik zou aanraden om dit alleen te gebruiken voor bijvoorbeeld INSERT, UPDATE of DELETE queries. Daarvan kun je immers met eenzelfde do-statement controleren of een query gelukt is. Deze methode is minder geschikt voor het uitvoeren van meerdere SELECT queries, iets dat met een goed datamodel bovendien bijna niet voor zal komen.
Inhoudsopgave
- Inleiding
- Transacties met mysqli: commit() en rollback()
- Proceduraal vs. Object georienteerd
- Uitbreiden van de mysqli klasse
- Object georienteerde interface van mysqli
- Slotwoord en referenties
- Meerdere queries tegelijk uitvoeren
- Prepared statements