PDO quote() ?
De beschrijving van de PDO quote method is als volgt:
Quote:
PDO::quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] )
PDO::quote() places quotes around the input string (if required) and escapes special characters within the input string, using a quoting style appropriate to the underlying driver.
PDO::quote() places quotes around the input string (if required) and escapes special characters within the input string, using a quoting style appropriate to the underlying driver.
Zoals je kunt zien, kun je een parameter type opgeven. Mijn vraag is waar dat voor dient. Ik heb een paar tests gedaan met verschillende parameter types en het resultaat is telkens hetzelfde: om de string worden quotes geplaatst. Zelfs als je PDO::PARAM_INT gebruikt waarmee je aangeeft dat het om een integer gaat, worden er gewoon quotes omheen geplaatst. Hetzelfde wanneer je daadwerkelijk een integer (in plaats van een string) gebruikt. Blijkbaar worden dus gewoon doodleuk overal quotes omheen gezet. Maar waarom is er dan een optie om een $parameter_type op te geven?
Gewijzigd op 27/05/2013 11:13:54 door Ozzie PHP
PDO::quote() een string verwacht?
string PDO::quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] )
En dat blijkt ook als je bijvoorbeeld een array doorgeeft:
Warning: PDO::quote() expects parameter 1 to be string, array given in … on line …
Dus niet $parameter_type maar $string bepaalt het datatype. De functie doet dus wat hij belooft: een string quoten in de quote style van de gekozen PDO-driver. Je probeert de functie nu voor twee verschillende dingen te gebruiken: een type cast plus het quoten van strings.
Uit het string $string in het prototype kun je toch afleiden dat string PDO::quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] )
En dat blijkt ook als je bijvoorbeeld een array doorgeeft:
Warning: PDO::quote() expects parameter 1 to be string, array given in … on line …
Dus niet $parameter_type maar $string bepaalt het datatype. De functie doet dus wat hij belooft: een string quoten in de quote style van de gekozen PDO-driver. Je probeert de functie nu voor twee verschillende dingen te gebruiken: een type cast plus het quoten van strings.
Ward, dankjewel voor je toelichting. Het klopt inderdaad dat het een string verwacht. Maar... waarom dan een optioneel $parameter_type??? Daar kan ik geen touw aan vast knopen. Er wordt dus een string verwacht, en dan kun je optioneel nog een keer aangeven dat het een string is :-s Schiet mij maar lek...
Denk bijvoorbeeld maar aan verschillende smaken van Unicode, UTF en andere karaktersets. Zou een implementatie andere soorten strings anders quoten, dan komt die type hint van pas. Dat probleem hebben we namelijk al eens eerder gehad: real_escape_string() voor MySQL bleek lek omdat bepaalde implementaties de karaktersets onvoldoende controleerden.
quote($foo, PDO::PARAM_STR);
... of juist niet?
quote($foo);
Waar ik zelf namelijk wat moeite mee heb, en daarom is je vraag ook raak (!), is dat dit zomaar kan en mag in PDO, zonder foutmelding of waarschuwing:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$dsn = 'mysql:dbname=test;host=localhost';
$username = 'root';
$password = '';
try {
$dbh = new PDO($dsn, $username, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$foo = true;
echo '<pre>';
var_dump($foo); // bool(true)
$bar = $dbh->quote($foo, PDO::PARAM_BOOL);
echo '<pre>';
var_dump($bar); // string(3) "'1'"
?>
$dsn = 'mysql:dbname=test;host=localhost';
$username = 'root';
$password = '';
try {
$dbh = new PDO($dsn, $username, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$foo = true;
echo '<pre>';
var_dump($foo); // bool(true)
$bar = $dbh->quote($foo, PDO::PARAM_BOOL);
echo '<pre>';
var_dump($bar); // string(3) "'1'"
?>
Ward van der Put op 27/05/2013 14:48:24:
Ik zou in dit geval quote($foo, PDO::PARAM_STR) gebruiken als $foo een string is en quote($foo) als het iets anders is.
Wat bedoel je dan met "iets anders"? Jij kwam zelf tot de conclusie dat er alleen een string mag worden meegegeven aan deze method :)
Ward van der Put op 27/05/2013 14:03:47:
Dus niet $parameter_type maar $string bepaalt het datatype. De functie doet dus wat hij belooft: een string quoten in de quote style van de gekozen PDO-driver. Je probeert de functie nu voor twee verschillende dingen te gebruiken: een type cast plus het quoten van strings.
Volgens mij staat verderop in de handleiding wat het nu is van die parameter:
Quote:
Provides a data type hint for drivers that have alternate quoting styles.
Blijkbaar heeft de MySQL driver die mogelijkheid dus niet.
Moet ik nu zelf wel PDO::PARAM_STR meegeven: quote($foo, PDO::PARAM_STR) ...of juist niet: quote($foo) ??
Blijkbaar dus niet, blijkbaar maakt het geen verschil bij de mysql driver en zal die parameter dus gewoon genegeerd worden.
Maar klopt het wel dat ik dan alleen strings moet quoten (met de quote() method) en alle andere data types (booleans, integers, null) niet?
Als je nu beslissingen neemt van het type "voor MySQL maakt wat ik in PDO doe niet uit", dan bouw je afhankelijkheden in de PDO nu juist wil voorkomen.
Ik bouw overigens geen databaseklassen[/n]. Ik bouw er maar eentje :) En als ik ooit een nieuwe nodig heb, maak ik weer een nieuwe.
Ik hoop dat iemand het antwoord op deze vraag nog weet:
"Maar klopt het wel dat ik dan alleen strings moet quoten (met de quote() method) en alle andere data types (booleans, integers, null) niet?"