2011-06-22 19 views
2

次のcodeigniter関数は(文字列)パラメータをとり、行の(整数)IDを返します。文字列の値を渡すと正常に動作しますが、整数0が渡された場合、データベースの最初の行のIDが返されます。原則として、user_nameがデータベースに存在する場合にのみuser_idを返します。 0と呼ばれるuser_nameは存在しないので、falseを返すはずです。 誰かがこのようにふるまう理由と解決方法を伝えることができますか?PHP関数の返り値に関する質問

ありがとうございました。

$user_name = "test"; //works fine, returns id. 
$user_name = "0"; //works fine, doesnt return anything 
$user_name = 0;  //Problem. returns ID of first row. 
+0

問題は生成されたSQL文にあります。WHERE()に文字列として渡す必要があります。 – Gerep

答えて

2

あなた例えば

public function get_user_id($user_name) 
    { 
     $this -> db -> select('user_id'); 
     $this -> db -> from('users'); 
     $this -> db -> where('user_name', $user_name); 
     $this -> db -> limit(1); 

     $query = $this->db->get(); 

     if ($query->num_rows > 0) 
     { 
      $row = $query->row(); 
      return $row->user_id; 
     }  
    return false;  
    } 

kのテストを追加する必要がありますこれをキャッチするにはif ($user_name == "") return false;を入力してください。

明らかに第2引数0のwhereが常に一致します。 WHERE user_name = ""ではなく、SQL WHERE user_nameに変換、およびWHERE user_nameWHERE user_name != ""のための短い手である - あなたが合格しているときは、初めにこのテストを実行している:-)

欲しかったものの反対はあなたに完全なデータベースクエリを保存します引数は必ずfalseになります。

0

あなたが文字列で変数を強制的にhttp://php.net/strvalを使用することができます:

$this -> db -> where('user_name', strval($user_name)); 

ます。また、試すことができます。

$this -> db -> where('user_name', "$user_name"); 
1

あなたは前のparamとして渡す文字列に$ user_nameのをキャストしようとすることができます:

$user_name = (string)$user_name; 
0

それはタイプの問題になりそうだし、どのように、おそらくCodeIgniterのか、SQLが整数を扱っています。

usernameが文字列になることが分かっているので、すべてを文字列にキャストします。私は次のようにして問題を解決するべきだと考えています。

$this -> db -> where('user_name', (string) $user_name); 

あなたが予想される場合は、オブジェクトはまた、あなたが最良の条件にしてください、このオブジェクトに渡されます:

もちろん、機能の開始時に、ということを入れ
if(is_object($user_name)) { 
    $user_name = $user_name->__toString(); 
} else { 
    $user_name = (string) $user_name; 
} 

、あなたが選択する前にデータベース。

0

これは私には何度か迷惑をかけましたが、知っているとおり、MySQLドキュメントの情報です。

「これはあなたが 文字列に数字を比較すると、それらは浮動小数点数として比較されます。MySQLのの特徴を知られ、文書化されている。数字 で始まっていない任意の文字列が暗黙のうちにあなたが故に番号0に結果を変換され、望ましくない結果を防ぐには、数字と文字列を数字に常に と比較してください。

詳細はhttp://dev.mysql.com/doc/refman/5.0/en/type-conversion.htmlをお読みください。

キャストは、クエリの適切な比較を確実にする具体的な方法です...またはMySQLからもう一度...文字列リテラルが引用されていることを確認する以外には、実際の修正はありません。