2012-04-05 7 views
0
verwirrt

ich mich, wenn jemand eine Klärung über den Unterschied zwischen den folgenden Aussagen mit sqlite3 gem mit Ruby 1.9.x hat:Sqlite3 Strings in where-Klauseln scheinen

@db.execute("INSERT INTO table(a,b,c) VALUES (?,?,?)", 
some_int, other_int, some_string) 

und

@db.execute("INSERT INTO table(a,b,c) VALUES (#{some_int},"+ 
+"#{some_int}, #{some_string})") 

Mein Problem ist: Wenn ich die erste Methode für das Einfügen verwende, kann ich die Spalte "c" nicht mit der folgenden Anweisung abfragen:

SELECT * FROM table WHERE c='some magic value' 

Ich kann diese verwenden:

"SELECT * FROM table WHERE c=?", "some magic value" 

aber, was ich will wirklich benutzen

"SELECT * FROM table WHERE c IN ('#{options.join("','")}')" 

Und dies mit der Art von Einsätzen nicht funktioniert.

Weiß jemand, was der Unterschied auf der Datenbankebene ist, der verhindert, dass die IN ordnungsgemäß funktioniert?

+2

Während Sie nicht gerade eine Antwort auf Ihre Frage sind, sollten Sie sich unbedingt mit dem Thema [SQL-Injektion] (http://bobby-tables.com/) vertraut machen. – Jan

+0

Wie sieht dein "magischer Wert" wirklich aus und was bedeutet "ich kann nicht nach der" c "Spalte fragen? Ich vermute, dass Sie ein Problem mit einem eingebetteten Anführungszeichen haben und nur wissen müssen, wo Sie ['SQLite3 :: Database.quote '] (http://rubydoc.info/gems/sqlite3/SQLite3/Database) verwenden können. Zitat). –

+0

Ich kenne das Problem der DB Hijacking-aber das ist ein Skript mit der Befehlszeile auf den Benutzerdaten zugeordnet. Sie können tun, was sie wollen, damit :) – user632657

Antwort

0

in dieser Arbeit schreiben Arbeit dachte ich, dies vor einer Weile ganz, aber vergessen haben, zurück und zeigen Sie es zu kommen, falls jemand diese Frage zu einem anderen Zeitpunkt findet.

Der Unterschied entpuppt sich als Blobs. Wenn Sie das erste Formular oben verwenden (die Substitutionsmethode mit (?,?)), Verwendet SQLite3 offenbar Blogs zur Eingabe der Daten. Wenn Sie jedoch eine normale SQL-Anweisung erstellen, wird sie als reguläre Zeichenfolge eingefügt und die beiden sind nicht äquivalent.

0

Einfügen ist nicht möglich, Abfrage zu zeilen, aber Zeilenabfrage in Daten verwendet, dass diese Zeit funktioniert.

SQLite in Sie in mobile app verwendet, dass die Zeit nicht Fledermaus diese Zeile Abfrage, die Sie in SQLite Durchsuchen