yumimueの日記

2007-10-31

[][]SQL変数を直接埋め込まない 16:36 はてなブックマーク - SQLに変数を直接埋め込まない - yumimueの日記

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