1

sqlite データベースにデータを挿入しようとすると、次のエラーが発生します。

"sqlite near "t": syntax error"

そして、私はそれが何を意味するのか分かりません:-(

背景: 私はmysql_real_escape_stringオンライン フォームからのデータを "サニタイズ" するために使用しています (フォームは、ユーザーにテキスト フィールドに情報を入力して [送信] を押すように求めます) - これは完全にうまく機能します:二重引用符が受け入れられ、エラーなしで DB に入力されます。

次に、私の iPhone アプリはこの DB にクエリを実行し、受信データを解析します。興味深いのは、\" と \' をあちこちに取得することです (as-in: don\'t または \"The Odyssey\" の代わりに)。しないでくださいまたは「オデッセイ」)

これを修正する[stringVar stringByReplacingOccurrencesOfString:@"\\" withString:@""]ために、私は基本的にすべてのスラッシュをスペースなしに置き換えています.

ただし、この新しくダウンロードして解析したデータをデバイス上のsqlite データベースに書き込もうとすると、アプリがクラッシュします。そして、これは一重引用符と二重引用符、スラッシュ、および他に何を知っているかすべてに関係していると確信しています。

物事をテストするために、これらのトリッキーな文字を含まないいくつかの簡単なダミーデータを作成し、それをデータベースに挿入して(実行時に)、すべて正常に機能しました-アプリはクラッシュせず、デバイス上のsqliteデータベースが表示されましたすべて問題ありません - したがって、sqlite データベース、sql ステートメントなどに問題はないと確信しています。ダウンロードしたデータ/文字列がまだ何らかの形で破損しているに違いありません。

言うまでもなく、私は SQL の専門家ではありません。基本的には、最低限のことは知っています。私はこれを調査し、解決策を見つけたと思いましたmysql_real_escape_stringが、往復の解決策が必要な場合を除いて、一方向にしか機能しないようです。

ヒントや提案はありますか?

======================================

編集#1-これが私が使用しているコードです-提案されたものと、このiPhoneブックで見つけたもののハイブリッド:

NSString *sqlString = [NSString stringWithFormat:@"INSERT OR REPLACE INTO '%@' ('%@', '%@', '%@', '%@') VALUES (?, ?, ?, ?)", tableName, @"Title", @"Source", @"Date", @"StoryCopy"];

NSLog(@"The sql string is = '%@'", sqlString);
const char *sql = [sqlString UTF8String];
sqlite3_stmt *stmt;
int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, nil);
if (rc == SQLITE_OK) {
    sqlite3_bind_text(stmt, 0, [sTitle UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 1, [sSource UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 2, [sDate UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 3, [sCopy UTF8String], -1, SQLITE_TRANSIENT);
}

if (sqlite3_step(stmt) != SQLITE_DONE) {
    NSAssert(0, @"Error updating table!!!");
}

sqlite3_finalize(stmt);

問題は、挿入してはならない列に値を挿入することです。いたるところにあります。ここで何が問題なのですか?

4

1 に答える 1

3

クエリを正しく実行していないようです。最初に何かを「サニタイズ」する必要はありません。クエリの作成に文字列形式を使用しないようにしてください。代わりに、関数を適切に使用してくださいsqlite3_bind_xxx

例:

sqlite3_stmt *stmt;
int rc = sqlite3_prepare_v2(dbHandle, "INSERT INTO table_name (field1, field2) VALUES (?, ?)", -1, &stmt, nil);
if (rc == SQLITE_OK) {
    sqlite3_bind_text(stmt, 1, [someValue UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt, 2, [otherValue UTF8String], -1, SQLITE_TRANSIENT);
}

someValueはオブジェクトですotherValueNSStringテキストには、任意の Unicode テキストを含めることができます。を使用するとsqlite_bind_text、エスケープする必要のある文字をエスケープできます。

後で、 を使用してクエリから値を読み取るとsqlite3_column_text、元のテキストが返されます。

于 2013-06-19T21:12:48.167 に答える