postgres避免字符串中的额外引号

时间:2016-01-20 09:46:25

标签: ruby postgresql

我有以下选择查询,我将传递给数据库以获取结果,

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

movie_title包含的值有时可以包含单引号和其他需要转义的字符。我遇到过美元引用的字符串,它在INSERT语句中使用时运行良好,但SELECT行为不一样,如果我使用$$#{movie_title}$$这样就不会转换为movie_title内的值。对此有什么解决方案吗?

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

1 个答案:

答案 0 :(得分:2)

糟糕的主意。不要这样做,因为你使你的代码容易受到SQL注入攻击,并且还会让你的生活更加艰难。阅读有关准备好的SQL语句,SQL注入等的更多信息。

简而言之,除非您使用某些ORM,否则您应该执行以下操作:

    E = [5,200];  Selected edge values 
    X = imread('LENNA128.bmp');
    N = length(X);
    Y = false(N+2);
for k = 1:numel(E);
    Y(2:end-1,2:end-1) = X==E(k);
    Z = Y(1:end-2,2:end-1) | Y(3:end,2:end-1) | Y(2:end-1,3:end) | Y(2:end-1,1:end-2);
    X(Z) = round((X(end-3,3:end-2) + X(end-3,4:end-1))/2);
end

(取自http://zetcode.com/db/postgresqlruby/

的例子

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

#!/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

查看PG#exec_params

的文档