2012-08-24 62 views
1

我正在从mysqli转换为mongodb,并且在基本任务中遇到了一些问题。
这是登录验证过程的一部分,如果电子邮件和密码与dB中设置的记录相匹配,我想获取_id并创建会话变量。

继承人我到目前为止,我所做的所有搜索似乎有关于从不同的步骤获取_id的信息,我无法修改它适合我的情况。

另外,如果我的逻辑是太乏味了从mysqli翻译的,请我是开放的最佳实践建议noSqlphp mongodb在查询后找到_id

$collection = $db->members; 
$query = array("email" => $email, "password" => $newpass); 
    //$cursor = $collection->findOne($query); // was told this is better but need deeper understanding 
$cursor = $collection->find($query); 
$result = $cursor->count(); 

if($result==1){ 
    $_SESSION['email'] = $email; 

    //having problems here 
    $id = $cursor->findOne(array("_id" => $query['_id'])); 
    $_SESSION['id'] = $id; 

    return true; 
}else 
    return false; 

问题我如何得到_id认证唯一的用户名后和密码?

+1

加上投票结余。对我来说似乎是个好问题。 – ChelseaStats

回答

4

您不应该在光标上运行findOne。光标指向前一个查询的结果,可以使用iterator_to_array获取包含所有找到记录的数组。或者你也可以在第一时间使用findOne() - 它返回的实际行

$collection = $db->members; 
$query = array("email" => $email, "password" => $newpass); 
$result = $collection->findOne($query); 

if(!empty($result)){ 
    $_SESSION['email'] = $email; 

    //having problems here 
    $id = "" . $result['_id']; // cast to string, as its a MongoId object 
    $_SESSION['id'] = $id; 

    return true; 
}else 
    return false; 
4

可以确保您所查询的唯一性(这是一个登录系统更好)。

所以使用findOne()。它会返回给您一个文档。请记住,在MongoDb中,您将获得文档或游标文档。

检查文档,您只能返回文档的一部分。 Official Documentation

$doc = $col->findOne(
     array('pass'=> $pass, 'email'=>$email),//select 
     array('_id'=>1)//field selection 
); 
if ($doc){ 
    //do your session stuff 
}