iOS sqlite データベースのサンプル コードに、4 行 3 列のテーブルがあります。
クエリを使用してテーブルからデータを取得しています
Select * from table where column_name=? ;
column_name=?
サンプルコードによると、問題があります: どういう?
意味ですか?
行のインクリメントに使用されますか?
? 実際の値のプレースホルダーであり、コンパイル済みステートメントにバインドする必要がある値です。このリンクでは、バインドに関する詳細が説明されています。
値をクエリ文字列に入れるだけでなくバインドする理由は、ユーザーから直接提供された値を使用している場合に発生する可能性のある SQL インジェクション攻撃から保護するためです。
は?
、値にバインドするプレースホルダーを表します (たとえば、テキスト値を設定するには、ステートメントを実行したsqlite3_bind_text
後、 .sqlite3_prepare_v2
sqlite3_step
sqlite3_bind
ドキュメントを参照してください。
を使用して SQL を構築したくないため、これは知って使用することが非常に重要な構造ですstringWithFormat
。を使用sqlite3_bind
することで、入力に含まれる可能性のある引用符をエスケープするコードを記述する必要がなくなります。たとえば、値を挿入しようとしている場合Joe's Bar and Grill
(単一引用符を使用している場合、アポストロフィが SQL を混乱させます)。またはDwayne "The Rock" Johnson
(二重引用符を使用している場合、引用符がSQLを台無しにします)。また、SQL インジェクション攻撃からも保護します。sqlite3_bind
SQL ステートメントを手動で作成するのではなく、必ず使用してください。
「?」に使用されます...
これは通常、後でパラメーターが入力される準備済みステートメントを意味します。(たとえばhttp://en.wikipedia.org/wiki/Prepared_statements#Parameterized_statementsを参照)。
また
一部のステートメントでは、ステートメントが実行されるたびに異なる値が挿入される可能性があるため、ステートメントの準備時にパラメーターが不明です。これらのステートメントでは、ステートメントの実行時にパラメーターを指定する必要がある場所に、疑問符 ( ? ) プレースホルダーを使用できます。
また
PreparedStatement オブジェクトは、パラメーターのない SQL ステートメントにも使用できますが、おそらくパラメーターを受け取る SQL ステートメントに最も頻繁に使用します。パラメーターを取る SQL ステートメントを使用する利点は、同じステートメントを使用して、実行するたびに異なる値を指定できることです。