
Atténuer l'incapacité d'échapper aux noms de colonnes dans les requêtes dynamiques de Drupal
Travailler dans une agence Drupal, vous faites beaucoup de développement Drupal et rencontrez divers problèmes. Récemment, lors d'une migration vers Drupal, j'ai rencontré un nouveau problème avec la couche d'abstraction de la base de données de Drupal. Il s'avère que les requêtes de sélection dynamique de Drupal n'échappent pas les noms de colonnes.
Ce problème ne touche pas chaque type de base de données, mais il peut certainement être problématique en ce qui concerne mysql
$query = Database::getConnection('default', 'legacy') ->select('prod_group', 'pg') ->fields('pg', array('porductid, 'active', 'order'));
créera la requête suivante :
SELECT pg.productid AS productid, pg.active AS active, pg.order AS order FROM {prod_group} pg;
Nous manquons les `` autour des champs et dans ce scénario, nous avions un nom de colonne très malheureux, "order", qui est un mot-clé réservé dans mysql utilisé pour trier les résultats (ORDER BY). C'est comme ça que mysql interprète la requête, qui est donc mal structurée et génère une erreur.
SQLSTATE[42000]: Erreur de syntaxe ou violation d'accès : 1064 Vous avez une erreur dans votre syntaxe SQL;
Nous devrions créer une requête avec les noms de table échappés avec des backticks :
SELECT pg.productid AS `productid`, pg.active AS `active`, pg.order AS `order` FROM {prod_group} pg;
mais Drupal ne le supporte pas dans les requêtes dynamiques, qui sont les seules prises en charge par le module migrate.
Solution - Alias de champs
Drupal prend en charge l'aliasing. Vous pouvez même le voir ci-dessus "pg.order AS order" est une requête qui alias automatiquement le champ order, malheureusement avec son propre nom restreint.
Mais nous pouvons définir ces alias automatiquement avec SelectQueryInterface::addField.
$query = Database::getConnection('default', 'legacy') ->select('prod_group', 'pg') ->fields('pg', array('groupid', 'active')) ->addField('pg', 'order', 'escaped_order');
Ce qui nous donne une requête sans un mot-clé restreint :
SELECT pg.productid AS productid, pg.active AS active, pg.order AS escaped_order FROM {prod_group} pg;.
Cela résout le problème. Rappelez-vous simplement que lorsque vous récupérez vos résultats, le order s’appellera escaped_order.