web-dev-qa-db-ja.com

MysqlはPHP-配列またはオブジェクトですか?

少しの間PHP/MySQLを使用していて、mysql_fetch_object()mysql_fetch_assoc()/mysql_fetch_array()

28
watchwood

パフォーマンスに関しては、何を使用してもかまいません。違いは、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] ;
}
40
Vertigo

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

mysql_fetch_objectにはいくつかの欠点があり、特にその上にデータベースレイヤーを配置する場合はそうです。

  • 列名が有効でない可能性がありますPHP識別子。例:tax-allowanceまたはuser.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ファン)ですすべてをオブジェクトに変えるというアイデアのようですが、私はそれを感じています連想配列は、データベースからの行のオブジェクトよりも優れたモデルです。私の考えでは、オブジェクトはそれらに作用するメソッドを備えたプロパティのセットですが、行は単なるデータであり、さらに複雑にすることなくそのように扱う必要があります。

30
darkpenguin

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

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

5
blueyed

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

それがもっと重要かどうかわからないので、私はそれについて言及したいと思いました。

4
Steve Paulo

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

2
oscaralexander
while ($Row = mysql_fetch_object($rs)) {
    // ...do stuff...
}

...私がいつもやってきた方法です。配列ではなくデータのコレクションにオブジェクトを使用することをお勧めします。データが少しよく整理されているため、インデックスを追加するよりも、オブジェクトに任意のプロパティを追加するほうがはるかに少ないことを知っています。配列に(最初の数年間はPHPを使用していましたが、オブジェクトに任意のプロパティを割り当てることはできないので、それを行わないようにしました)。

1
dirtside

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

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

0
cubex

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

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

0
Mark