28

PHP/MySQLをしばらく使用していますが、 mysql_fetch_object()vs mysql_fetch_assoc()/を使用することに特定の利点 (パフォーマンスなど) があるかどうか疑問に思っていますmysql_fetch_array()

4

9 に答える 9

41

パフォーマンスに関しては、何を使用しても問題ありません。違いは、mysql_fetch_object がオブジェクトを返すことです。

while ($row = mysql_fetch_object($result)) {
    echo $row->user_id;
    echo $row->fullname;
}

mysql_fetch_assoc() は連想配列を返します:

while ($row = mysql_fetch_assoc($result)) {
    echo $row["userid"];
    echo $row["fullname"];
}

そして mysql_fetch_array() は配列を返します:

while ($row = mysql_fetch_array($result)) {
    echo $row[0];
    echo $row[1] ;
}
于 2008-09-23T22:25:46.817 に答える
30

mysql_fetch_arrayコードが読みにくくなります = メンテナンスの悪夢です。オブジェクトがどのデータを扱っているかを一目で確認することはできません。少し高速ですが、それが重要な場合は、大量のデータを処理しているため、PHP はおそらく適切な方法ではありません。

mysql_fetch_object特にデータベースレイヤーをベースにしている場合は、いくつかの欠点があります。

  • 列名は有効な PHP 識別子ではない可能性があります。たとえばtax-allowanceuser.idデータベース ドライバーがクエリで指定された列名を提供する場合などです。次に、{}あらゆる場所で使用を開始する必要があります。

  • その名前に基づいて列を取得したい場合は、いくつかの変数をストローし、変数のプロパティも使用し始める必要がありますが$row->{$column_name}、配列構文は$row[$column_name]

  • クラス名を指定すると、予想されるときにコンストラクターが呼び出されません。

  • クラス名を指定しないと が得られますがstdClass、これはとにかく配列よりも優れているとは言えません。

mysql_fetch_assocは 3 つの中で最も操作が簡単で、オブジェクトとデータベースの結果行の間のコードの違いが気に入っています...

$object->property=$row['column1'];
$object->property=$row[$column_name];
foreach($row as $column_name=>$column_value){...}

多くの OOP ファン (そして私は OOP ファンです) は、すべてをオブジェクトに変換するというアイデアを好みますが、連想配列はオブジェクトよりもデータベースの行のモデルとして優れていると感じています。行は単なるデータであり、それ以上複雑にすることなくそのように扱う必要があります。

于 2009-08-11T21:26:08.450 に答える
5

覚えておくべきこと: 配列はメモリ キャッシュ (eaccelerator、XCache など) に簡単に追加できますが、オブジェクトはできません (保存するときにシリアル化し、取得するたびにシリアル化を解除する必要があります!)。

メモリ キャッシュ サポートを追加する場合は、オブジェクトの代わりに配列を使用するように切り替えることができますが、その時までに、以前に使用されていたオブジェクト型の戻り値を使用する多くのコードを変更する必要がある場合があります。

于 2009-02-27T10:48:08.863 に答える
4

で配列をフェッチするとmysql_fetch_array()、foreach ループまたは for ループのいずれかを介して結果セットをループできます。mysql_fetch_object()for ループでトラバースすることはできません。

それがそれほど重要かどうかはわかりませんが、言及したいと思いました。

于 2008-09-23T22:15:28.807 に答える
2

さらに、最終的に MySQL の結果に Memcaching を適用する場合は、配列を選択することをお勧めします。オブジェクト型の結果よりも、配列型を格納する方が安全なようです。

于 2012-01-28T10:47:04.353 に答える
1
while ($Row = mysql_fetch_object($rs)) {
    // ...do stuff...
}

・・・私はずっとそうしてきました。私はデータのコレクションに配列ではなくオブジェクトを使用することを好みます。これは、データをより適切に整理するためであり、オブジェクトに任意のプロパティを追加しようとする可能性は、インデックスを追加しようとするよりもはるかに少ないことを知っています。配列に (私が PHP を使用した最初の数年間は、任意のプロパティをオブジェクトに割り当てることはできないと思っていたので、そうしないことが根付いています)。

于 2008-09-23T22:21:27.577 に答える
1

速度に関しては、mysql_fetch_object()と同じでmysql_fetch_array()、 とほぼ同じ速さmysql_fetch_row()です。

また、 では、mysql_fetch_object()対応するフィールド名によってのみフィールド データにアクセスできます。

于 2008-09-23T22:42:58.897 に答える
0

特にコードの可読性と比較すると、これらすべての機能の違いは重要ではないと思います。

この種の最適化が心配な場合は、 を使用してmysql_fetch_row()ください。連想配列 ($row[2] など) を使用しないため、最も高速ですが、コードを壊すのが最も簡単です。

于 2008-09-23T22:17:12.577 に答える
-2

私は反対票を投じますmysql_fetch_array()

数値的にインデックス付けされた列と列名の両方が返されるため、2 倍の大きさの配列が作成されます。コードをデバッグしてその内容を表示する必要がない場合は問題ありません。しかし、それ以外の私たちにとっては、奇妙に見える形式で 2 倍の量のデータを処理する必要があるため、デバッグが難しくなります。

この関数を使用するプロジェクトに出くわすことがあり、デバッグすると、データに数値列が混在しているため、何かがひどく間違っていると思います。

したがって、正気を保つために、この関数を使用しないでください。コードのメンテナンスがより困難になります。

于 2008-09-23T23:07:02.380 に答える