Autant que je sache, il devrait être possible de procéder à ce qui suit dans les rails:
ActiveRecord::Base.connection.select_all("SELECT MONTH(created) AS month, YEAR(created) AS year FROM orders WHERE created>=$1 AND created<=$2 GROUP BY month ORDER BY month ASC",nil,[['created',1],['created',2]])
3 Réponses :
Je ne comprends pas si vous essayez d'utiliser des variables, mais oui, il est assez facile de faire avec des variables, vous les avez utilisées à tort
Utilisez-la comme ceci: P>
ActiveRecord::Base.connection.select_all("SELECT MONTH(created) AS month, YEAR(created) AS year FROM orders WHERE created>=#{v1} AND created<=#{v2} GROUP BY month ORDER BY month ASC",nil,[['created',1],['created',2]])
Merci de votre aide. En fait, je veux que 1 $ et 2 $ soit remplacé par [["créé", 1], ["créé", 2]], comme une déclaration de SQL préparée commune. Mais tout ce que je fais, ça ne marche pas. Dans une déclaration de modèle normale des rails comme ... où (), ça marche, mais avec cette base.Connection, je ne peux pas comprendre, comment faire cela ...
Il s'agit d'un exemple de manuel de la manière de créer une vulnérabilité d'injection SQL dans votre application - citation de vos variables avant l'interpolation ou d'utiliser des variables de liaison.
Vous devez utiliser Cela vous protège des injections SQL. P> P> sanitize_sql_array code> dans votre modèle, comme celui-ci:
Il peut aussi prendre un hachage: sanitize_sql_array (['... où id =: id et tapez (Type)', {id: _, types: _}]) code>
Puisque vous n'utilisez pas Named Binds, vous le feriez comme ça. Cela fonctionne dans les rails 4.2.
ActiveRecord::Base.connection.select_all( "SELECT MONTH(created) AS month, YEAR(created) AS year FROM orders WHERE created>=$1 AND created<=$2 GROUP BY month ORDER BY month ASC", nil, [[nil,'2016-01-01 12:30'],[nil,'2016-01-01 15:30']] )
Est-ce encore une chose? J'obtiens TypeError - TypeError: Code> avec NIILS et
Nométhoderror - Méthode non définie Code> CAST_TYPE 'pour ... "En essayant nommé argument. Rails 4.2.10.