2024年PHP日本大会

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条注释

me at thomaskeller dot biz
19年前
注意,如果您在没有转储和重新加载数据的情况下(只是保留MyISAM表文件中的二进制数据)从早期版本升级到MySQL 5,则在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;

在每个表上通过命令行客户端执行。
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

/**
* 接受一个查询并返回alias->table映射。
*
* @param string $query
* @return alias映射数组
*/

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;
}
cptnemo
20年前
当尝试为包含“tablename AS alias”的(My)SQL查询查找表名时,mysql_field_table() 只返回AS子句中指定的别名,而不是表名。
spam at blondella dot de
18年前
<?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;
}
?>
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 bug 28898 引起的,该 bug 在 5.0.46 中已修复。当我在运行 MySQL 5.0.51a 的 Debian 5.0.10 服务器上生成的生产 RSS 提要与在运行 MySQL 5.0.32 的 Debian 4.0 测试服务器上生成的相同提要之间注意到差异时,我遇到了这个问题。
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