原文: http://zetcode.com/db/sqliteruby/bind/

    SQL 语句通常是动态构建的。 用户提供一些输入,并且此输入已内置到语句中。 程序员每次处理用户的输入时都必须谨慎。 它具有一些严重的安全隐患。 动态构建 SQL 语句的推荐方法是使用参数绑定。

    当我们绑定参数时,我们在语句中创建占位符。 占位符是 SQL 语句中的特殊标记。 它通常是一个问号?。 稍后,使用bind_paramexecutequery等方法将参数绑定到占位符。 绑定参数可以防止 SQL 注入程序。 它会自动转义一些特殊字符并允许正确处理它们。

    准备语句并在执行语句之前绑定其参数时,通常可以提高数据库性能。 在sqlite3 Ruby 模块中,始终准备语句。 即使我们不调用数据库对象的prepare方法而直接调用execute方法,该语句也是由sqlite3 Ruby 模块在后台准备的。

    1. #!/usr/bin/ruby
    2. require 'sqlite3'
    3. begin
    4. db = SQLite3::Database.new "test.db"
    5. name = "Volkswagen"
    6. stm = db.prepare "SELECT * FROM Cars WHERE Name = ?"
    7. stm.bind_param 1, name
    8. rs = stm.execute
    9. row = rs.next
    10. puts row.join "\s"
    11. rescue SQLite3::Exception => e
    12. puts "Exception occurred"
    13. puts e
    14. ensure
    15. stm.close if stm
    16. db.close if db
    17. end

    该示例从Cars表中为特定的汽车名称选择一行。

    1. name = "Volkswagen"

    此值可能来自用户:例如,来自 HTML 表单。

    1. stm = db.prepare "SELECT * FROM Cars WHERE Name = ?"

    问号?是值的占位符。 它将稍后添加到脚本中。

    1. stm.bind_param 1, name
    2. rs = stm.execute

    使用bind_param方法,名称变量与语句中的占位符关联。 execute方法将返回结果集。

    1. $ ./bindparam1.rb
    2. 8 Volkswagen 21600

    这是示例的输出。

    接下来,我们提出另一种绑定参数的方式。

    1. #!/usr/bin/ruby
    2. require 'sqlite3'
    3. begin
    4. db = SQLite3::Database.new "test.db"
    5. id = 4
    6. stm = db.prepare "SELECT * FROM Cars WHERE Id = :id"
    7. rs = stm.execute id
    8. row = rs.next
    9. puts row.join "\s"
    10. rescue SQLite3::Exception => e
    11. puts "Exception occurred"
    12. puts e
    13. ensure
    14. stm.close if stm
    15. db.close if db
    16. end

    我们从Cars表中为特定 ID 选择一行。

    1. stm = db.prepare "SELECT * FROM Cars WHERE Id = :id"

    以前,我们已经看到一个问号作为占位符。 SQLite Ruby 也支持命名占位符。

    1. rs = stm.execute id

    该参数绑定在execute方法中。

    我们提供了另一种绑定参数的方法。

    1. #!/usr/bin/ruby
    2. require 'sqlite3'
    3. begin
    4. db = SQLite3::Database.new "test.db"
    5. id = 3
    6. row = db.get_first_row "SELECT * FROM Cars WHERE Id = ?", id
    7. puts row.join "\s"
    8. rescue SQLite3::Exception => e
    9. puts "Exception occurred"
    10. puts e
    11. ensure
    12. db.close if db
    13. end

    这次,所有事情(准备语句,绑定参数和执行语句)都使用一种方法完成。

    1. row = db.get_first_row "SELECT * FROM Cars WHERE Id = ?", id

    get_first_row是一种便捷的方法,一步完成三件事。

    在最后一个示例中,我们将在一个语句中绑定多个参数。

    1. #!/usr/bin/ruby
    2. require 'sqlite3'
    3. begin
    4. db = SQLite3::Database.new ":memory:"
    5. stm = db.prepare "SELECT 2 + ? + 6 + ? + ?"
    6. stm.bind_params 3, 4, 6
    7. rs = stm.execute
    8. row = rs.next
    9. puts row
    10. rescue SQLite3::Exception => e
    11. puts "Exception occurred"
    12. puts e
    13. ensure
    14. stm.close if stm
    15. db.close if db
    16. end

    在该示例中,SQL 语句中有更多的占位符。

    1. stm = db.prepare "SELECT 2 + ? + 6 + ? + ?"

    SELECT语句中有三个占位符。

    1. stm.bind_params 3, 4, 6

    我们用bind_params方法绑定三个值。

    1. $ ./bindparams.rb
    2. 21

    这是bindparams.rb程序的输出。

    在 SQLite Ruby 教程的这一部分中,我们讨论了绑定参数。