2012-08-24 89 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 
}