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