2009-08-21 9 views
0

J'écris un sous-système que les tables peuvent être renommées de projet en projet. Au lieu de demander à l'utilisateur de mon sous-système de rechercher & remplacer avant de l'utiliser, cela fonctionne-t-il?Nom de table dynamique dans DAO.cfc?

<cfquery name="local.foo" datasource="#dsn#"> 
    SELECT col1, col2, col3 
    FROM #tableName# 
</cfquery> 

Sans <cfqueryparam>, il sera devenu non-cacheable? ou d'autres problèmes? (supposons que l'injection SQL n'est pas un problème)

Je ne pense pas pouvoir utiliser <cfqueryparam> pour le nom de la table, n'est-ce pas?

Merci.

+1

"Est-ce que cela fonctionne?" pourquoi ne l'as-tu pas essayé? "Je ne pense pas pouvoir utiliser pour le nom de la table, n'est-ce pas?" encore une fois .. – erikvold

+0

* utilisez pour le nom de la table * Je sais que c'est un ancien sujet, mais pour quiconque le rencontrera dans le futur, la réponse est non. Cfqueryparam, ou les variables de liaison, ne fonctionnent qu'avec des littéraux, c'est-à-dire des chaînes simples, des nombres, etc. Cfqueryparam ne peut pas être utilisé sur les noms de table (ou tout autre nom * objet *). – Leigh

Répondre

3

Ça va marcher, bien sûr. CF convertit simplement toutes les variables en leurs valeurs et envoie la chaîne au pilote de base de données.

Soyez très, très prudent, cependant. Comme vous l'avez laissé entendre, cela pourrait vous mettre en place pour une mauvaise injection SQL.

+1

Si vous utilisez MySQL, vous pouvez échapper à la tableName pour sécuriser le SQL en encapsulant la chaîne avec des backticks tels que: '# tableName #'. D'autres bases de données auront leurs propres moyens d'échapper les noms de tables et de colonnes. – sqrl0

Questions connexes