Een query binnen een query
Ik heb een query gemaakt, deze werkt.
In de tabel zijn o.a. de velden id, voornaam, achternaam, vader_id en moeder_id.
Echter binnen de query wil ik zoeken of er ook kinderen in de database voorkomen.
Dus zoek ik of de id elders in de tabel voorkomt bij vader_id of moeder_id
Dus heb ik via bindValue variabele :ouder gekoppeld aan $Gid (id van eerste query)
Ik denk dat de array fout gaat, maar weet niet goed hoe het wel moet.
Hebben jullie idee?
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
// kinderen opzoeken
$Gid='2'; // even standaard invoer voor test
//verbind database een 2e sessie voor kinderen
$pdoResult2 = $pdoConnect->prepare("SELECT * FROM db_bidprentjes WHERE vader_id LIKE :ouder
OR moeder_id LIKE :ouder ");
$pdoResult2->bindValue(':ouder', $Gid);
$pdoResult2->execute(array(':vader_id' => $Gid OR ':moeder_id' => $Gid ));
while($row2 = $pdoResult2->fetch(PDO::FETCH_ASSOC)) {
$Kid=$row2['id'];
$Kachternaam=$row2['achternaam'];
$Kvoornamen=$row2['voornaam'];
$Kvoorzetsel=$row2['voorzetsel'];
$Koverlijdensdatum=$row2['overlijdensdatum'];
$Koverlijdensplaats=$row2['overlijdensplaats'];
echo " <tr>
<td STYLE=\"text-align: right;\"><b> <a href=\"bp_view.php?zid=".$Kid."\">".$Kid."</b></td>
<td STYLE=\"text-align: left;\"><b> ".$Kvoorzetsel." ".$Kachternaam." </b></td>
<td STYLE=\"text-align: left;\"><b> ".$Kvoornamen." </b></td>
<td STYLE=\"text-align: left;\"><b> ".$Koverlijdensdatum." </b></td>
<td STYLE=\"text-align: left;\"><b> ".$Koverlijdensplaats." </b></td>
<td STYLE=\"text-align: center;\"><b> </b></td></tr>";
} // Einde while loop kinderen
$Gid='2'; // even standaard invoer voor test
//verbind database een 2e sessie voor kinderen
$pdoResult2 = $pdoConnect->prepare("SELECT * FROM db_bidprentjes WHERE vader_id LIKE :ouder
OR moeder_id LIKE :ouder ");
$pdoResult2->bindValue(':ouder', $Gid);
$pdoResult2->execute(array(':vader_id' => $Gid OR ':moeder_id' => $Gid ));
while($row2 = $pdoResult2->fetch(PDO::FETCH_ASSOC)) {
$Kid=$row2['id'];
$Kachternaam=$row2['achternaam'];
$Kvoornamen=$row2['voornaam'];
$Kvoorzetsel=$row2['voorzetsel'];
$Koverlijdensdatum=$row2['overlijdensdatum'];
$Koverlijdensplaats=$row2['overlijdensplaats'];
echo " <tr>
<td STYLE=\"text-align: right;\"><b> <a href=\"bp_view.php?zid=".$Kid."\">".$Kid."</b></td>
<td STYLE=\"text-align: left;\"><b> ".$Kvoorzetsel." ".$Kachternaam." </b></td>
<td STYLE=\"text-align: left;\"><b> ".$Kvoornamen." </b></td>
<td STYLE=\"text-align: left;\"><b> ".$Koverlijdensdatum." </b></td>
<td STYLE=\"text-align: left;\"><b> ".$Koverlijdensplaats." </b></td>
<td STYLE=\"text-align: center;\"><b> </b></td></tr>";
} // Einde while loop kinderen
Dan bind je een niet-bestaande placeholder ":ouder", levert dit geen foutmeldingen op?
Ook dit lijkt mij niet kloppen: array(':vader_id' => $Gid OR ':moeder_id' => $Gid ).
Deze code zou dus eigenlijk moeten haperen met foutmeldingen. Het is dan wel zaak dat je deze foutmeldingen visueel maakt en vervolgens kunt interpreteren. Zet hiertoe voor ontwikkeling het volgende boven je code:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');
ini_set('display_startup_errors', true);
?>
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');
ini_set('display_startup_errors', true);
?>
PDO werkt meestal met exceptions, dit houdt in dat er foutmeldingen gegenereerd worden die vervolgens ook in code opgevangen moet worden, hiertoe dien je een tweetal zaken te regelen:
1. bij het maken van een connectie middels PDO is het zaak dat je de foutafhandeling zodanig instelt dat er gebruik gemaakt wordt van exceptions. Standaard geeft PDO geen (visuele) ruchtbaarheid aan fouten dus dan wordt het niet direct evident wanneer er iets misgaat.
2. code die PDO-routines aanroept dient te worden omvat met een try-catch blok om eventuele foutmeldingen op te vangen.
Dit doe je als volgt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
try {
$db = new PDO('<connectieparameters van database>', '<gebruikersnaam>', '<wachtwoord>', array(
// de volgende instelling is overigens ook alleen geschikt voor ontwikkeling!
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// en misschien nog andere (MySQL-specifieke) opties
));
} catch (PDOException $e) {
echo $e->getMessage();
}
?>
try {
$db = new PDO('<connectieparameters van database>', '<gebruikersnaam>', '<wachtwoord>', array(
// de volgende instelling is overigens ook alleen geschikt voor ontwikkeling!
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// en misschien nog andere (MySQL-specifieke) opties
));
} catch (PDOException $e) {
echo $e->getMessage();
}
?>
EDIT: en voor/bij het uitvoeren van queries doe je iets soortgelijks.
Persoonlijk denk ik dat het voor jou makkelijker is om gebruik te maken van mysqli. Bij PDO komt veel meer kijken dan je wellicht in eerste instantie denkt. Heb je een specifieke reden om van PDO gebruik te maken?
Gewijzigd op 08/06/2018 15:31:03 door Thomas van den Heuvel
Toevoeging op 08/06/2018 16:48:28:
De huidige oplossing die ik werkend kreeg is om 2 extra queries te maken. Eerst een loop voor de vader en dan een loop voor moeder.
Een fraaiere oplossing zou zijn om dit in 1x te doen voor beide ouders. Maar dit werkt ook