2012-01-11 7 views
1

期待される結果を返し、それが正常に動作しません。私は結果を得るCodeIgniterのデータベースクエリのバグ - 私は私のデータベースでこのクエリをテストし

select * from variables where value = 'commas-:-)';

。さて、変数に値を保存し、クエリクラスを使用しました。

$value = 'commas-:-)' < < <この

$query = "select * from variables where value = '$value'"; 
$this->db->query($query); 

今すぐパラメータとして渡され、このクエリは、この1を除く他のすべての値のために動作します - しかし、どのような奇妙なのはである私は、正確なクエリをプリントアウトした場合(print_r$query)、データベースでそれを実行すると、正しい結果が返されます。だから私はクエリクラスが私のクエリに悩まされていると思うようになりました。すべてが適切にエスケープされ、$valueが文字列リテラルなので、それはすべきではありません。

何が起こっていますか?これは動作します

+0

アクティブクエリを実行して違いがあるかどうか確認しましたか? '$ this-> db-> get_where( 'variables'、array( 'value' => $ value));' – Jakub

+0

私はちょっと試しました。私は、クエリを印刷し、それでも正常に動作します。 Hm。 – Kira

答えて

0

をチェックするためにこれらのものを使用しようと、私は問題を発見した - それは事故を起こしたリルート機能でした。より具体的には、システムコアのルートフォルダ内のセグメントフィルタリング機能。

私はエンコードされた値(:-)カンマ)でアンカーを作成し、私は私のコントローラに持っていた機能にURIを再ルーティングするルートを設定した:

これは何が起こったかです。リンクをクリックするたびに、値が渡され、(おそらく)関数に再ルーティングされます。それは、私が使ったほとんどすべての価値に対して、そうしました。これを除いて。

第1の仮定:dbクエリ関数は値をエスケープしています。しかし、私はエスケープをオフにし、印刷でクエリをチェックしました。値は正しい。私はその後、他のクエリフォーマットを試みましたが、まだ結果はありません。結論:データベースクエリ関数には何も問題はありません。

第2の前提:データが壊れている必要がありますが、値は正しいですが(私はコンマを得ています:-))、手動で値を入力するとき以外は何も戻っていません。だから私はこれをテストしました: 私は別の値を作成し、それが私が入力したもの(動作するもの)と等しくなるように設定しました。私はVAR_DUMPを使って元の値(1つを渡した)と新しく作成した値を表示しました。 引数の値(動作しないもの)は、長さが14の文字列ですが、新しい変数は長さが10の文字列でした。結論:変数を変更した再ルーティング/通過プロセス中に何かが発生しました。

私はconfigフォルダに戻って、リルートの変数$ iをリテラル文字列値のカンマに置き換えました:-)。そして、何を推測する?それは完璧に働いた。正規表現ではないことを確認するために、私は独自のカスタム正規表現を書いても問題はありませんでしたが、値はまだ変更されていました。だから私はボンネットの下に入ることに決めました。

ルートクラスのURI操作を_explode_segment()関数にトレースしました。これは正規表現を実行し、他の変数のURIを分析するために使用されました。それはまた...

_filter_uri($ strの)マッチしたURIセグメントの各部分の

この事をしました。

何をしましたか?これは、(と)のようなプログラム可能な文字をHTML ENTITYに置き換えます。今、あなたがわからないなら、htmlエンティティはURLのエンコーディングよりも長い長さを持っています。笑。何が起こったのかはこれでした:

オリジナルセグメント:コンマ - %3A-%29 < - とても素敵! フィルタ処理されたセグメント:コンマ - %3A-)< - NOOOOOOOOO! (右の括弧は、&#41で符号化された。)

urldecode(」&#41 ")=列(4) urldecode(" %29" )の文字列(1)

失敗=。

またはWIN ?!

0
$sql = "SELECT * FROM variables WHERE value = ?"; 
$this->db->query($sql, array('commas-:-)')); 

もっとinfo

0
$get_data = $this->db->from('variables') 
         ->where('value', $value) 
         ->get(); 

希望...!

は、クエリ

echo $this->db->last_query(); 

print_r($this->db->result_array($get_data)); 
+0

私はこれと同じ結果(結果なし)でこれを試しました。私はまた、それが返されたクエリをテストし、データベース上で正常に動作します... – Kira

関連する問題