SQLに変数を直接埋め込まない

SQLに変数を埋め込むと、エラーになる可能性があるし、セキュリティの点からもよろしくない。
SQLに変数を埋め込む場合は、プレースホルダを使用する。

db.execute("insert into test values ('#{name}, '#{name}')") # ×
db.execute('insert into test values(?, ?)', name, mail)     # 〇

?の部分(プレースホルダ)が第二引数以降(バインド変数)で置き換えられる。その際、変数がSQL特殊文字を含んでいても普通の文字として扱われる。

#!/usr/bin/ruby
require 'sqlite3'

db = SQLite3::Database.new('test.db')
print 'name:'; name = gets.chomp
print 'mail:'; mail = gets.chomp
begin
  db.execute("insert into test values ('#{name}, '#{name}')")
  puts 'insert ok'
rescue SQLite3::SQLException => e
  puts e 
end
begin
  db.execute("insert into test values (?, ?)", name, mail)
  puts 'insert ok'
rescue SQLite3::SQLException => e
  puts e
end
$ ruby sqlite_test.rb
name:hoge's
mail:hoge@hogehoge.com
near "s": syntax error
insert ok