Een query binnen een query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Theo Huitema

Theo Huitema

08/06/2018 15:02:06
Quote Anchor link
Daar was ik weer.

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)
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
// 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>&nbsp;&nbsp;<a href=\"bp_view.php?zid=".$Kid."\">".$Kid."</b></td>
       <td STYLE=\"text-align: left;\"><b>&nbsp;&nbsp;".$Kvoorzetsel." ".$Kachternaam." </b></td>
       <td STYLE=\"text-align: left;\"><b>&nbsp;&nbsp;".$Kvoornamen."  </b></td>
       <td STYLE=\"text-align: left;\"><b>&nbsp;&nbsp;".$Koverlijdensdatum."  </b></td>
       <td STYLE=\"text-align: left;\"><b>&nbsp;&nbsp;".$Koverlijdensplaats."  </b></td>
       <td STYLE=\"text-align: center;\"><b>&nbsp;&nbsp;      </b></td></tr>";

}      // Einde while loop kinderen
 
PHP hulp

PHP hulp

15/11/2024 05:41:19
 
Thomas van den Heuvel

Thomas van den Heuvel

08/06/2018 15:25:53
Quote Anchor link
Het hele idee van een id is dat je hier iets of iemand exact mee kunt identificeren, je gebruikt dus eigenlijk nooit "LIKE" in combinatie met id's. Dit soort vergelijkingen zijn redelijk discreet: er is wel een match, of niet.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
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)
PHP script in nieuw venster Selecteer het PHP script
1
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();
}

?>

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
 
Theo Huitema

Theo Huitema

08/06/2018 16:39:39
Quote Anchor link
Nee heb geen speciale reden om PDO te gebruiken. Dacht dat die een betere / nieuwere methode was

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
 



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.