Zojuist bij het selecteren van een record door middel van ID, viel me op dat MySQL de intval van de ingegeven ID neemt.
Ik heb even rondgezocht op het www, maar kan niets anders vinden dan dat dit expected behaviour is van MySQL 5.0 (MySQL tja...).

Wat code:
<?php
$sql = 'SELECT id FROM table WHERE id = :id';

// 1
$stmt->bindParam(':id', 1, PDO::PARAM_INT);
//geeft record met ID 1 terug

// 2
$stmt->bindParam(':id', '1abc', PDO::PARAM_INT);
//geeft ook record met ID 1 terug
?>

Ik vind dit nogal vreemd, er zijn natuurlijk wel oplossingen zoals het extenden van PDO en zo de prepare aanpassen, of voor integers sprintf gebruiken, maar dat bevalt me niet zo.

Andere ideeën voor MySQL?
Leuk leesvoer, kwam ik toevallig gisteren tegen. Er staat onder andere in beschreven hoe PDO intern werkt, en wat daarvan de nadelen zijn.

Daarnaast vraag ik me af wat jij bedoelt met onverwacht gedrag: bindParam(':id', '1abc', PDO::PARAM_INT); Het lijkt mij niet onverwacht dat PDO (en niet de MySQL server) hier het argument naar een int cast.
De vergissing die ik blijkbaar maak is dat de derde parameter van bindParam niet valideert, maar cast. Zie hier: http://www.sitepoint.com/forums/showthread.php?t=508503

Dat vind ik maar onhandig, het lijkt me netjes om de gebruiker een foutmelding of iets dergelijks te tonen als deze een foutief ID invult. Nu moet ik daar dus een extra check overheen gooien.

En die link ga ik nu maar eens lezen, thanks.

By the way, als ik rechtstreeks de query op SQL uitvoer, via MySQL-front, cast deze de string ook naar int.

Reageren