我有以下脚本:
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。问题是在if语句中,var_dump始终返回false!
我缺少什么?预先感谢。
If (isset($login)){
//do what you need
}
if($login != NULL){
return (string)$login['_id'];
}else{
return false;
}
我遇到了这样的问题,而且奏效了。
尝试将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
,但是该可能发出警告(不确定)。
btw:尝试将INI文件设置为E_STRICT | E_ALL
您还有更多有关出了问题的线索。
根据您在评论中发布的内容,并查看您的代码,这一行:return (string)$login['_id'];
实际上是将对象投入到字符串中。结果看起来像这样:
array(5) { ["_id"]=> object(MongoId)#8 (1) //<-- OBJECT
{ ["$id"]=> string(24) "50d19fed9cc2318521000001" }
}
您正在使用 (string)
cast,
。您正在投入太多的顺便说一句:"$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
祝你好运,快乐编码