5

だから私は、電子メールアドレスをデータベース内のパスワードと照合し、フォームを介してユーザーが入力したデータと比較しようとするこの単純なログイン機能を持っています。

function login($email, $password){
    $m = new Mongo("localhost"); 
    $m->connect();
    $db = $m->users;
    $collection = $db->test_collection;

    echo "<pre>";
    var_dump($collection->findOne(array('name' => 'john'))); //returns correctly
    var_dump($collection->find(array('name' => 'john'))); //returns mongo cursor object
    echo "</pre>";
}

find() がカーソルオブジェクトのみを返す理由がわかりません。答えは?

これはモンゴのドキュメントです

array(5) {
  ["_id"]=>
  object(MongoId)#22 (1) {
    ["$id"]=>"4d7eaa848baf84d32b000000"
  }
  ["activated"]=> (true)
  ["email"]=> "john@smith.com"
  ["name"]=> "john"
  ["password"]=> "334c4a4c42fdb79d7ebc3e73b517e6f8"
}

同じドキュメント内で電子メールとパスワードの両方を検索する "WHERE" クエリを実行するにはどうすればよいですか? 私は明らかに、find() および findOne() クエリに対して正しいパラメーターを取得していません。PHPの正しい構文は何ですか?

4

2 に答える 2

5

findカーソルを返すことになっています。詳細については、http: //www.mongodb.org/display/DOCS/Queries+and+Cursors を参照してください。カーソルからドキュメントを取得するには、それを反復処理する必要があります。

あなたの場合、findOne同じユーザー名とパスワードを持つ複数のユーザーを想定していないため、おそらくあなたが求めているものです。findOne 関数は常に多くても 1 つのドキュメントを返すため、カーソルは必要ありません。

クエリに複数の述語を含めるには、クエリ配列にフィールドを追加するだけです。

var_dump($collection->findOne(array('name' => 'john', 'password' => '334c4a4c42fdb79d7ebc3e73b517e6f8')));

(それが正しい PHP の場合 - 私の PHP は少し錆びています)

于 2011-03-17T11:05:15.530 に答える
1

試す

return count($collection->find(array('name' => $name, 'password' => $password)));
于 2011-10-26T15:06:51.153 に答える