2016-01-20 78 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