2017-07-05 13 views
0

私はデータベース内でCodeIgniterのクエリクラスを使用して "between"クエリを作成しようとしていますが、where句に変数を追加すると、変数に追加します。このに解析されているCodeIgniterのアクティブレコードクエリで変数のバッククォートを削除/無効にする

$this->db->select(TABLE_DISCOUNTSCARRIER.'.discount')->select(TABLE_DISCOUNTSCARRIER.'.idCarrier') 
$this->db->from(TABLE_DISCOUNTSCARRIER); 
$this->db->join(TABLE_DISCOUNTS, TABLE_DISCOUNTSCARRIER.'.idDiscount='.TABLE_DISCOUNTS.'.idDiscount'); 
$this->db->where(TABLE_DISCOUNTSCARRIER.'.idCarrier', $carrier); 
$this->db->where($data['from'].' BETWEEN '.TABLE_DISCOUNTS.'.from AND '.TABLE_DISCOUNTS.'.to'); 
$this->db->or_where($data['to'].' BETWEEN '.TABLE_DISCOUNTS.'.from AND '.TABLE_DISCOUNTS.'.to'); 

(最後の2行)

SELECT 
    discountbycarrier.discount, 
    discountbycarrier.idCarrier 
FROM (discountbycarrier) 
JOIN discounts 
ON discountbycarrier.idDiscount=discounts.idDiscount 
WHERE `discountbycarrier`.`idCarrier` = '6' 
AND `5` BETWEEN discounts.from AND discounts.to 
OR `10` BETWEEN discounts.from AND discounts.to 

が既に設定しようとしたの$ this - > DB - > _ protect_identifiers =偽;残りのステートメントでバッククイックを削除しますが、変数は削除しません。すでに変数のintval()を使ってみましたが、どちらもうまくいきません。 $ carrierという変数は、整数として正しく解析されています。 アイデア前もって感謝します。

+0

あなたの問題は、バックの欠如であるクエリ前にこれを追加ティック、特にここでは 'discounts.from'という単語は' from 'という単語を持たないことから予約されています。 – ArtisticPhoenix

+0

私はちょうど_protect_identifiersをfalseに設定しているので、ティックがありません。私がそれを有効にすると、クエリの残りの部分には割引を含むバックティックがあります。 –

+0

私は適切なSQLを使用しています。愚かなクエリビルダーではなく、 '?'のように入れてから値を渡してはいけません。そうでなければ、これはSQLインジェクションのために成熟しています。 – ArtisticPhoenix

答えて

0

変更この

discounts.from 

discounts.`from` 

以上(ベストプラクティス)に単語FROMは、他の言葉で、クエリ言語の一部であり、表の列のために予約されたキーワードを使用していません。

バックトックは、予約されたキーワードとスペースをエスケープするために使用されます。

UPDATE

このような何か(私はドキュメントを見ていないが)

$this->db->where('? BETWEEN '.TABLE_DISCOUNTS.'.from AND '.TABLE_DISCOUNTS.'.to', $data['from']); 
0

$this->db->_protect_identifiers=false; 
+0

私はそれを使用したと投稿し、バックティックはとにかく登場しました –

+0

ああ、私はそれを見ていませんでした。期待するクエリ文字列を投稿できますか? – reignsly

関連する問題