PHP, PDO en geen resultaten
Verschillende versies, verschillende kenmerken. Verschillende redenen tot frustratie. Neem aan dat de volgende query voor de juiste waarde van :x
(bijvoorbeeld 10
) drie rijen teruggeeft.
SELECT a, b, c FROM Abc WHERE a < :x AND b > :x
Neem nu aan dat je volgende code gebruikt om die rijen op te halen in PHP, met behulp van PDO:
$sql = "SELECT 'AbcClass', a, b, c FROM Abc WHERE a < :x AND b > :x";
$statement = $pdo->prepare($sql);
$statement->bindParam(':x', 10);
$results = array();
if ($statement->execute()) {
while ($result = $statement->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE)) {
$results[] = $result;
}
}
Hoeveel rijen zal je terugkrijgen? Het antwoord: het hangt af van de versie van PHP die je gebruikt. Op mijn computer is dat 5.2.0 en daar krijg ik de 3 rijen terug die ik verwacht. Op de server die me met het probleem confronteerde is dat echter 5.2.6 (rejoice: een betaalbare Belgische host met een degelijke PHP 5 installatie; pigs do fly). En wat blijkt, sinds PHP 5.2.1, wordt in dit voorbeeld 10
enkel de eerste keer aan :x
gebonden.
Dus moet het dit worden:
$sql = "SELECT 'AbcClass', a, b, c FROM Abc WHERE a < :x AND b > :y";
$statement = $pdo->prepare($sql);
$statement->bindParam(':x', 10);
$statement->bindParam(':y', 10);
$results = array();
if ($statement->execute()) {
while ($result = $statement->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE)) {
$results[] = $result;
}
}
Misschien zal ik toch eens de tijd moeten nemen om PHP op mijn computer te updaten om dit soort toestanden in de toekomst te vermijden.
Dit artikel werd opgenomen in ontwikkeling.
Andries Louw Wolthuizen 27 Oct 2008 19:17
Gek idee wellicht, maar werkt 2 keer achter elkaar bindParam(:x,10) niet? Of bestaat bindParam_all wellicht? (Net zoiets als preg_match_all?)
Kevin 27 Oct 2008 20:57
Nee en nee. Dit is de enige methode die werkt. Niet dat ik daarover iets terugvind in de documentatie…