WordPress での IN() 条件を使用したプリペアド ステートメントの処理
WordPress には、SQL インジェクション攻撃から保護し、クエリのパフォーマンスを向上させるためのプリペアド ステートメントが用意されています。ただし、文字列内の複数の値で IN() 条件を使用すると、問題が発生する可能性があります。
問題ステートメント:
次の状況を考えてみましょう:
$villes = '"paris","fes","rabat"'; $sql = 'SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN(%s)'; $query = $wpdb->prepare($sql, $villes);
このコードは文字列を適切にエスケープしていないため、二重引用符がエスケープされた単一の文字列になります:
SELECT distinct telecopie FROM `comptage_fax` WHERE `ville` IN('\"paris\",\"fes\",\"rabat\"')
解決策:
正しくWordPress で複数の値を持つ準備されたステートメントを実装するには、次の手順に従います:
// Create an array of the values to use in the list $villes = array('paris', 'fes', 'rabat'); // Generate the SQL statement. // Number of %s items based on length of $villes array $sql = " SELECT DISTINCT telecopie FROM `comptage_fax` WHERE `ville` IN(" . implode(', ', array_fill(0, count($villes), '%s')) . ") "; // Call $wpdb->prepare passing the values of the array as separate arguments $query = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($sql), $villes));
使用する PHP 関数:
このアプローチにより、$villes の値が適切にエスケープされ、IN() 条件で別の値として扱われることが保証されます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3