Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby postgres避免在字符串中使用额外引号_Ruby_Postgresql - Fatal编程技术网

Ruby postgres避免在字符串中使用额外引号

Ruby postgres避免在字符串中使用额外引号,ruby,postgresql,Ruby,Postgresql,我有下面的select查询,我将把它传递到数据库以获取结果 sql = "select * from movies where title = #{movie_title};" movie_title包含的值有时可以包含单引号和其他需要转义的字符。我遇到过一个带美元引号的字符串,它在INSERT语句中使用时运行良好,但SELECT的行为并不相同,如果我像这样使用$${movie\u title}$$,它就不会转换为movie\u title中的值。有什么解决办法吗 我用的是postgres 9

我有下面的select查询,我将把它传递到数据库以获取结果

sql = "select * from movies where title = #{movie_title};"
movie_title包含的值有时可以包含单引号和其他需要转义的字符。我遇到过一个带美元引号的字符串,它在INSERT语句中使用时运行良好,但SELECT的行为并不相同,如果我像这样使用$${movie\u title}$$,它就不会转换为movie\u title中的值。有什么解决办法吗


我用的是postgres 9.5.0,我用的是ruby。

坏主意。不要这样做,因为这会使您的代码容易受到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

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

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])

看一下文档,看看是否有什么坏主意。不要这样做,因为这会使您的代码容易受到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

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

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])

查看文档

使用Ruby的Postgresql驱动程序传递参数。使用Ruby的Postgresql驱动程序传递参数。感谢教程,这很好。但是,我必须重新编写代码,将准备好的语句合并到sql中。请参阅我的编辑。尝试更彻底地阅读您正在使用的库的文档。def run_sqlsql db=PG.connectdbname:'omdb'results=db.execsql db.close return results end我使用这个方法来执行所有sql语句,现在它不带任何参数。我有insert语句,它几乎包含十个参数。我理解你的解决方案,但如果不修改大量代码,我无法在当前的设计中实现。那么,这显然是一个糟糕的设计。如果你和你的同事对此没有意见,那就保持原样吧/顺便说一句,方法可以接收多个参数,我希望你知道。谢谢你的教程,很好。但是,我必须重新编写代码,将准备好的语句合并到sql中。请参阅我的编辑。尝试更彻底地阅读您正在使用的库的文档。def run_sqlsql db=PG.connectdbname:'omdb'results=db.execsql db.close return results end我使用这个方法来执行所有sql语句,现在它不带任何参数。我有insert语句,它几乎包含十个参数。我理解你的解决方案,但如果不修改大量代码,我无法在当前的设计中实现。那么,这显然是一个糟糕的设计。如果你和你的同事对此没有意见,那就保持原样吧/顺便说一句,方法可以接收多个参数,希望您知道。