Comment écrire des requêtes SQL dans Latte ?
Latte peut également être un outil utile pour générer des requêtes SQL complexes, améliorant ainsi leur lisibilité et leur maintenabilité.
Lorsqu'une requête SQL contient de nombreuses conditions et variables, son écriture dans Latte peut être plus claire et plus flexible. Voici un exemple simple démontrant cet avantage :
SELECT users.* FROM users
LEFT JOIN users_groups ON users.user_id = users_groups.user_id
LEFT JOIN groups ON groups.group_id = users_groups.group_id
{ifset $country} LEFT JOIN country ON country.country_id = users.country_id {/ifset}
WHERE groups.name = 'Admins' {ifset $country} AND country.name = {$country} {/ifset}
Pour un fonctionnement correct, plusieurs étapes doivent être effectuées :
- Définition du type de contenu : en utilisant
$latte->setContentType()
, nous informons Latte que le contenu doit être traité comme du texte brut, et non comme du HTML. - Définition d'une fonction d'échappement : nous créons notre propre fonction d'échappement qui échappera les chaînes directement en utilisant le pilote de base de données. Cela garantit la sécurité contre l'injection SQL.
Voici un exemple d'implémentation de ces étapes :
$db = new PDO(/* ... */);
$latte = new Latte\Engine;
$latte->setContentType(Latte\ContentType::Text);
$latte->addFilter('escape', fn($val) => match (true) {
is_string($val) => $db->quote($val),
is_int($val), is_float($val) => (string) $val,
is_bool($val) => $val ? '1' : '0',
is_null($val) => 'NULL',
default => throw new Exception('Type non supporté'),
});
Cette fonction d'échappement assure le traitement correct des différents types de données :
- Les chaînes sont échappées à l'aide de la méthode
quote()
du pilote de base de données. - Les nombres (entiers et à virgule flottante) sont convertis en chaînes.
- Les valeurs booléennes sont converties en ‘1’ ou ‘0’.
- Les valeurs Null sont converties en ‘NULL’.
- Pour les types non supportés, une exception est levée.
L'utilisation en pratique ressemblerait alors à ceci :
$sql = $latte->renderToString('query.sql.latte', ['country' => $country]);
$result = $db->query($sql);
Cette approche permet de :
- Construire dynamiquement des requêtes SQL en utilisant la logique de Latte.
- Insérer en toute sécurité des variables dans la requête grâce à la fonction d'échappement personnalisée.
- Améliorer la lisibilité et la maintenabilité des requêtes SQL complexes.
Cet exemple nécessite Latte version 3.0.5 ou plus récente.
L'utilisation de Latte pour générer des requêtes SQL peut considérablement simplifier le travail avec des requêtes complexes, en particulier dans les situations où la requête change dynamiquement en fonction de diverses conditions. En même temps, cette approche aide à maintenir le code propre et facile à modifier.