2011-02-07 18 views
0

私はチタンモバイルでsqliteを使用しています。同じデータベース内の別のテーブルで更新プログラムを実行しても問題はありませんでしたので、接続が正常であるようです。しかし、私はテーブルに挿入を実行すると、私はすべてのデータが挿入されていないとエラー/例外がスローされていません。私は何が起こっているのか混乱しています。ここに私のテーブル構造はありますSQLインサートでエラーは発生していませんが、テーブルにはデータがありません

CREATE TABLE events (
gCal_uid VARCHAR, 
title VARCHAR, 
content VARCHAR, 
location VARCHAR, 
startTime VARCHAR, 
endTime VARCHAR, 
published VARCHAR, 
updated VARCHAR, 
eventStatus VARCHAR 
); 

ここにコードです。以下のinsert文を見ることができます。変数の出力には、すべてその中にデータがあります。おそらく私の構文が間違っていますか?

var db = Ti.Database.open('content'); 
Titanium.API.info(" number or results returned = " + cal.feed.entry.length); 
var i; 
for (i=0; i < cal.feed.entry.length; i++){ 
    var e = cal.feed.entry[i]; 

    var calUid = e.gCal$uid.value; 
    var title = e.title.$t; 
    var content = e.content.$t; 
    var location = e.gd$where.valueString; 
    var startTime = e.gd$when[0].startTime; 
    var endTime = e.gd$when[0].endTime; 
    var published = e.published.$t; 
    var updated = e.updated.$t; 
    var eventStatus = e.gd$eventStatus.value; 

    Titanium.API.info(calUid + title + content + location + startTime + endTime + published + updated + eventStatus); 

    var theData = db.execute('INSERT INTO events (gCal_uid, title, content, location, startTime, endTime, published, updated, eventStatus) VALUES("'+calUid+'","'+title+'", "'+content+'", "'+location+'", "'+startTime+'", "'+endTime+'", "'+published+'", "'+updated+'", "'+eventStatus+'")'); 
    theData; 
    Ti.API.info("rows inserted" + i); 
} 
Ti.API.info("closed the db"); 
db.close(); 
+1

Please !!!!! SQL文を準備するときに値をエスケープしてください!応答のために – Benoit

答えて

1

SQLではシングルクォートが使用されます。 JavaScriptはどちらかを使用します。

あなたは結果のSQLは、あなたが書いたかのようになりたい

INSERT info foo (a,b) values ('a value', 'b value') 

最も簡単な、より-正しい相当するものは次のようになります。

var theData = db.execute("INSERT INTO events (gCal_uid, title, content, location, startTime, endTime, published, updated, eventStatus) VALUES('"+calUid+"','"+title+"','"+content+"','"+location+"','"+startTime+"','"+endTime+"','"+published+"','"+updated+"','"+eventStatus+"')"); 

しかし、あなたは本当に避けるために、パラメータ置換を使用したいです注射の問題と引用の誤り、例えば

var theData = db.execute("INSERT INTO events (gCal_uid, title, content, location, startTime, endTime, published, updated, eventStatus) values (?,?,?,?,?,?,?,?,?)", calUid, title, content, location, startTime, endTime, published, updated, eventStatus); 
1

SQL文字列リテラルは、二重引用符ではなく、一重引用符で囲む必要があります。

INSERT INTO foo (a) VALUES("a"); 

は正しくありません。

INSERT INTO foo (a) VALUES('a'); 

は正しいSQL文です。

また、あなたが挿入するものが適切にエスケープされていることを確認してください(あなたはそうしないでください)。したがって、残りのSQL文と連結する前に、変数内のすべての単一引用符を2倍にする必要があります。

+0

ありがとう。私はこのチュートリアルのサンプルを参考にしています。http://mobile.tutsplus.com/tutorials/appcelerator/titanium-mobile-database-driven-tables-with-sqlite-part-2/ 私はチャンスがありませんでした二重引用符を削除することでコードを変更して確認することはできますが、コードとコードの違いや何が行われているのか教えてください。私はまだSQLに少し新しいので、ちょうど私があなたの言うことを正しく理解していることを確認したい。助けてくれてありがとう。 – bdizzle

関連する問題