关于PHP函数返回的问题

时间:2011-06-22 11:28:18

标签: php mysql function codeigniter return

以下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.

5 个答案:

答案 0 :(得分:2)

您应该添加if ($user_name == "") return false;类型的测试来捕获它。

显然where第二个参数0始终匹配,例如转换为SQL WHERE user_name,而不是WHERE user_name = "",而WHERE user_nameWHERE 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中进行比较......除了确保引用字符串文字之外,没有其他真正的解决方法。