Hi,
wollte schnell nur einige kleine Ergänzungen zu hausl PDO-Beitrag schreiben,
da fällt mir beim Testen etwas auf, was mich etwas vom PDO-Glauben abfallen lässt.
Mein Kenntnisstand war bisher wie folgt:
Wird bindValue ein Wert mit der Option PDO::PARAM_STR (=default) übergeben, dann erscheint der Parameter im MySQL-Log in Singlequotes eingeschlossen.
Mit
Da MySQL für LIMIT keine Ausdrücke wie LIMIT '1' akzeptiert, muß ein LIMIT mit Preparad Statements
per PDO mit PDO::PARAM_INT umgesetzt werden:
Soweit alles Ok. Nun aber der Wermutstropfen:
Kommt $limit als String daher, setzt PDO dies nicht als Integer um.
Dies führt zu einen Fehler in der SQL Syntax.
Es ist daher ratsam (auch in zahlreichen Beiträgen bei stackoverflow zu sehen),
den Wert grundsätzlich zu integer zu casten:
Mein Unverständnis betrifft die Frage, warum beim Flag PDO::PARAM_INT
nicht grundsätzlich intern zu int gecastet wird ?
wollte schnell nur einige kleine Ergänzungen zu hausl PDO-Beitrag schreiben,
da fällt mir beim Testen etwas auf, was mich etwas vom PDO-Glauben abfallen lässt.
Mein Kenntnisstand war bisher wie folgt:
Wird bindValue ein Wert mit der Option PDO::PARAM_STR (=default) übergeben, dann erscheint der Parameter im MySQL-Log in Singlequotes eingeschlossen.
PHP-Code:
$sql = "SELECT * FROM personen WHERE id = :id";
$stmt = $db ->prepare($sql);
$id = 1;
$stmt->bindValue('id',$id);
//log:SELECT * FROM personen WHERE id = '1'
PHP-Code:
$id = 1;
$stmt->bindValue('id',$id,PDO::PARAM_INT);
//log:SELECT * FROM personen WHERE id = 1
per PDO mit PDO::PARAM_INT umgesetzt werden:
PHP-Code:
$sql = "SELECT * FROM personen LIMIT :limit";
$stmt = $db ->prepare($sql);
$limit = 1;
$stmt->bindValue('limit',$limit,PDO::PARAM_INT);
//log:SELECT * FROM personen LIMIT 1
Kommt $limit als String daher, setzt PDO dies nicht als Integer um.
PHP-Code:
$limit = '1';
$stmt->bindValue('limit',$limit,PDO::PARAM_INT);
//log: SELECT * FROM personen LIMIT '1'
Es ist daher ratsam (auch in zahlreichen Beiträgen bei stackoverflow zu sehen),
den Wert grundsätzlich zu integer zu casten:
PHP-Code:
$stmt->bindValue('limit',(int)$limit,PDO::PARAM_INT);
nicht grundsätzlich intern zu int gecastet wird ?
Kommentar