以下codeigniter函数接受(字符串)参数并返回行的(整数)ID。如果我传递字符串值,它工作正常,但如果传递整数0,它返回数据库中第一行的ID。原则上,只有在数据库中存在user_id
时才应返回user_name
。由于没有名为0的user_name,因此应返回false。
有人能说出它为什么会这样,以及如何修复它?
感谢。
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 :(得分:2)
您应该添加if ($user_name == "") return false;
类型的测试来捕获它。
显然where
第二个参数0始终匹配,例如转换为SQL WHERE user_name
,而不是WHERE user_name = ""
,而WHERE user_name
是WHERE user_name != ""
的缩写 - 与您想要的相反: - )
当您传递一个必然会导致false
的参数时,在开头运行此测试会为您保存完整的数据库查询。
答案 1 :(得分:1)
您可以尝试将$ user_name强制转换为字符串,然后将其作为参数传递:
$user_name = (string)$user_name;
答案 2 :(得分:0)
您可以使用http://php.net/strval强制变量为字符串:
$this -> db -> where('user_name', strval($user_name));
您也可以尝试:
$this -> db -> where('user_name', "$user_name");
答案 3 :(得分:0)
这可能是一个类型问题,以及codeigniter或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;
}
当然,在选择数据库之前,在函数的开头放置它。
答案 4 :(得分:0)
这已经让我烦恼了几次,但是你知道,来自MySQL文档的一些信息。
“这是MySQL的已知和记录的功能。当你比较数字时 字符串,它们被比作浮点数。任何不以数字开头的字符串 隐式转换为数字0.因此得到的结果。请总是比较 如果你想防止不希望的结果,数字到数字和字符串到字符串。“
阅读http://dev.mysql.com/doc/refman/5.0/en/type-conversion.html了解详情。
因此,强制转换是确保在查询中进行适当比较的具体方法......或者再次从MySQL中进行比较......除了确保引用字符串文字之外,没有其他真正的解决方法。