PHP Conference Japan 2024

mysql_fetch_assoc

(PHP 4 >= 4.0.3, PHP 5)

mysql_fetch_assoc将结果行作为关联数组获取

警告

此扩展在 PHP 5.5.0 中已弃用,并在 PHP 7.0.0 中移除。应改用 MySQLiPDO_MySQL 扩展。另请参阅 MySQL:选择 API 指南。此函数的替代方法包括

描述

mysql_fetch_assoc(资源 $result): 数组

返回一个与获取的行对应的关联数组,并将内部数据指针向前移动。mysql_fetch_assoc() 等效于调用 mysql_fetch_array(),并将 MYSQL_ASSOC 用于可选的第二个参数。它只返回一个关联数组。

参数

result

正在评估的结果 资源。此结果来自对 mysql_query() 的调用。

返回值

返回一个与获取的行对应的字符串关联数组,如果不再有行则返回 false

如果结果中的两个或多个列具有相同的字段名,则最后一个列将优先。要访问相同名称的其他列,您需要使用 mysql_fetch_row() 使用数字索引访问结果,或添加别名。有关别名的示例,请参阅 mysql_fetch_array() 说明中的示例。

示例

示例 #1 扩展的 mysql_fetch_assoc() 示例

<?php

$conn
= mysql_connect("localhost", "mysql_user", "mysql_password");

if (!
$conn) {
echo
"无法连接到数据库: " . mysql_error();
exit;
}

if (!
mysql_select_db("mydbname")) {
echo
"无法选择 mydbname: " . mysql_error();
exit;
}

$sql = "SELECT id as userid, fullname, userstatus
FROM sometable
WHERE userstatus = 1"
;

$result = mysql_query($sql);

if (!
$result) {
echo
"无法成功运行来自数据库的查询($sql): " . mysql_error();
exit;
}

if (
mysql_num_rows($result) == 0) {
echo
"未找到行,没有要打印的内容,因此正在退出";
exit;
}

// 当存在一行数据时,将该行作为关联数组放入 $row 中
// 注意:如果您只期望一行,则无需使用循环
// 注意:如果您在以下循环中放入 extract($row);,则
// 然后创建 $userid、$fullname 和 $userstatus
while ($row = mysql_fetch_assoc($result)) {
echo
$row["userid"];
echo
$row["fullname"];
echo
$row["userstatus"];
}

mysql_free_result($result);

?>

注释

注意性能

需要注意的重要一点是,使用 mysql_fetch_assoc() 的速度并不比使用 mysql_fetch_row() 慢多少,同时它提供了显著的附加价值。

注意此函数返回的字段名称区分大小写

注意此函数将 NULL 字段设置为 PHP null 值。

参见

添加注释

用户贡献的注释 6 条注释

5
marREtijn dot posthMOuma at hoVEme dot nl
21 年前
看来您无法在结果数组中使用 table.field 名称。
如果您的结果为空,并且您正在使用多表查询,只需使用别名即可

$res=mysql_query("SELECT user.ID AS uID, order.ID AS oID FROM user, order WHERE ( order.userid=uID )";
while ($row=mysql_fetch_assoc($res)) {
echo "<p>userid: $row['uID'], orderid: $row['oID']</p>";
}
5
joe at kybert dot com
20 年前
值得指出的是,一旦为当前行收集了数据,内部行指针就会递增。

这意味着多个调用将遍历行数据,因此您无需在调用之间使用 mysql_data_seek(..) 。

这在 mysql_fetch_row() 文档中有所说明,但此处没有!?
0
Typer85 at gmail dot com
18 年前
请注意,传递给此函数的资源结果可以认为是通过引用传递的,因为资源只是指向内存位置的指针。

因此,在将指针重置回起始位置之前,您不能在同一脚本中两次循环遍历资源结果。

例如

----------------
<?php

// 假设我们已经查询了数据库。

// 循环遍历结果集。

while( $queryContent = mysql_fetch_row( $queryResult ) {

// 显示。

echo $queryContent[ 0 ];
}

// 我们已经循环遍历了资源结果,所以指针不再指向任何行。

// 如果我们决定再次循环遍历相同的资源结果
// ,函数将始终返回 false,因为它
// 将假设没有更多行。

// 因此,如果在前面的代码段之后执行以下代码
// 段,则将不起作用。

while( $queryContent = mysql_fetch_row( $queryResult ) {

// 显示。

echo $queryContent[ 0 ];
}

// 因为 $queryContent 现在等于 FALSE,所以不会进入循环。

?>
----------------

解决此问题的唯一方法是重置指针,使其再次指向第一行,然后第二个代码段,因此完整的代码如下所示

----------------
<?php

// 假设我们已经查询了数据库。

// 循环遍历结果集。

while( $queryContent = mysql_fetch_row( $queryResult ) {

// 显示。

echo $queryContent[ 0 ];
}

// 重置我们的指针。

mysql_data_seek( $queryResult );

// 再次循环。

while( $queryContent = mysql_fetch_row( $queryResult ) {

// 显示。

echo $queryContent[ 0 ];
}

?>
----------------

当然,您必须进行额外的检查以确保结果中的行数不为 0,否则 mysql_data_seek 本身将返回 false 并引发错误。

另请注意,这适用于所有获取结果集的函数,包括 mysql_fetch_row、mysql_fetch_assos 和 mysql_fetch_array。
-3
george at georgefisher dot com
15 年前
感谢 R. Bradley 提供的 implode 想法。以下修复了一些错误,并包含了 quote_smart 功能(并且已经过测试)

<?php
function mysql_insert_assoc ($my_table, $my_array) {

//
// 将值插入 MySQL 数据库
// 包含 quote_smart 代码以挫败 SQL 注入
//
// 对此函数的调用如下所示:
//
// $val1 = "foobar";
// $val2 = 495;
// mysql_insert_assoc("tablename", array(col1=>$val1, col2=>$val2, col3=>"val3", col4=>720, col5=>834.987));
//
// 发送以下查询:
// INSERT INTO 'tablename' (col1, col2, col3, col4, col5) values ('foobar', 495, 'val3', 720, 834.987)
//

global $db_link;

// 从数组 $my_array 中查找所有键(列名)
$columns = array_keys($my_array);

// 从数组 $my_array 中查找所有值
$values = array_values($my_array);

// 对值使用 quote_smart
$values_number = count($values);
for (
$i = 0; $i < $values_number; $i++)
{
$value = $values[$i];
if (
get_magic_quotes_gpc()) { $value = stripslashes($value); }
if (!
is_numeric($value)) { $value = "'" . mysql_real_escape_string($value, $db_link) . "'"; }
$values[$i] = $value;
}

// 组成查询
$sql = "INSERT INTO $my_table ";

// 创建用括号括起来的列名的逗号分隔字符串
$sql .= "(" . implode(", ", $columns) . ")";
$sql .= " values ";

// 创建用括号括起来的值的逗号分隔字符串
$sql .= "(" . implode(", ", $values) . ")";

$result = @mysql_query ($sql) OR die ("<br />\n<span style=\"color:red\">Query: $sql UNsuccessful :</span> " . mysql_error() . "\n<br />");

return (
$result) ? true : false;
}
?>
-4
R. Bradley
18 年前
针对 Sergiu 的函数 - implode() 会使事情变得容易得多……如下所示

<?php
function mysql_insert_assoc ($my_table, $my_array) {

// 从数组 $my_array 中查找所有键(列名)
$columns = array_keys($my_array);

// 从数组中查找所有值
$values = array_values($my_array);

// 我们组成查询
$sql = "insert into `$my_table` ";
// 将列名合并,在每个列名之间插入 "\", \""(但在最后一个列名之后不插入)
// 我们同时添加了封闭引号
$sql .= "(\"" . implode("\", \"", $column_names) . "\")";
$sql .= " values ";
// 值也一样
$sql .= "(" . implode(", ", $values) . ")";

$result = mysql_query($sql);

if (
$result)
{
echo
"The row was added sucessfully";
return
true;
}
else
{
echo (
"The row was not added<br>The error was" . mysql_error());
return
false;
}
}
?>

因此,对此函数的调用如下所示
mysql_insert_assoc("tablename", array("col1"=>"val1", "col2"=>"val2"));

向 mysql 发送以下 sql 查询
INSERT INTO `tablename` ("col1", "col2") VALUES ("val1", "val2")
-5
benlanc at ster dot me dot uk
19 年前
可能不言而喻,但将 list() 与 mysql_fetch_assoc() 结合使用不起作用 - 请改用 mysql_fetch_row()。

<?php
$sql
= "SELECT `id`,`field`,`value` FROM `table`";
$result = mysql_query($sql);

// 这会导致 rowID、fieldName、myValue 的值为空
list($rowID,$fieldName,$myValue) = mysql_fetch_assoc($result);

// 这是您想要的:
list($rowID,$fieldName,$myValue) = mysql_fetch_row($result);
?>
To Top