mysql_fetch_array、mysql_fetch_assoc、mysql_fetch_object

Posted

技术标签:

【中文标题】mysql_fetch_array、mysql_fetch_assoc、mysql_fetch_object【英文标题】:mysql_fetch_array, mysql_fetch_assoc, mysql_fetch_object 【发布时间】:2010-12-04 22:35:54 【问题描述】:

功能都非常相似:

mysql_fetch_array(), mysql_fetch_assoc(), mysql_fetch_object()

我最近开始使用 mysql_fetch_object,因为我正在使用 php 做更多的 OOP。

但是人们对于哪个最好用,为什么,以及它们最适合在哪种情况下使用的看法是什么。

感谢您的意见!

【问题讨论】:

据此,assoc 是最快的。 spearheadsoftwares.com/tutorials/php-performance-benchmarking/… 这是个有趣的数据,但如果你只是快速看一下图表,似乎只有 >= 100000 的数据集存在差异。但这只是一个糟糕的规模选择。如果您详细查看这些值,则 fetch_assoc 在所有尺寸上都比 fetch_object 快两倍以上。 【参考方案1】:

mysql_fetch_array 将为您提供一个可以作为键的数组:

列的编号和名称,如果使用MYSQL_BOTH 列名,使用MYSQL_ASSOC——在这种情况下,你会得到与使用mysql_fetch_assoc相同的东西 只有数字(取决于查询中列的顺序),如果使用MYSQL_NUM

获取按列名索引的结果可能是最有用的解决方案——至少更易于使用。

但是在一种情况下获取由 select 子句中的字段位置索引的结果很有趣:当您有多个具有相同名称或别名的列时。 在这种情况下,由于数组中不能有两个具有相同索引的条目,因此您只能使用列名作为索引来访问其中一个列。 对于具有相同名称的其他列,您必须使用数字索引。

这种情况可能是我会使用mysql_fetch_array 的唯一情况——而且我更喜欢在查询中使用别名以避免这种情况——我认为这更清楚。

mysql_fetch_assoc 将为您提供一个数组,其中列名作为键,数据作为值。

其实没什么好说的。

mysql_fetch_object 会得到你的对象作为回报。

mysql_fetch_assocmysql_fetch_object 之间进行选择很可能取决于您开发应用程序的方式:如果在任何地方都使用对象,那么第二个可能最适合。

如果使用数组作为数据容器,你可以直接使用第一个。

【讨论】:

【参考方案2】:

mysql_fetch_array() 将结果行作为关联数组、数值数组或两者兼而有之。 它返回对应于获取的行的字符串数组,如果没有更多行,则返回 FALSE。返回数组的类型取决于 $result_type 的定义方式。

通过使用 MYSQL_NUM,您只能获得数字索引(如 $row[0]、$row1 等),即数字数组。

通过使用 MYSQL_ASSOC,您只能获得关联索引(如 $row["id"]、$row["name"] 等),即关联数组。

通过使用 MYSQL_BOTH(默认),您将获得一个包含关联索引和数字索引的数组。 (如 $row[0]、$row["name"] 等),即数值数组和关联数组。

mysql_fetch_assoc() 获取结果行作为关联数组。 (列名作为键)。

mysql_fetch_object() 将结果行作为对象提取。

它返回一个对象,该对象的属性对应于获取的行,并将内部数据指针向前移动。

对我来说,使用有好处 mysql_fetch_assoc() 可以使用数组函数,例如 array_walk 和 uasort()。

【讨论】:

【参考方案3】:

假设我们有下表

姓名 国家代码 ----- ---------- 孟加拉国 BD 美国普韦布洛 美国阿瓦达

$query = "SELECT Name, CountryCode FROM City";

$result = mysqli_query($connection, $query)

    mysqli_fetch_object(数据可以作为对象获取)

     while ($obj = mysqli_fetch_object($result)) 
        printf ("%s (%s)\n", $obj->Name, $obj->CountryCode);
     
    

    mysqli_fetch_assoc(获取关联数组,即键)

    while ($row = mysqli_fetch_assoc($result)) printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);

    mysqli_fetch_array(数字和关联两者)

    while ($row = mysqli_fetch_array($result, MYSQLI_NUM)) printf("%s (%s)\n", $row[0], $row[1]);

    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);

【讨论】:

【参考方案4】:

简短说明:

mysql_fetch_assoc():这将为您提供一个关联的数据数组。

mysql_fetch_array() :这将返回关联元素的组合数组以及具有数字索引的数据。

mysql_fetch_object():返回一个对象,其属性对应于获取的行。

Source

【讨论】:

以上是关于mysql_fetch_array、mysql_fetch_assoc、mysql_fetch_object的主要内容,如果未能解决你的问题,请参考以下文章

mysql_fetch_array() 期望参数 1 是资源问题 [重复]

从mysql转换为mysqli(mysql_fetch_array)[重复]

php while循环和foreach循环 mysql_fetch_array()

什么改变了循环中的条件:while (mysql_fetch_array($var))?

登录脚本中的“警告:mysql_fetch_array() 期望参数 1 是资源,布尔值”

需要有关 mysql_fetch_array() 错误的帮助?