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.

<?php

echo 'Hallo ' . $firstname . ' ' . $lastname . '!';

?>
Deze manier zou de beste zijn vanwege het gebruik van enkele quotes wat sneller zou zijn dan het gebruik van dubbele quotes.

Tegenwoordig als ik SQL-queries opstel, gebruik ik echter vrijwel altijd dubbele quotes.

<?php

$sql = "SELECT foo, bar WHERE id = $id";

?>
En dat kun je natuurlijk ook doen als het niet om SQL gaat.

<?php

echo "Hallo $firstname $lastname!";

?>
En dan is er ook nog het gebruik van accolades voor 'ingewikkeldere' variabelen.

<?php

echo "Hallo {$this->data['firstname ']} {$this->data['lastname ']}!";

?>

Mijn vraag is ... welke methode gebruiken jullie het meest?

Als ik eerlijk ben, dan leest dit

<?php

echo "Hallo $firstname $lastname!";

?>
... een stuk makkelijker dan dit:

<?php

echo 'Hallo ' . $firstname . ' ' . $lastname . '!';

?>

Maar hoe zit het met performance e.d.?
> Eerst controleren of het een nummer is én dan ook nog escapen lijkt me overdreven?
Nee dat is niet overdreven. Je wilt geen enkele ruimte aan het toeval overlaten.

Je escaped dan dus nog steeds omdat je anders weer in de eerdere situatie terecht komt waarbij je niet weet of de quotes bewust zijn weggelaten of toch per ongeluk zijn vergeten. Je wilt hier niet elke keer weer over nadenken.

Je komt dan ook elke keer weer in een programmeerspagaat. Wel of geen quotes aanbrengen? Gewoon niet doen :p. Behandel alle externe data gewoon hetzelfde, is een stuk makkelijker.

Quoten + escapen en klaar.

En indien invoer in eerste instantie niet voldoet de query niet eens uitvoeren omdat dat zelden tot nooit een zinnig resultaat oplevert.
Thomas van den Heuvel op 14/02/2019 17:19:52

... echte database abstractie laag ... maar ook daar zul je je moeten afvragen of die abstractie echt nodig is en zich ooit terugverdient.

Zelf heb ik het idee dat ik er sneller door kan werken omdat ik minder code hoef te schrijven. Niet steeds die standaard stukken SQL, minder kans op fouten. Maar ook minder PHP omdat een groot deel van de afhandeling - lijstjes - er al in zit. Daarnaast loop je gewoon veel meer risico op een "misser" als je steeds handmatig moet escapen, en dat kan een *dure* grap worden.

@Thomas

Voor de duidelijkheid, dan wordt het dus bijv. zoiets?

<?php

$sql = "SELECT '" . $conn->real_escape_string($foo) . "' FROM bar WHERE id = '" . $conn->real_escape_string($id) . "'";

?>

Correct?
> Daarnaast loop je gewoon veel meer risico op een "misser" als je steeds handmatig moet escapen, en dat kan een *dure* grap worden.
Sure, zoals ik al zei, je moet enige discipline hebben. Bij elk stuk data moet de realisatie zijn waar deze vandaan komt en hoe je deze zou moeten behandelen. Escaping hoort daar eigenlijk altijd bij (filter input, escape output). Uitzonderingen daarop zijn ook echt uitzonderingen.

> Correct?
Euh, $foo (kolomnaam?) waarom zou je dat dynamisch willen maken? Kolomnamen staan ook niet tussen quotes. Ik zou daar misschien een whitelist voor gebruiken ofzo. Voor $id lijkt het mij in orde. Quoten en escapen gaat bijna altijd over waarden, niet zozeer over kolomnamen, die liggen meestal vast.
>> Euh, $foo (kolomnaam?) waarom zou je dat dynamisch willen maken?

Pffff, ik lag blijkbaar te slapen. Haha, dat sloeg inderdaad totaal nergens op.
Thomas van den Heuvel op 14/02/2019 23:23:19

Euh, $foo (kolomnaam?) waarom zou je dat dynamisch willen maken? Kolomnamen staan ook niet tussen quotes.


Als je één (abstract) class wilt kunnen gebruiken voor verschillende tabellen, dan zijn dynamische kolomnamen onmisbaar. Dat kan overigens ook een constante zijn in plaats van een variabele:


<?php
public function create(array $keyed_data)
{
    $columns = array_keys($keyed_data);
    $sql = 'INSERT INTO ' . static::TABLE_NAME . ' (' . implode(', ', $columns) . ') VALUES (:' . implode(', :', $columns) . ')';

    // etc.
}
?>


Hier zijn zowel de tabelnaam als alle kolomnamen dynamisch.
Ah ja, oké ... dan werk je dus niet echt met queries maar met aparte functies om bijv. iets te inserten of updaten en als parameters geef je dan de kolomnaam en argumenten mee aan de functie. Dat kan inderdaad ook.

Reageren