入力が数値であるかどうかを実際にテストする必要はありません。MySQLでは、たとえば'123abc'
数値コンテキスト(整数列id
と比較されるような) )暗黙的に数字のみを取得し、残りを無視します。 'abc'
のような数値以外の文字列 先頭の数字がないため、単純に整数値0になります。
重要なのは、クエリパラメータを使用する場合、値はSQLインジェクションから安全であるということです。入力が$_SESSIONからのものか、別のソースからのものかは関係ありません。 $ _SESSIONは、SQLインジェクションに関して安全でも危険でもありません。重要なのは、クエリにデータを渡す方法です。
また、コードを簡略化して、パラメータープレースホルダーのリストをフォーマットします。
$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));
そして、bindParam()を忘れて、配列をexecute()
に渡すだけです。 。
//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories`
WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();
コメントを再確認してください:
PDOでは、:id
などの名前付きパラメーターを使用できます。 、または常に?
である位置パラメータを使用できます (ただし、特定のクエリでこれら2つのタイプを混在させないでください。どちらか一方を使用してください)。
配列をexecute()
に渡す 配列要素をパラメーターに自動的にバインドします。単純な配列(つまり、整数でインデックス付けされている)は、位置パラメーターに簡単にバインドできます。
名前付きパラメーターを使用する場合は、配列のキーがパラメーター名と一致する連想配列を渡す必要があります。配列キーには、オプションで:
のプレフィックスを付けることができます。 ただし、必須ではありません。
PDOを初めて使用する場合は、ドキュメント を読むことをお勧めします。 。コード例とすべてがあります!