题
一直使用 PHP/MySQL 一点点而现在,我想知道如果有任何具体的优点(性能或其他方式)以利用 mysql_fetch_object()
vs 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
有一些缺点,特别是如果您基于一个数据库层。
列名可能不是有效的PHP标识符,e。克
tax-allowance
或user.id
如果你的数据库驱动器给你的列名指定的查询。然后你必须开始使用{}
所有的地方。如果你想得到一个基于列其名字,stroed在一些变量也已开始使用的可变性
$row->{$column_name}
, 同时array syntax$row[$column_name]
构造也不获得援引的时候,你可能期望,如果你指定的classname。
如果你不类指定名称你会得到一个
stdClass
, ,这几乎是不好过一系列无论如何。
mysql_fetch_assoc
是最简单的三个工作,我喜欢这样的区分,这给代码之间的物体和数据库结果的行...
$object->property=$row['column1'];
$object->property=$row[$column_name];
foreach($row as $column_name=>$column_value){...}
虽然许多面向对象的粉丝(和我是一个面向对象的电风扇)喜欢这个想法转向 的一切 进入一个目的,我觉得这个联合阵列是一个更好的模型的行从一个数据库比对象,因为在我心的一个目的是设定的属性的方法来采取行动,而该行为仅仅是数据和应该作这样的处理没有进一步的并发症。
要记住的事情:数组可以很容易地添加到内存缓存(eaccelerator,XCache,..),而对象则不能(在每次检索时存储和反序列化时需要序列化!)。
当您想要添加内存缓存支持时,您可以切换到使用数组而不是对象 - 但到那时您可能必须更改很多代码,这些代码使用以前使用的对象类型返回值。
使用 mysql_fetch_array()
获取数组,可以通过foreach循环或for循环遍历结果集。 for循环无法遍历 mysql_fetch_object()
。
不确定这是否重要,只是想到我会提到它。
此外,如果您最终想要将Memcaching应用于MySQL结果,则可能需要选择阵列。似乎存储数组类型更安全,而不是对象类型结果。
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()
因为您返回了数字索引列和列名称,所以这会创建一个两倍大的数组。如果您不需要调试代码并查看其内容,那就没问题。但是对于我们其他人来说,调试变得更加困难,因为你必须以奇怪的格式浏览两倍的数据。
我有时遇到使用此功能的项目,然后在调试时,我认为由于我的数据与数据混合在一起,所以出现了严重的错误。
所以在理智的名义下,请不要使用此功能,这会使代码维护更加困难