2

今朝、PHP MySQLi のチュートリアル シリーズを見ていましたが、シリーズの作成者がわざわざ説明していないコードに出くわしました。このコードは以前に見たことがありますが、それがどのように機能するのか正確には知りませんでした...

while ($row = $result->fetch_object()) {
    // set up a row for each record
    echo "<tr>";
    echo "<td>" . $row->id . "</td>";
    echo "<td>" . $row->firstname . "</td>";
    echo "<td>" . $row->lastname . "</td>";
    echo "<td><a href='records.php?id=" . $row->id . "'>Edit</a></td>";
    echo "<td><a href='delete.php?id=" . $row->id . "'>Delete</a></td>";
    echo "</tr>";
}

MySQL クエリからの $result の結果をテーブルにつなぎ合わせていることは知っていますが、パラメーター内で割り当てが行われている while ループはどのように機能するのでしょうか?

$row = $result->fetch_object() をエコーアウトしようとしましたが、画面に何も表示されませんでした。

4

5 に答える 5

7

これは標準のフェッチ ループであり、ほとんどの PHP データベース API で結果リソースから行を取得するために使用されます。 mysqli_result::fetch_object()次の行をジェネリック型のオブジェクトに取得しstdClass、クエリによって返された列の名前を持つプロパティを持ちます。でその内容を表示できますvar_dump($row);

結果リソースが行を使い果たすと、 が返されFALSEwhileループが終了します。このパターンは PHP では非常に一般的です。一部のデータベース API は、単一の関数呼び出しから結果の配列を返すだけでフェッチ ループを抽象化する追加のメソッドを提供しますが、大規模なデータセットではメモリ効率が低下する可能性があります。行を使用するときに、データベースから一度に 1 行ずつ取得する方が望ましい場合があります。またはその親戚を呼び出しているときfetch_object()、実際には MySQL と通信し、PHP に別の行を提供するように要求しています。単純に呼び出すだけでquery()は、実際には行が PHP に返されません。

このような場合、 (連想配列に対して) fetch_object()orを使用するかどうかfetch_assoc()は、実際にはスタイルの問題です。

于 2012-08-20T00:46:27.183 に答える
2

クエリをデバッグするには、echo を使用しないでください。

var_dump() または print_r() を使用します

クエリが行っているのは、ループして、SQL テーブルのデータが入力されたテーブル行を作成することだけです。

while ($row = $result->fetch_object()) {

1つのレコードの内容に設定された変数 $row を生成するだけです(技術的には、JOINを使用すると、実際の「レコード」が1つ以上になりますが、ここでそれを使用しているとは思えません)、ループスルーしている間、列の値を$row->id.

于 2012-08-20T00:48:16.630 に答える
1

ラインで何が起こっているかを解き明かしましょう。

while ($row = $result->fetch_object()) {

  • $row = $result->fetch_object()、実際には変数の割り当てです。$result変数は、の結果であるmysqlリソースであると思われます[mysql_query][1]
  • で示されているループがありますwhile
  • 内部的に、fetch_objectmysql によって返された行がなくなるまで反復し、その時点でfetch_objectを返しfalse、それによってループを終了します。
  • echo'edを実行しても結果が得られなかっ$row = $result->fetch_object()たのは、変数の割り当てであるため、出力がないためです。デバッグするには、代わりに試してくださいvar_dump($result);
于 2012-08-20T00:52:19.757 に答える
1

PHP は C の構文に従い、代入演算子の結果は左オペランドの値になります。C標準から:

代入演算子は、左オペランドで指定されたオブジェクトに値を格納します。代入式は、代入後に左オペランドの値を持ちますが、左辺値ではありません。

次のように考えてください: $x == 5 を実行すると、結果は true または false になります。$x + 5 を実行すると、結果は $x が 5 増加したものになります。代入演算子は同様の方法で機能します。$x = 5 を実行すると、結果は 5 ($x の新しい値) になります。これは次の方法で確認できます。

$x = 0;
echo $x = 5;
echo "\n";
echo $x += 100; 

「5」と「105」が表示されます。

通常、= 演算子の副作用 (変数に何かを格納すること) のみを気にし、その結果 (後の変数の値) は気にしないので、この構文は少し混乱します。while($var = f()) { }ただし、割り当てと結果のチェックを同時に行う必要がある場合があるため、この構成はかなり一般的です。ループを構築するもう 1 つの方法は、無限ループを使用することfor (;;) { $row = $result->fetch_object(); if(!$row) break; ... }です。しかし、それは見苦しく見えます。

実行しても何も表示されない理由$row = $result->fetch_object()は、おそらくすべての行が既に取得されており、fetch_object() が false を返しているためです。

于 2012-08-20T01:18:07.600 に答える
0

while ループの動作を拡張するために、fetch_object() メンバー関数は結果セットの次の行のオブジェクトを返すか、それ以上行がない場合は偽の値を返します。

while ループは、オブジェクトがなくなると終了します。

$row = $result->fetch_object()

$row を偽の値に設定し、while ループによって次のように評価されます。

while (false)

while ループを終了し、非オブジェクト値のメンバーを取得しようとしません。

于 2012-08-20T00:50:50.280 に答える