Door
Ozzie PHP
op 12-02-2019 15:07
gewijzigd op 12-02-2019 15:09
5.720 views
Ik programmeer al weer een tijdje en toen ik jaaaaren geleden met PHP begon werd aangeraden om strings en variabelen altijd te concatten en enkele quotes te gebruiken.
Het is overzichtelijker. Je ziet dat er variabelen gebruikt worden. En één van mijn wijze uitspraken (die ik ooit van PHP Freakz heb overgenomen) is "Variabelen buiten quotes". ;-)
Alleen het concatneren geeft een beetje een syntax-rotzooitje, maar daar kijk ik gewoon overheen.
>> En één van mijn wijze uitspraken (die ik ooit van PHP Freakz heb overgenomen) is "Variabelen buiten quotes".
Lol :D
Maar weet je ook WAAROM dat zo is? Waarom ze buiten quotes moeten? Kan me er wel iets bij voorstellen, maar in queries zet vrijwel iedereen ze binnen dubbele quotes. Dus het gaat mij vooral om het waarom.
> Jij geeft als stelregel dat je enkele quotes moet gebruiken ... en vervolgens kom je met diverse redenen die het nut daarvan ontkrachten.
Nee ik leg uit wanneer je wat zou moeten gebruiken, en waarom.
> Wat raad jij nu aan, want ik zie geloof ik iets over het hoofd of ik begrijp je verkeerd.
Enkele quotes als het kan, dubbele quotes als het moet.
En bij erg lange tekst: output buffering.
Ik herinner mij dat artikel van PHPFz nog. Het "bewijsmateriaal" stond jammergenoeg in dienst van de hypothese (dat dingen buiten quotes halen sneller zou zijn). Ze hadden dan misschien wel gelijk, maar niet om de juiste redenen.
Ik kan me het artikel ook nog herinneren. Volgens mij geschreven door een van de oprichters van die site en ik schat in dat het minimaal zo'n 15 jaar oud zal zijn. (volgens mij was het Mathieu Kooiman)
Of PHP nog steeds op dezelfde manier werkt, is natuurlijk om te beginnen al de vraag.
resultaat wat ik me meen te herinneren:
De eerste 2 waren vergelijkbaar.
Staat er zoals in geval 3 een variabele tussen de " " dan wordt het "trager"
en de optimaalste waren de laatste 2.
Maar ik zet Trager tussen " ", omdat het verschil erg klein was. (toen al)
Ten tweede is ook de vraag hoe betrouwbaar de meetmethode was.
En tenslotte: de methode waarbij de variabelen buiten de quotes staan, geven
a) in mijn editor beter onderscheid in kleuren om de vars te vinden
b) gemakkelijk de mogelijkheid om ipv $bar iets als htmlspecialchars($bar) of escape($bar) toe te passen
Vooral dat geeft voor mij de doorslag om ze buiten de quotes te laten.
[size=xsmall]Toevoeging op 13/02/2019 10:23:19:[/size]
ik heb de link terug gevonden, al geeft het nu een 404 error:
Damn ... da's een oude post ... nog van voor mijn tijd :-D
Beiden bedankt voor jullie uitleg. We blijven dus gewoon voor single quotes gaan waar mogelijk, en wanneer het handiger is voor dubbele quotes.
Nog een laatste vraagje.
Queries zet ik dus tussen dubbele quotes omdat dat makkelijk te combineren is met enkele quotes, maar wat nu als er geen enkele quotes in een query voorkomen? Zet je die query dan weer tussen enkele quotes? Of zetten jullie een query gewoon altijd standaard tussen dubbele quotes?
Queries zet ik dus tussen dubbele quotes omdat dat makkelijk te combineren is met enkele quotes, maar wat nu als er geen enkele quotes in een query voorkomen? Zet je die query dan weer tussen enkele quotes? Of zetten jullie een query gewoon altijd standaard tussen dubbele quotes?
Om daarna alles toch weer te moeten veranderen als je tóch nog een ' in de query nodig hebt.
Zelf hanteer ik inderdaad query tussen " "
en html tussen ' '
Maar daarbij wel altijd prepared statements als het om variabelen gaat.
In jouw query kan $id niet iets anders zijn dan een INT, neem jij aan.
Maar stel dan het een keer toch een string is, en zeker als het invoer van buiten is, zou dat ook zo maar met opzet kunnen.
script.php?id=123%20OR%201
Dan is $id gelijk aan "123 OR 1"
dus de query wordt: "SELECT foo FROM bar where id = 123 OR 1"
En de vraag is, of dat is wat je wilt, en wat er gebeurt als iemand in plaats daarvan een subquery uitvoert die engere dingen doet.
SQL injectie dus.
En nu kún je wel proberen om $id vooraf te escapen, maar dat kan ook zo maar een keer vergeten worden. En dan missen ook nog de ' ' om $id.
prepared statements voorkomen dat.
En maken het eventueel ook mogelijk een 1x gepreparede query een keer of 100 uit te voeren met steeds andere parameters.
Bijvoorbeeld 1x prepare en vervolgens 1000 meetresultaten ergens uitlezen en wegschrijven. zou ook efficienter zijn. Komt niet veel voor bij standaard websites, maar PHP is niet tot websites beperkt.