En Kohana 3, vous pouvez maintenant lier le nom params dans les requêtes, mais comment puis-je échapper à ceux que je ne peux pas lier?

StackOverflow https://stackoverflow.com/questions/2204149

  •  18-09-2019
  •  | 
  •  

Question

je peux dans Kohana 3, lier un param dans une requête, comme si

$query = 'SELECT name FROM users WHERE id = :id';

Ceci est propre, mais parfois je veux d'autres choses à configurer, comme le nom de la table. Lorsque j'utilise un nom pour le nom param de table, il échoue. Je viens de la construction de la chaîne dans ces circonstances.

Ma question est, comment puis-je échapper à des personnages potentiellement mauvais lorsque vous faites ce genre de bâtiment de chaîne? Dans Kohana 2.x, vous pouvez le faire $this->db->escape() mais depuis Kohana 3 est radicalement différente, j'imagine il y a une nouvelle façon?

Était-ce utile?

La solution

Juste pour ajouter à la réponse de Mark Byers, la raison pour laquelle la paramétrisation du nom de la table échoue est que les paramètres sont échappés comme valeurs , alors qu'un nom de table est un identifiant . Qu'est-ce qui se passe probablement est que le nom de la table est enveloppée entre guillemets, alors qu'il devrait être d'être enveloppé dans des contre-apostrophes à la place.

Cependant, comme le dit Mark, un besoin d'échapper les noms de table suggère une mauvaise conception. Ils doivent être soit codés en dur ou stockées dans certains fichiers de configuration dont le contenu peut être pas besoin d'échapper de toute façon. Essayer de couvrir toutes vos bases à tel point que vous ne faites pas confiance à votre propre configuration est très probablement une perte de temps.

Autres conseils

Je ne l'ai jamais utilisé kohana, donc des excuses si ce commentaire est tout à fait hors de propos, mais j'ai quelques commentaires au sujet de ce que vous essayez de faire:

  

Quand j'utilise un param du nom de nom de la table, il échoue.

Je suppose que c'est parce qu'il se fonde sur le mécanisme des paramètres de base de données sous-jacente, et je ne connais aucune base de données qui vous permet de donner un nom de table comme paramètre dans une requête. Alors oui, très probablement vous aurez à construire vous-même chaîne.

  

comment puis-je échapper les caractères potentiellement mauvais lorsque vous faites ce genre de bâtiment de chaîne?

Cette question semble étrange ... soit vous avez des personnages potentiellement mauvais dans certains de vos noms de table ... si oui, pourquoi? Ou bien vous recevez le nom de la table à partir d'une source non fiable (utilisateur?). Cela sonne comme une mauvaise idée pour moi. Que faire s'ils essaient de lire à partir d'une table, ils ne sont pas censés avoir accès? Ne serait-il préférable d'avoir une liste bien définie et vérifier les noms de tables admissibles que la table existe dans cette liste, au lieu d'échapper les noms de table potentiellement mauvais?

Et j'ai une dernière observation: si vous êtes en mesure de changer le nom de la table dans une requête et il fonctionne encore, cela est peut-être un signe que votre base de données ne soit pas normalisée correctement. Peut-être que vous pouvez combiner vos tables et ajouter une colonne supplémentaire avec des informations sur le regroupement, et utiliser une clause WHERE pour sélectionner les données que vous voulez? Je dois en savoir plus sur votre modèle pour suggérer quelque chose de plus concret.

Je ne sais pas si cela aide à répondre à votre question à tous, mais ceux-ci étaient mes pensées à la lecture de votre question. J'espère que vous pouvez utiliser une partie de celui-ci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top