0

我有以下脚本:

function canLogin($mail, $password) {
    if( isset($mail, $password) ) {
        $login = dbFind('users', array("mail" => (string)"$mail", "pass" => (string)"$password"), true);
        var_dump($login);
        if($login)
            { return (string)$login['_id']; }
            else { return false; }
    } else { return false; }
}

哪个函数 dbFind 如下:

function dbFind($collIn, $obj, $one = false) {
    global $db;

    $collection = $db->$collIn;

    if($one == true)
        return $collection->findOne($obj);
        else return $collection->find($obj);
}

现在,您可以从第一段代码中注意到,我正在使用 var_dump 查看 $login 变量的内容,然后检查它是否已设置。

当我有正确的登录名时,var_dump 从数据库返回正确的对象,否则返回 NULL。问题是在 var_dump 之后的 if 语句中总是返回 false!

我错过了什么?提前致谢。

4

3 回答 3

0

尝试将if语句更改为:

if (is_array($login) &&  array_key_exists('_id', $login) && $login['_id'] instanceof MongoId)
{
    //the array_key_exists check could be omitted, but is there just in case
    return (string) $login['_id'];
}

您可以省略前两项检查并使用!empty($login['_id']) && $login['_id'] instanceof MongoId,但这可能会发出警告(不确定)。
顺便说一句:尝试将您的 ini 文件设置为E_STRICT | E_ALL,也许这会给您一些关于出了什么问题的更多线索。

根据您在评论中发布的内容,并查看您的代码,这一行:return (string)$login['_id'];实际上是将对象转换为字符串。结果如下所示:

array(5) { ["_id"]=> object(MongoId)#8 (1) //<-- OBJECT
    { ["$id"]=> string(24) "50d19fed9cc2318521000001" } 
}

而且您正在使用(string)演员表,这感觉不对,正如 Sammaye 指出的那样,应该可以
。顺便说一句,你投了太多:"$foo"投到$foo一个字符串,因为双引号,不需要额外的投......但这不是重点......无论如何,试试这个:

return $login['id']->{'$id'};//need the single quotes, the property NAME is $id, not id

有关方法/属性和头痛的更多详细信息,请参阅mongoid 类的文档...

PS:使用getter方法可能更干净:

$login['_id']->getPID();//returns an int, not a string, though

祝你好运,快乐编码

于 2012-12-26T12:43:48.567 回答
0
If (isset($login)){
   //do what you need
}
于 2012-12-26T11:43:11.693 回答
0
if($login != NULL){
return (string)$login['_id'];
}else{
return false;
}

我遇到了这样的问题,这很有效,而且很有效。

于 2012-12-26T11:45:57.037 回答