2011-06-22 140 views
2

以下codeigniter函數使用(string)參數並返回該行的(整數)ID。它工作正常,如果我傳遞字符串值,但如果傳遞整數0,它會返回數據庫中第一行的ID。原則上,只有在數據庫中存在user_name時,纔會返回user_id。由於沒有user_name稱爲0,它應該返回false。 有人可以告訴爲什麼它的行爲如何以及如何修復?關於PHP函數返回的問題

謝謝。

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;  
    } 

例如:

$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

你應該添加一個k的測試ind if ($user_name == "") return false;趕上這一點。

顯然where與第二個參數0總是匹配,例如,轉換成SQL WHERE user_name,而不是WHERE user_name = ""WHERE user_name是短手WHERE user_name != "" - 當你經過的你想要的:-)

運行在開始本次測試的對面爲您節省了完整的數據庫查詢這個論點必然會導致false

0

您可以使用http://php.net/strval迫使變量是一個字符串:

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

你還可以嘗試:

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

你可以嘗試投$ USER_NAME到字符串之前,它傳遞的PARAM:

$user_name = (string)$user_name; 
0

這很可能是一個類型的問題,以及如何笨或者是SQL正在處理的整數。

由於您知道用戶名將會是一個字符串,因此將所有內容都轉換爲字符串。我相信下面應該解決這裏的任何問題;

$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 Documentation的一些信息。

「這是已知的,記錄在案的MySQL的功能,當你比較數字來 字符串,它們被比作浮點數。不以數字 啓動任何字符串隱式轉換爲數字0。因此,結果你得到,如果你想防止不希望的結果,請總是比較 數字和字符串到字符串。「

閱讀http://dev.mysql.com/doc/refman/5.0/en/type-conversion.html瞭解詳情。

所以,鑄造是確保在查詢中正確比較的具體方法...或從MySQL再次...除了確保字符串文字被引用之外,沒有真正的解決方法。