Mysql の結果は PHP になります - 配列ですか、それともオブジェクトですか?
質問
使用している PHP/MySQL 今しばらくの間、これを使用することで何か具体的な利点 (パフォーマンスなど) があるかどうか疑問に思っています。 mysql_fetch_object()
対 mysql_fetch_assoc()
/ mysql_fetch_array()
.
解決
パフォーマンスに関しては、何を使用しても問題ありません。違いは、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] ;
}
他のヒント
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 ファンです) は、 すべて オブジェクトに変換する場合、連想配列はオブジェクトよりもデータベースの行のモデルとして優れていると感じます。私の考えでは、オブジェクトはプロパティのセットであり、それらに作用するメソッドが含まれていますが、行は単なるデータであり、さらなる複雑化を起こすことなく、そのように扱われます。
注意すべき点:配列はメモリ キャッシュ (eaccelerator、XCache など) に簡単に追加できますが、オブジェクトは追加できません (格納時にシリアル化し、取得のたびにシリアル化を解除する必要があります)。
メモリ キャッシュ サポートを追加する場合は、オブジェクトの代わりに配列の使用に切り替えることができますが、その時点までに、以前に使用されていたオブジェクト タイプの戻り値を使用する多くのコードを既に変更する必要がある可能性があります。
配列を取得する mysql_fetch_array()
foreach ループまたは for ループを介して結果セットをループ処理できます。 mysql_fetch_object()
for ループでは通過できません。
それがそれほど重要かどうかはわかりませんが、言及しておこうと思いました。
さらに、最終的に MySQL の結果に Memcaching を適用したい場合は、配列を選択することをお勧めします。オブジェクト型の結果ではなく、配列型を保存する方が安全なようです。
while ($Row = mysql_fetch_object($rs)) {
// ...do stuff...
}
……私はいつもそうしてきた。私は、データのコレクションには配列ではなくオブジェクトを使用することを好みます。そのほうがデータが少し整理しやすいからです。また、オブジェクトに任意のプロパティを追加しようとする可能性が、インデックスを追加しようとする可能性よりはるかに低いことを知っています。 (私が PHP を使った最初の数年間は、オブジェクトに任意のプロパティを割り当てることはできないと思っていました。そのため、そうしないことが染み付いています)。
特にコードの可読性と比較した場合、これらすべての関数の違いは重要ではないと思います。
この種の最適化が気になる場合は、次を使用してください。 mysql_fetch_row()
. 。連想配列を使用しないため、最も高速です (例:$row[2]) ですが、これを使用してコードを中断するのが最も簡単です。
速度的には、 mysql_fetch_object()
と同一です mysql_fetch_array()
, 、そしてほぼ同じくらい速く mysql_fetch_row()
.
また、 mysql_fetch_object()
フィールド データには、対応するフィールド名によってのみアクセスできます。
私は反対票を投じます mysql_fetch_array()
数値インデックス付きの列と列名の両方が返されるため、2 倍の大きさの配列が作成されます。コードをデバッグしてその内容を表示する必要がない場合は、問題ありません。しかし、それ以外の人々にとっては、奇妙な形式で 2 倍の量のデータを処理しなければならないため、デバッグが難しくなります。
データに数値列が混在しているため、デバッグ時にこの関数を使用するプロジェクトに遭遇し、何かがひどく間違っているのではないかと思うことがあります。
したがって、健全性の名において、この関数は使用しないでください。コードのメンテナンスがより困難になります。