2011-06-22 97 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再次...除了确保字符串文字被引用之外,没有真正的解决方法。