0

SQLite3 と 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} に返されます。

4

2 に答える 2

3

あなたは実際にこれについてすべて間違っています。SQL に文字列補間を使用するべきではありません。プレースホルダーとバインドされた変数を使用する必要があります。README には例も含まれています。

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

そして素晴らしいマニュアルは、2番目の文でバインドされた変数についても言及しています:

- (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 に答える