【问题标题】:Mysql results in PHP - arrays or objects?Mysql导致PHP - 数组或对象?
【发布时间】:2010-09-12 13:27:12
【问题描述】:

使用 PHP/MySQL 有一段时间了,我想知道使用 mysql_fetch_object()mysql_fetch_assoc() / mysql_fetch_array() 是否有任何特定优势(性能或其他方面) .

【问题讨论】:

    标签: php mysql arrays object


    【解决方案1】:

    就性能而言,您使用什么并不重要。不同的是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] ;
    }
    

    【讨论】:

    • 基本上,这取决于您的喜好。
    • 差别不大,_row 返回 0,1.. 和 _array 返回 'userid','fullname','0','1'。
    • 在 mysql_fetch_array 的第二个参数中,您可以指定天气您想要的关联结果、数字结果或两者(结果表示数组索引值):)
    • 基于这篇文章 spearheadsoftwares.com/tutorials/php-performance-benchmarking/… 在 LARGE 查询中您应该使用 _assoc() 或 _array()
    【解决方案2】:

    mysql_fetch_array 使您的代码难以阅读 = 维护噩梦。您无法一目了然地看到您的对象正在处理哪些数据。它稍微快一点,但如果这对您很重要,那么您正在处理大量数据,PHP 可能不是正确的方法。

    mysql_fetch_object 有一些缺点,尤其是当您基于它建立一个 db 层时。

    • 列名可能不是有效的 PHP 标识符,例如 tax-allowanceuser.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 粉丝)喜欢将一切变成一个对象的想法,但我觉得关联数组是数据库中行的更好模型,而不是对象,在我看来,对象是一组属性以及对其进行操作的方法,而行只是数据,应该这样处理,而不需要进一步复杂化。

    【讨论】:

    • +1 以获得关于该主题的最佳答案。我曾经使用 assoc,然后我切换到对象(试图使所有东西都成为对象),但由于您所说的原因,我又切换回了 assoc;它看起来更像是一个数组而不是一个对象。
    • @J.Money 但是当您真正切换到由对象表示的数据库结果时呢?例如在活动记录模式中,我更喜欢前端已经在使用对象接口。 $user = User::find(1),然后在前端,如果它已经实现为 $user->email,则无需进行任何更改。它为您提供了更大的灵活性,允许从前端对结果调用方法。尽管让对象实现 ArrayAccess 接口以使 $user['email'] 对对象执行与 $user->email 完全相同的操作仍然非常简单。..
    • @Anther Magic 方法使使用数组保存行数据来实现活动记录变得简单。你是对的,尽管随着 PHP 更多地向 OOP 移动,mysql_fetch_* 的实现发生在幕后,因此无论使用一个还是另一个都是微不足道的。事实上,我开始考虑这个的唯一原因是因为我正在重写某人的程序代码,使其更加面向对象,并且它不使用数据库抽象层。他们使用所有 mysql_fetch_* 函数,没有任何明显的模式。
    • @bažmegakapa 这个答案对我来说很有意义,我实际上一直在考虑从 mysql_fetch_object 切换回 mysql_fetch_assoc。我发现当您开始加入其他表中的字段时,mysql_fetch_object 会变得非常混乱。一个问题,如果可以的话。我的对象类中通常很少有实用程序函数。例如, full_name() 将返回 $this->first_name 。 ' ' 。 $this->last_name。切换到数组时,我无法快速访问这些方法。你是如何解决这个问题的?
    • @Jonathan 我没有写这个答案,只是编辑了它。这是darkpenguin的回答,好像是被删除的用户。 (我想说忘记旧的mysql_ 东西并切换到 PDO)
    【解决方案3】:

    需要记住的一点:数组可以很容易地添加到内存缓存(eaccelerator、XCache、..),而对象则不能(它们需要在存储时序列化并在每次检索时反序列化!)。

    当您想要添加内存缓存支持时,您可以切换到使用数组而不是对象 - 但到那时您可能已经需要更改很多代码,这些代码使用以前使用的对象类型返回值。

    【讨论】:

      【解决方案4】:

      使用mysql_fetch_array() 获取数组可让您通过foreach 循环或for 循环遍历结果集。 mysql_fetch_object() 不能被 for 循环遍历。

      不确定这是否重要,只是想我会提一下。

      【讨论】:

      • 对象属性可以通过php5+中的foreach进行迭代
      • while ($row = mysql_fetch_object($result)) 有效。它的用法与 m​​ysql_fetch_array() 完全相同,只是你使用 $row->field 而不是 $row['field'] 访问。
      • 欧文,我就是这么说的。
      • 我个人更喜欢关联数组和 foreach,但我会尝试使用对象方法,看看是否可以让它工作。
      • 可怜的史蒂夫刚刚被那些没有正确阅读他所写内容的人搞砸了。当这种情况发生时我讨厌它,但我能理解他们为什么以他们的方式阅读它。你的陈述相当模棱两可。
      【解决方案5】:

      此外,如果您最终希望将 Memcaching 应用于您的 MySQL 结果,您可能需要选择数组。似乎存储数组类型比存储对象类型结果更安全。

      【讨论】:

        【解决方案6】:
        while ($Row = mysql_fetch_object($rs)) {
            // ...do stuff...
        }
        

        ...我一直都是这样做的。我更喜欢使用对象而不是数组来收集数据,因为它可以更好地组织数据,而且我知道我尝试向对象添加任意属性的可能性要小于尝试添加索引的可能性到一个数组(在我使用 PHP 的前几年,我认为你不能只为一个对象分配任意属性,所以不这样做是根深蒂固的)。

        【讨论】:

          【解决方案7】:

          在速度方面,mysql_fetch_object()mysql_fetch_array() 相同,并且几乎与 mysql_fetch_row() 一样快。

          此外,使用mysql_fetch_object(),您将只能通过相应的字段名称访问字段数据。

          【讨论】:

            【解决方案8】:

            我认为所有这些功能之间的差异是微不足道的,尤其是与代码可读性相比时。

            如果您担心这种优化,请使用mysql_fetch_row()。它是最快的,因为它不使用关联数组(例如 $row[2]),但是用它来破坏你的代码是最容易的。

            【讨论】:

              【解决方案9】:

              我投票反对mysql_fetch_array()

              因为您会返回数字索引的列和列名,所以这会创建一个两倍大的数组。如果您不需要调试代码并查看其内容,那很好。但是对于我们其他人来说,调试变得更加困难,因为您必须以奇怪的格式处理两倍的数据。

              我有时会遇到一个使用此功能的项目,然后当我调试时,我认为出现了严重错误,因为我的数据中混入了数字列。

              所以以理智的名义,请不要使用此功能,它使代码维护更加困难

              【讨论】:

              • mysql_fetch_array() 返回一个包含数字和关联索引的数组;适合全家人一起玩。
              • 啊,你的权利!我在想另一个功能。我修改了答案
              猜你喜欢
              • 2014-04-28
              • 2020-03-04
              • 2012-05-08
              • 1970-01-01
              • 1970-01-01
              • 2011-10-15
              • 2018-01-01
              • 2014-07-16
              • 1970-01-01
              相关资源
              最近更新 更多