2016-01-20 49 views
0

我有以下选择查询,我将传递到数据库来获取返回结果,的Postgres避免在字符串中额外的引号

sql = "select * from movies where title = #{movie_title};" 

movie_title包含有时可以包含单引号和其他字符需要的值逃跑。我遇到了美元报价的字符串,在INSERT声明中使用时效果很好,但SELECT的行为不一样,如果我使用$$#{movie_title}$$这样,它只是不会被转换为movie_title内的值。有没有解决方案?

我使用的是postgres 9.5.0,我使用ruby进行编程。

+1

使用Ruby的Postgresql驱动程序传递参数。 –

回答

2

坏主意。不要这样做,因为您正在使您的代码容易受到SQL注入攻击,并且还会让您的生活更加艰难。了解更多关于编写SQL语句,SQL注入等

总之,除非你使用的是一些ORM,你应该这样做:

#!/usr/bin/ruby 

require 'pg' 

if ARGV.length != 1 then 
    puts "Usage: prepared_statement.rb rowId" 
    exit 
end 

rowId = ARGV[0] 

begin 

    con = PG.connect :dbname => 'testdb', :user => 'janbodnar' 

    con.prepare 'stm1', "SELECT * FROM Cars WHERE Id=$1" 
    rs = con.exec_prepared 'stm1', [rowId] 

    puts rs.values 

rescue PG::Error => e 

    puts e.message 

ensure 

    rs.clear if rs 
    con.close if con 

end 

(从一个拍摄http://zetcode.com/db/postgresqlruby/例如)

编辑:您不需要使用准备好的语句,也可以使用提供正确参数绑定的DB库方法:

require 'pg' 
conn = PG::Connection.open(:dbname => 'test') 
res = conn.exec_params('SELECT $1 AS a, $2 AS b, $3 AS c', [1, 2, nil]) 

查看文档for PG#exec_params

+0

感谢您的指导,这很好。但是,我必须重新编写我的代码,将准备好的语句合并到我的sql中。 – Mah3ndra

+0

看我的编辑。尝试阅读更彻底使用的库的文档。 –

+0

'DEF run_sql(SQL)分贝= PG.connect(DBNAME: 'omdb') \t结果= db.exec(SQL) \t db.close \t返回结果 end'我有这样的方法我使用执行我所有的sql语句,现在它不需要任何参数。我有插入语句几乎需要十个参数。我了解您的解决方案,但是我无法在不改变大量代码的情况下实施我当前的设计。 – Mah3ndra

相关问题