现在使用 PHP / MySQL 一段时间了,我想知道使用mysql_fetch_object()
vs mysql_fetch_assoc()
是否有任何特定优势(性能或其他方面) / mysql_fetch_array()
。
答案 0 :(得分:40)
在性能方面,使用什么并不重要。区别在于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] ;
}
答案 1 :(得分:30)
mysql_fetch_array
使您的代码难以阅读=维护噩梦。您无法一目了然地看到您的对象正在处理哪些数据。它稍微快一点,但如果这对你来说很重要,那么你处理的数据非常多,以至于PHP可能不是正确的方法。
mysql_fetch_object
有一些缺点,特别是如果您在其上建立数据库层。
如果您的数据库驱动程序为您提供了查询中指定的列名,则列名可能不是有效的PHP标识符,例如tax-allowance
或user.id
。然后你必须开始在所有地方使用{}
。
如果你想根据它的名字得到一个列,在一些变量中,你还必须开始使用变量属性$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粉丝)喜欢将所有转换为对象的想法,但我觉得关联数组是数据库中行的更好模型而不是对象,在我看来,一个对象是一组具有处理它们的方法的属性,而行只是数据,应该被视为没有进一步的复杂化。
答案 2 :(得分:5)
要记住的事情:数组可以很容易地添加到内存缓存(eaccelerator,XCache,..),而对象则不能(在每次检索时存储和反序列化时需要序列化!)。
当您想要添加内存缓存支持时,您可以切换到使用数组而不是对象 - 但到那时您可能必须更改很多代码,这些代码使用以前使用的对象类型返回值。
答案 3 :(得分:4)
使用mysql_fetch_array()
获取数组可以通过foreach循环或for循环遍历结果集。 <循环无法遍历mysql_fetch_object()
。
不确定这是否重要,只是想到我会提到它。
答案 4 :(得分:2)
此外,如果您最终想要将Memcaching应用于MySQL结果,则可能需要选择阵列。似乎存储数组类型更安全,而不是对象类型结果。
答案 5 :(得分:1)
while ($Row = mysql_fetch_object($rs)) {
// ...do stuff...
}
......我一直都是这样做的。我更喜欢使用对象来收集数据而不是数组,因为它更好地组织数据,我知道我尝试向对象添加任意属性的可能性要小于尝试添加索引的可能性。到一个数组(最初几年我使用PHP,我认为你不能只为对象分配任意属性,所以它根本就没有这样做。)
答案 6 :(得分:0)
我认为所有这些功能之间的区别是微不足道的,特别是与代码可读性相比时。
如果您担心此类优化,请使用mysql_fetch_row()
。它是最快的,因为它不使用关联数组(例如$ row [2]),但最简单的方法是用它来破解你的代码。
答案 7 :(得分:0)
速度方面,mysql_fetch_object()
与mysql_fetch_array()
相同,几乎与mysql_fetch_row()
一样快。
此外,使用mysql_fetch_object()
,您只能通过相应的字段名称访问字段数据。
答案 8 :(得分:-2)
我投票反对mysql_fetch_array()
因为您返回了数字索引列和列名称,所以这会创建一个两倍大的数组。如果您不需要调试代码并查看其内容,那就没问题。但是对于我们其他人来说,调试变得更加困难,因为你必须以奇怪的格式浏览两倍的数据。
我有时会遇到一个使用此功能的项目,然后在调试时,我认为由于我的数据与数据混合在一起,所以出现了严重错误。
所以在理智的名义下,请不要使用此功能,这会使代码维护更加困难