一段时间以来一直在使用PHP/MySQLmysql_fetch_object()
,我想知道使用vs mysql_fetch_assoc()
/是否有任何特定的优势(性能或其他方面) mysql_fetch_array()
。
9 回答
性能方面,您使用什么并不重要。不同之处在于 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
是三者中最容易使用的,我喜欢这在对象和数据库结果行之间的代码中给出的区别......
$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 循环遍历。
不确定这是否重要,只是想我会提到它。
此外,如果您最终希望将 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()
因为您返回了数字索引的列和列名,所以这会创建一个两倍大的数组。如果您不需要调试代码并查看其内容,那很好。但是对于我们其他人来说,调试变得更加困难,因为您必须以一种奇怪的格式处理两倍的数据。
我有时会遇到一个使用此功能的项目,然后当我调试时,我认为出现了严重错误,因为我的数据中混合了数字列。
所以以理智的名义,请不要使用此功能,它会使代码维护更加困难