mysql_fetch_assoc():(键名为字段名,值为该行对应字段的值)。常用于遍历查询结果的每一行数据。
mysql_fetch_field():从结果集取得字段(列)元信息(例如字段名、类型、长度等),用于获取列的结构信息,而不是行数据。
mysql_fetch_assoc() 用于:读取查询返回的数据行,例如显示用户列表、处理每条记录。
mysql_fetch_field() 用于:读取查询结果集的字段定义,例如在动态生成表头、自动生成表单、检查列类型或长度时使用。
<span><span><span class="hljs-comment">// 假设已有 $link = mysql_connect(...); mysql_select_db(...);</span></span><span>
</span><span><span class="hljs-comment">// 查询数据</span></span><span>
</span><span><span class="hljs-variable">$res</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, username, email FROM users"</span></span><span>);
</span><span><span class="hljs-comment">// 使用 mysql_fetch_assoc() 遍历每一行</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_fetch_assoc</span></span><span>(</span><span><span class="hljs-variable">$res</span></span><span>)) {
</span><span><span class="hljs-comment">// $row 是关联数组: ['id' => '1', 'username' => 'alice', 'email' => '[email protected]']</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ID: <span class="hljs-subst">{$row['id']}</span></span></span><span>, 用户名: </span><span><span class="hljs-subst">{$row['username']}</span></span><span>\n";
}
</span><span><span class="hljs-comment">// 获取字段信息(例如第2列的信息)</span></span><span>
</span><span><span class="hljs-title function_ invoke__">mysql_data_seek</span></span><span>(</span><span><span class="hljs-variable">$res</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>); </span><span><span class="hljs-comment">// 可选:定位指针(mysql_fetch_field 不改变行指针,但与使用习惯有关)</span></span><span>
</span><span><span class="hljs-variable">$field</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_fetch_field</span></span><span>(</span><span><span class="hljs-variable">$res</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>); </span><span><span class="hljs-comment">// 参数 1 表示第 2 列(索引从 0 开始)</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$field</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"第2列名: <span class="hljs-subst">{$field->name}</span></span></span><span>, 类型: </span><span><span class="hljs-subst">{$field->type}</span></span><span>, 长度: </span><span><span class="hljs-subst">{$field->max_length}</span></span><span>\n";
}
</span></span>
说明:
mysql_fetch_assoc() 返回一个数组用于访问行数据。
mysql_fetch_field() 返回一个对象(或 false)包含列的元信息(name, orgname, max_length, type 等)。
误以为 mysql_fetch_field() 会返回某一行的字段值 —— 不是,它返回字段的结构/元信息。要取值请用 mysql_fetch_assoc() / mysql_fetch_row() 等。
认为 mysql_fetch_assoc() 能取得字段的类型或长度 —— 不能,它只提供值(和字段名作为键)。
你要遍历查询结果并处理数据:用 mysql_fetch_assoc()(或更现代的 mysqli_fetch_assoc() / PDO 的 fetch(PDO::FETCH_ASSOC))。
你要动态生成表头、验证列类型或读取列名/长度等元信息:用 mysql_fetch_field()(或 mysqli_fetch_field_direct()、$result->fetch_field()、PDO 的 getColumnMeta()(注意兼容性和限制))。
<span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysqli_connect</span></span><span>(</span><span><span class="hljs-string">'host'</span></span><span>,</span><span><span class="hljs-string">'user'</span></span><span>,</span><span><span class="hljs-string">'pass'</span></span><span>,</span><span><span class="hljs-string">'db'</span></span><span>);
</span><span><span class="hljs-variable">$res</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$mysqli</span></span><span>, </span><span><span class="hljs-string">"SELECT id, username, email FROM users"</span></span><span>);
</span><span><span class="hljs-comment">// 取行数据(关联数组)</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysqli_fetch_assoc</span></span><span>(</span><span><span class="hljs-variable">$res</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-comment">// 取字段信息(第 1 列)</span></span><span>
</span><span><span class="hljs-variable">$fieldInfo</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysqli_fetch_field_direct</span></span><span>(</span><span><span class="hljs-variable">$res</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>); </span><span><span class="hljs-comment">// 或 mysqli_fetch_field($res) 在遍历字段时</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$fieldInfo</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$fieldInfo</span></span><span>->name . </span><span><span class="hljs-string">' / '</span></span><span> . </span><span><span class="hljs-variable">$fieldInfo</span></span><span>->type . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>
<span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=host;dbname=db;charset=utf8mb4'</span></span><span>, </span><span><span class="hljs-string">'user'</span></span><span>, </span><span><span class="hljs-string">'pass'</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SELECT id, username, email FROM users"</span></span><span>);
</span><span><span class="hljs-comment">// 取行数据</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'email'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-comment">// 取字段元信息(注意:PDO::getColumnMeta 在某些驱动/版本上不稳定)</span></span><span>
</span><span><span class="hljs-variable">$meta</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getColumnMeta</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>); </span><span><span class="hljs-comment">// 第 2 列</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$meta</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$meta</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>] . </span><span><span class="hljs-string">', native_type='</span></span><span> . (</span><span><span class="hljs-variable">$meta</span></span><span>[</span><span><span class="hljs-string">'native_type'</span></span><span>] ?? </span><span><span class="hljs-string">'unknown'</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>
mysql_fetch_assoc():返回行数据(关联数组)—— 日常读取记录首选。
mysql_fetch_field():返回列元信息(对象)—— 用于读取列名、类型、长度等结构性信息。
实际开发中应使用 mysqli 或 PDO,并用对应的 fetch_assoc() / fetch_field() / getColumnMeta() 等替代函数来完成相同的任务。
尽量使用参数化查询(预处理语句)以防 SQL 注入(mysqli 的 prepare / bind_param,或 PDO 的 prepare / bindValue)。
如果只是需要列名列表,一种简单做法是取第一行的关联数组并用 array_keys() 获取字段名(注意当结果集为空时需额外处理)。