0

我刚开始使用带有 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 any y 值时,它将在我的数据库中返回 #{x} 和 #{y} 而不是我创建的值。

4

2 回答 2

3

你实际上在做这一切都是错的。您根本不应该对 SQL 使用字符串插值,而应该使用占位符和绑定变量。自述文件甚至包括一个示例

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

精美的手册甚至在第二句中提到了绑定变量:

- (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])
于 2013-08-31T17:19:53.193 回答
2

正如警告的那样,不要使用单引号。使用双引号。单引号中的表达式不会被忽略。它们是按字面意思进行评估的。

于 2013-08-31T14:32:17.637 回答