2

これらの文字列はフィールド値としてクエリで使用されるため、クエリに適した文字列を準備する必要があります。'などが含まれている場合、SQLクエリの実行に失敗します。

したがって、'を''に置き換えたいと思います。サブストリングを見つけてサブストリングに置き換えるコードを見てきました。しかし、文字列の置換には2つの一重引用符'' 1つの引用符の置換'も含まれているため、問題は少し注意が必要です。次の出現箇所を見つける必要がある場合、意図的に置換された'に遭遇します。

Sql lite C apiを使用していますが、クエリ例は次のようになります。

 select * from persons where name  = 'John' D'oe'

John Doeには'が含まれているため、クエリは失敗します。そのため、名前に含まれる'のすべてを''に置き換えたいと思います。

SQLで使用するクエリのフィールド値をどのように準備するかについてのアイデアはありますか?それは基本的なことかもしれませんが、私はC /C++ではあまり賢くありません。

あなたの助けはとても役に立ちます

4

2 に答える 2

4

いくつかの問題 (SQL インジェクションの脆弱性など) につながる可能性があるものを置き換える代わりに、引数を使用してクエリを使用します。

MySQL の例:

sql::Connection *con = ...;
string query = "SELECT * FROM TABLE WHERE ID = ?";
sql::PreparedStatement *prep_stmt = con->prepareStatement(query);
prep_stmt->setInt(1, 1); // Replace first argument with 1
prep_stmt->execute();

これが実行されSELECT * FROM TABLE WHERE ID = 1ます。

編集: SQLite 準備済みステートメントの詳細については、こちらこちらをご覧ください。

于 2013-01-23T15:38:13.913 に答える
1

使用しているSQLライブラリによって異なります。それらのいくつかは、変数の代わりに疑問符を使用するPreparedStatementの概念を持ち、ステートメントにそれらの変数を設定すると、内部的にSQLコマンドを挿入できないようになります。

于 2013-01-23T15:35:54.287 に答える