SQL查询中的插值和单引号字符串

时间:2013-08-31 14:18:54

标签: sql ruby

我刚开始使用SQLite3和Ruby的数据库。我在这里遇到了我的ruby代码的问题。

我想创建一个代码,用户将另一条记录添加到数据库中。现在这是我的问题。

用户sawa找到了我的第一个问题的解决方案。谢谢!

新问题*

puts "Enter name for the new user"
x = gets.chomp
puts "Enter the type of the user"
y = gets.chomp

$db.execute('insert into customers(id,name,type) values (11,"#{x}","#{y}")')

当我运行此代码并输入x任何y值时,它将在我的数据库#{x}和#{y}中返回,而不是我创建的值。

2 个答案:

答案 0 :(得分:3)

你实际上这一切都是错的。您根本不应该对SQL使用字符串插值,您应该使用占位符和绑定变量。 README even includes an example

# Execute a few inserts
{
  "one" => 1,
  "two" => 2,
}.each do |pair|
  db.execute "insert into numbers values ( ?, ? )", pair
end

并且fine manual甚至在第二句中提到了绑定变量:

  

<强> - (Object) execute(sql, bind_vars = [], *args, &block)

     

执行给定的SQL语句。如果给出了其他参数,则将它们视为绑定变量,并绑定到查询中的占位符。

所以你应该这样说:

$db.execute('insert into customers (id, name, type) values (?, ?, ?)', 11, x, y)

或者这个:

$db.execute('insert into customers (id, name, type) values (?, ?, ?)', [11, x, y])

答案 1 :(得分:2)

如警告所示,请勿使用单引号。使用双引号。单引号中的表达式不会被忽略。它们按字面意思进行评估。