0

MySQLよりも安全にするためにphpMySQLiクラスを使用していますが、問題があります。

アポストロフィを含むデータの列があります。この列を、アポストロフィを持たない変数と比較しています。これは、URLからのクリーンな文字列です。私の古いコードでは、SQLステートメントでReplace(category_name、''''、'')を簡単に実行でき、アポストロフィは要素になりませんでした。

これをphpmyadminにスローすると、機能します。

SELECT DISTINCT merchant_category
FROM products
WHERE Replace( category_name, '''', '' ) = 'childrens accessories'
ORDER BY merchant_category

しかし、MySQLiでは、解析されないため、これは実際の問題です。

        $params = array();
    $params[0] = "Replace(category_name, '''', '')";
    $params[1] = $this->db->escape($this->cleanDBValue(requestQS("cat1")));

    //print_r($params);

    $rs = $this->db->rawQuery("SELECT DISTINCT merchant_category FROM products WHERE ? = ? ORDER BY merchant_category ", $params);  

クエリと照合しようとしているデータは次のとおりです。

children's accessories

そして、私は何の結果も得ていません。どうすればこれを回避できますか?

4

1 に答える 1

2

コードにはいくつかの欠陥があります。

  1. データリテラルのみをバインドできます。識別子ではありません。Mysql関数ではありません。さまざまなSQLパーツではありません。ただし、データリテラルのみ。
  2. 古いコードでそれを行った方法はひどいです。入力データを適切にエスケープする代わりに、すでにデータベースにあるデータを「エスケープ」しました。

したがって、これらの両方を取り除き、クエリを次のように単純にする必要があります。

$param = str_replace('-',' ',$_GET['cat1']); //yes, I don't trust your functions
$sql = "SELECT DISTINCT merchant_category FROM products 
        WHERE category_name = ? ORDER BY merchant_category";
$rs = $this->db->rawQuery($sql, array($param)); 

動作しない場合は、デバッグしてください。ただし、この方法でのみ機能させる必要があります。交換やものなし。

更新:
わかりました。
URLスラッグをカテゴリ名と照合しようとしています。
それは間違った方法です。
テーブルに別のフィールドを追加します。これには、URLからの正確なスラッグが含まれます。
そして、これと一致します。
そうしないと、常に問題が発生します。

于 2013-01-30T20:24:12.980 に答える