mysql_field_table

(PHP 4, PHP 5)

mysql_field_table获取指定字段所在的表名

警告

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

描述

mysql_field_table(资源 $result, 整数 $field_offset): 字符串

返回指定字段所在的表名。

参数

result

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

field_offset

数字字段偏移量。 field_offset0 开始。如果 field_offset 不存在,还会发出 E_WARNING 级别的错误。

返回值

成功时返回表名。

示例

示例 #1 一个 mysql_field_table() 示例

<?php

$query
= "SELECT account.*, country.* FROM account, country WHERE country.name = 'Portugal' AND account.country_id = country.id";

// 从数据库获取结果
$result = mysql_query($query);

// 列出表名,然后列出字段名
for ($i = 0; $i < mysql_num_fields($result); ++$i) {
$table = mysql_field_table($result, $i);
$field = mysql_field_name($result, $i);

echo
"$table: $field\n";
}

?>

注释

注意:

为了向后兼容,可以使用以下已弃用的别名: mysql_fieldtable()

参见

添加注释

用户贡献的注释 6 个注释

1
me at thomaskeller dot biz
18 年前
请注意,如果您在不转储和重新加载数据的情况下从早期版本升级到 MySQL 5(仅通过保留 MyISAM 表文件中的二进制数据),您可能会在 mysql_fetch_field 和此函数中获得关于“table”值的奇怪输出。奇怪是指表名随机设置或未设置。

此行为似乎仅在 SQL 查询包含 ORDER BY 子句时才会出现。一个错误已经报告

http://bugs.mysql.com/bug.php?id=14915

为避免此问题,请转储和重新加载查询中涉及的所有表,或者执行以下操作

CREATE TABLE tmp SELECT * FROM table;
DROP TABLE table;
ALTER TABLE tmp RENAME table;

在每个表上通过命令行客户端执行。
0
jorge at rhst dot net
17 年前
下面的函数接受一个函数,并返回一个包含 col->table 映射的数组。

例如

$query = “SELECT a.id AS a_id, b.id b_id FROM atable AS a, btable b”

$cols = queryAlias($query);

print_r($cols);

返回

数组
(
[a] => atable
[b] => btable
)

我不能保证它完美无缺,但我最终使用了 mysqli 方法,因此此函数从未进入生产环境。

享受
-Jorge

/**
* 接受一个查询并返回别名->表映射。
*
* @param string $query
* @return 数组,包含别名映射
*/

function queryAlias ( $query ) {

// 将所有内容转换为小写,我们忽略大小写
$substr = strtolower($query);

// 移除任何子查询
$substr = preg_replace ( ‘/\(.*\)/’, ”, $substr);

// 移除任何特殊字符
$substr = preg_replace ( ‘/[^a-zA-Z0-9_,]/’, ‘ ‘, $substr);

// 移除任何空格
$substr = preg_replace(‘/\s\s+/’, ‘ ‘, $substr);

// 获取 FROM 之后的任何内容
$substr = strtolower(substr($substr, strpos(strtolower($substr),‘ from ‘) + 6));

// 移除任何额外的命令
$substr = preg_replace(
Array(
‘/ where .*+$/’,
‘/ group by .*+$/’,
‘/ limit .*+$/’ ,
‘/ having .*+$/’ ,
‘/ order by .*+$/’,
‘/ into .*+$/’
), ”, $substr);

// 移除任何 JOIN 修饰符
$substr = preg_replace(
Array(
‘/ left /’,
‘/ right /’,
‘/ inner /’,
‘/ cross /’,
‘/ outer /’,
‘/ natural /’,
‘/ as /’
), ‘ ‘, $substr);

// 将 JOIN 语句替换为逗号
$substr = preg_replace(Array(‘/ join /’, ‘/ straight_join /’), ‘,’, $substr);


$out_array = Array();

// 按 FROM 语句拆分
$st_array = split (‘,’, $substr);

foreach ($st_array as $col) {

$col = preg_replace(Array(‘/ on .*+/’), ”, $col);

$tmp_array = split(‘ ‘, trim($col));

// 哦不,出了问题,让我们继续
if (!isset($tmp_array[0]))
continue;

$first = $tmp_array[0];

// 如果设置了“AS”,让我们将其包含在内,如果没有,那么猜想此表没有别名。
if (isset($tmp_array[1]))
$second = $tmp_array[1];
else
$second = $first;

if (strlen($first))
$out_array[$second] = $first;

}

return $out_array;
}
0
cptnemo
20 年前
当尝试为包含 'tablename AS alias' 的 (My)SQL 查询查找表名时,mysql_field_table() 仅返回 AS 子句中指定的别名,而不是表名。
-1
spam at blondella dot de
17 年前
<?php
/*
此函数可能有助于解决上述情况 :-)
*/
function mysql_field_table_resolve_alias($inQuery,$inResult,$inFieldName) {
$theNameOrAlias = mysql_field_table($inResult,$inFieldName);
// 检查是否使用 AS 语法
if(ereg(" AS ",$inQuery)) {
// 捕获查询中的词语
$theWords = explode(" ",ereg_replace(",|\n"," ",$inQuery));
// 查找 AS 前后出现的词语
foreach($theWords as $theIndex => $theWord) {
if(
trim($theWord) == "AS"
&& isset($theWords[$theIndex-1])
&& isset(
$theWords[$theIndex+1])
&&
$theWords[$theIndex+1] == $theNameOrAlias
) {
$theNameOrAlias = $theWords[$theIndex-1];
break
1;
}
}
}
return
$theNameOrAlias;
}
?>
-1
djafferian at sos dot ri dot gov
10 年前
此说明可能适用于任何仍然在 Debian 4.0 上运行 MySQL 5.0.32 的人。如果 SELECT 查询使用 GROUP BY 或 ORDER BY 并引用 FROM 子句中的视图,则 mysql_field_table 函数可能会返回一个空表名。这是由 MySQL 错误 28898 引起的,该错误在 5.0.46 中得到修复。当我注意到在 Debian 5.0.10 服务器上运行 MySQL 5.0.51a 生成的生产 RSS 馈送与在 Debian 4.0 上运行 MySQL 5.0.32 的测试服务器上生成的相同馈送之间存在差异时,我遇到了这个问题。
-3
mehdi dot haresi at gmail dot com
15 年前
对于所有在查询中使用表别名访问重复字段名称时遇到问题的人,我已经实现了以下快速解决方案

<?php
function mysql_fetch_alias_array($result)
{
if (!(
$row = mysql_fetch_array($result)))
{
return
null;
}

$assoc = Array();
$rowCount = mysql_num_fields($result);

for (
$idx = 0; $idx < $rowCount; $idx++)
{
$table = mysql_field_table($result, $idx);
$field = mysql_field_name($result, $idx);
$assoc["$table.$field"] = $row[$idx];
}

return
$assoc;
}
?>

假设我们有两个表 student 和 contact,每个表都有 fID 作为索引字段,并且想要在 php 中访问这两个 fID 字段。

此函数的使用方式与调用 mysql_fetch_array 非常相似

<?php
$result
= mysql_query("select * from student s inner join contact c on c.fID = s.frContactID");

while (
$row = mysql_fetch_alias_array($result))
{
echo
"StudenID: {$row['s.fID']}, ContactID: {$row['c.fID']}";
}
?>

就是这样!

请注意,使用此函数时,必须使用其别名(例如 s.Name、s.Birhtday)访问所有字段,即使它们不重复。

如果您有任何问题,请给我发邮件。

此致
Mehdi Haresi
die-webdesigner.at
To Top