【发布时间】:2010-09-12 13:27:12
【问题描述】:
使用 PHP/MySQL 有一段时间了,我想知道使用 mysql_fetch_object() 与 mysql_fetch_assoc() / mysql_fetch_array() 是否有任何特定优势(性能或其他方面) .
【问题讨论】:
使用 PHP/MySQL 有一段时间了,我想知道使用 mysql_fetch_object() 与 mysql_fetch_assoc() / mysql_fetch_array() 是否有任何特定优势(性能或其他方面) .
【问题讨论】:
就性能而言,您使用什么并不重要。不同的是mysql_fetch_object返回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 有一些缺点,尤其是当您基于它建立一个 db 层时。
列名可能不是有效的 PHP 标识符,例如 tax-allowance 或 user.id 如果您的数据库驱动程序为您提供查询中指定的列名。然后你必须开始到处使用{}。
如果你想得到一个基于它的名字的列,stroed in some variable你还必须开始使用变量属性$row->{$column_name},而数组语法$row[$column_name]
如果您指定类名,则不会调用构造函数。
如果你不指定类名,你会得到一个stdClass,这几乎不比数组好。
mysql_fetch_assoc 是三者中最容易使用的,我喜欢它在对象和数据库结果行之间的代码中给出的区别......
$object->property=$row['column1'];
$object->property=$row[$column_name];
foreach($row as $column_name=>$column_value){...}
虽然许多 OOP 粉丝(我也是 OOP 粉丝)喜欢将一切变成一个对象的想法,但我觉得关联数组是数据库中行的更好模型,而不是对象,在我看来,对象是一组属性以及对其进行操作的方法,而行只是数据,应该这样处理,而不需要进一步复杂化。
【讨论】:
mysql_ 东西并切换到 PDO)
需要记住的一点:数组可以很容易地添加到内存缓存(eaccelerator、XCache、..),而对象则不能(它们需要在存储时序列化并在每次检索时反序列化!)。
当您想要添加内存缓存支持时,您可以切换到使用数组而不是对象 - 但到那时您可能已经需要更改很多代码,这些代码使用以前使用的对象类型返回值。
【讨论】:
使用mysql_fetch_array() 获取数组可让您通过foreach 循环或for 循环遍历结果集。 mysql_fetch_object() 不能被 for 循环遍历。
不确定这是否重要,只是想我会提一下。
【讨论】:
此外,如果您最终希望将 Memcaching 应用于您的 MySQL 结果,您可能需要选择数组。似乎存储数组类型比存储对象类型结果更安全。
【讨论】:
while ($Row = mysql_fetch_object($rs)) {
// ...do stuff...
}
...我一直都是这样做的。我更喜欢使用对象而不是数组来收集数据,因为它可以更好地组织数据,而且我知道我尝试向对象添加任意属性的可能性要小于尝试添加索引的可能性到一个数组(在我使用 PHP 的前几年,我认为你不能只为一个对象分配任意属性,所以不这样做是根深蒂固的)。
【讨论】:
在速度方面,mysql_fetch_object() 与 mysql_fetch_array() 相同,并且几乎与 mysql_fetch_row() 一样快。
此外,使用mysql_fetch_object(),您将只能通过相应的字段名称访问字段数据。
【讨论】:
我认为所有这些功能之间的差异是微不足道的,尤其是与代码可读性相比时。
如果您担心这种优化,请使用mysql_fetch_row()。它是最快的,因为它不使用关联数组(例如 $row[2]),但是用它来破坏你的代码是最容易的。
【讨论】:
我投票反对mysql_fetch_array()
因为您会返回数字索引的列和列名,所以这会创建一个两倍大的数组。如果您不需要调试代码并查看其内容,那很好。但是对于我们其他人来说,调试变得更加困难,因为您必须以奇怪的格式处理两倍的数据。
我有时会遇到一个使用此功能的项目,然后当我调试时,我认为出现了严重错误,因为我的数据中混入了数字列。
所以以理智的名义,请不要使用此功能,它使代码维护更加困难
【讨论】: