2

私はphpとmysqlの初心者です。現在、PDOを自習しており、いくつかの概念を混乱させています。

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$sql = "SELECT * FROM users";
$users = $dbh->query($sql);

1.PDOクラスとPDOStatementクラスの関係は何ですか?

$dbhクラスPDOの新しいオブジェクトですが、なぜ$ usersがPDOStatementオブジェクトなのですか?fetchAll()クラス内の関数ですがPDOStatement、このように使用できます、またはオブジェクトですか?$users->fetchAll()$usersPDOPDOStatement

2.誰かが$usersがカーソルであり、一度消費されると、結果セットの先頭に巻き戻されないと言いました。

foreach ($users as $row) {
    print $row["name"] . "<br/>";
}

foreachしかし、なぜあなたはそれをステートメントで使うことができるのですか?foreach配列を反復処理する方法を提供します。実際のカーソルとは何ですか?カーソルはポインタですか?

3. pdostatementクラスの場合、ドキュメントは次のように述べています。

PDOStatement implements Traversable { ... }

このクラスがTraversableインターフェイスを実装するのはなぜですか?それは空のインターフェースですか?

助けてくれてありがとう!

4

2 に答える 2

2

ドキュメントによると、Traversableインターフェイスを使用すると、オブジェクトをforeachループで使用でき、内部でのみ使用されることになっています。PDOStatementを使用する便利な方法と考えてください。

基本的に、PDOでは、クエリを実行する方法が2つあります。1つはPDO :: prepare()PDOStatement :: execute()を使用する方法、もう1つはPDO :: query()を使用する方法です。後者は1回の呼び出しで準備/実行します。

PDO::query()一方、結果は返されPDO::execute()ませんが、PDOStatementオブジェクトを使用すると、返すデータを指定できます。PDOStatement :: fetchAll()を使用すると、データを整理する方法を定義できます。

一見するともっと複雑に見えますが、柔軟性があります。

于 2013-03-14T05:32:33.503 に答える
1

その混乱はすべて「シンタックスシュガー」と呼ばれ、開発者の生活を甘くすることを目的としていますが、実際には味が甘すぎて嫌悪感を覚えます。

したがって、オブジェクトの特性には、自然なものと不自然なものの2種類があります。
そして、あなたの混乱はすべて後者から来ています。

あなたの代わりに、私はそれらを忘れて、オブジェクトをまっすぐに使用します。

1.PDOクラスとPDOStatementクラスの関係は何ですか?

それは2つの異なるクラスです。それらは異なる目的を果たします。古いmysqlのように、接続リソースと結果リソースがありました。接続/PDOインスタンスは1つだけですが、実際のクエリ結果/stmtクラスはいくつでも存在できます。

しかし、なぜforeachステートメントで使用できるのでしょうか。

それは私が上で話したまさに構文糖衣です。彼らはそのような可能性をステートメントオブジェクトに追加しただけです。

于 2013-03-14T05:22:38.363 に答える