0

jqGrid に一連の製品カテゴリを返す「ajax スクリプト/ハンドラー」があります。SQLは最終的に次のようになります。

$sql = 'SELECT * FROM product_categories ORDER BY :sidx :sord LIMIT :start , :limit';
$sth = $dbh->prepare($sql);
$sth->bindParam(':sidx', $sidx);
$sth->bindParam(':sord', $sord);
$sth->bindParam(':start', $start, PDO::PARAM_INT);
$sth->bindParam(':limit', $limit, PDO::PARAM_INT);
$sth->execute();

PDO には LIMIT に問題があるようで、上記が機能するように (int) として明示的に設定する必要があったため、既に '$start' に問題がありました。私の次の問題は、ORDER BY フィールドが引用されていることです。引用符を停止するにはどうすればよいですか? '$sidx' と '$sord' の値をサニタイズせずに直接渡すこともできますが、これは危険です。現在、上記の SQL は次のように生成されます。

SELECT * FROM product_categories ORDER BY 'product_category' 'asc' LIMIT 0 , 10

実際に次のようにする必要がある場合:

SELECT * FROM product_categories ORDER BY product_category asc LIMIT 0 , 10
4

1 に答える 1

1

おそらく最良の解決策は、サニタイズせずに$sidxとの値を直接渡すことですが、事前に検証を行うことです。$sordお気に入り:

$sidx = (!in_array($sidx,array('name','slug','description'))) ? 'name' : $sidx;
$sord = (!in_array($sord,array('asc','desc'))) ? 'asc' : $sord;
$sql = 'SELECT * FROM product_categories ORDER BY '.$sidx.' '.$sord.' LIMIT :start , :limit';
$sth = $dbh->prepare($sql);
$sth->bindParam(':start', $start, PDO::PARAM_INT);
$sth->bindParam(':limit', $limit, PDO::PARAM_INT);
$sth->execute();
于 2012-10-21T17:38:02.520 に答える