スレッド表示 | フラット表示〕 全トピック 923 件中 208 番目 次≫ ≪前

配列について

created: 2006-08-09 15:35 | modified: 2006-08-11 00:19 | reply: 7

[3218] IN演算子を使っては?

user: ach | created: 2006-08-10 03:44
SQLにはこういうこともあろうかとIN(ANY)演算子という便利な演算子が存在します.

select * in hoge where bar IN (2,4,6);
これは次のSQL文と同じです
select * in hoge where bar = 2 OR bar = 4 OR bar = 6;

これを利用してコードを書くとこんな感じです
//SQLインジェクション対策
$checkbox = $_POST['chk'];
foreach ($checkbox as $val)
if (!is_numeric($val)) die("不正入力\n");

//INコマンド一発でセレクト(implode関数はマニュアルに載ってます)
$result = pg_query($con, 'select * from sample where code IN ('. implode(',', $checkbox) .')');

//結果セットをループ
while ($row = pg_fetch_row($result)) {
var_dump($row);
}

SQLインジェクション対策(サニタイズ部分)の汎用性をあげるとこんな感じ
//サニタイズ関数 PEAR::DB::pgsql の smartquoteをハック
function sanitize($in)
{
if (is_numeric($in))
return (string)$in;
if (is_string($in))
return "'" . str_replace("'", "''", str_replace('\\', '\\\\', $in)) . "'";
return FALSE;
}

//array_mapでサニタイズして,string以外があれば不正入力
$checkbox = @array_filter(array_map('sanitize', $_POST['chk']), 'is_string');
if (!is_array($checkbox)
|| count($checkbox) == 0
|| count($checkbox) != count($_POST['chk']))
die("不正入力\n");

sqliteでテストしたときはうまくいきましたが,pogtgresqlではどうかなぁ
Parent: 3212  reply: 3220 返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 923 件中 208 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑