PDO quote() ?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

27/05/2013 11:10:14
Quote Anchor link
Ola,

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.

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
 
PHP hulp

PHP hulp

17/11/2024 19:45:46
 
Ward van der Put
Moderator

Ward van der Put

27/05/2013 14:03:47
Quote Anchor link
Uit het string $string in het prototype kun je toch afleiden dat 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.
 
Ozzie PHP

Ozzie PHP

27/05/2013 14:13:09
Quote Anchor link
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...
 
Ward van der Put
Moderator

Ward van der Put

27/05/2013 14:22:23
Quote Anchor link
Ik vermoed dat deze type hint, want meer dan een hint is het niet, met vooruitziende blik is opgenomen voor het geval een databaseplatform of een PDO-driver méér soorten strings kent dan PHP of PDO zelf.

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.
 
Ozzie PHP

Ozzie PHP

27/05/2013 14:36:28
Quote Anchor link
Ah oké thanks. Maar is het dan de bedoeling dat als ik iets quote ik die parameter_type PDO::PARAM_STR zelf nog een keer meegeef:

quote($foo, PDO::PARAM_STR);

... of juist niet?

quote($foo);
 
Ward van der Put
Moderator

Ward van der Put

27/05/2013 14:48:24
Quote Anchor link
Ik zou in dit geval quote($foo, PDO::PARAM_STR) gebruiken als $foo een string is en quote($foo) als het iets anders is.

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)
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
<?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'"
?>
 
Ozzie PHP

Ozzie PHP

27/05/2013 14:53:45
Quote Anchor link
Ward, dit is dus ook precies het probleem waar ik tegenaan loop. Ongeacht wat je in die quote() method gooit, alles wordt gewoon netjes gequote. Dus inderdaad ook booleans, maar ook integers.

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 :)
 
Erwin H

Erwin H

27/05/2013 15:03:09
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

27/05/2013 15:09:30
Quote Anchor link
Erwin thanks. Ik snap alleen niet wat ermee bedoeld wordt :(

Moet ik nu zelf wel PDO::PARAM_STR meegeven: quote($foo, PDO::PARAM_STR) ...of juist niet: quote($foo) ??
 
Erwin H

Erwin H

27/05/2013 15:15:04
Quote Anchor link
Blijkbaar dus niet, blijkbaar maakt het geen verschil bij de mysql driver en zal die parameter dus gewoon genegeerd worden.
 
Ozzie PHP

Ozzie PHP

27/05/2013 15:20:47
Quote Anchor link
Ah oké. Ik vind het maar wazig :-s

Maar klopt het wel dat ik dan alleen strings moet quoten (met de quote() method) en alle andere data types (booleans, integers, null) niet?
 
Ward van der Put
Moderator

Ward van der Put

27/05/2013 15:33:49
Quote Anchor link
Als je, zoals in jouw geval, databaseklassen voor een framework bouwt, zou ik PDO zo schoon mogelijk "as such" gebruiken. En dus niet PDO + MySQL + PDO-driver voor MySQL. Een wezenlijk uitgangspunt van PDO als abstractielaag is namelijk dat je MySQL moet kunnen vervangen door bijvoorbeeld PostgreSQL.

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.
 
Ozzie PHP

Ozzie PHP

27/05/2013 15:40:19
Quote Anchor link
Ward, ik maak nu een database class die PDO extend. Ik gebruik dus de PDO functionaliteit, alleen met wat handigheid zodat ik het zelf makkelijk kan gebruiken. Ik heb ook een interface gemaakt, en als (met de nadruk op als) ik ooit een andere database extension zou gaan gebruiken, dan kan dat dus heel makkelijk.

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?"
 



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.