odbc_field_name

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_field_name获取列名

描述

odbc_field_name(资源 $statement, 整数 $field): 字符串|false

获取给定结果标识符中占用给定列号的字段的名称。

参数

statement

结果标识符。

field

字段编号。字段编号从 1 开始。

返回值

返回字段名称作为字符串,或在发生错误时返回 false

添加笔记

用户贡献笔记 11 笔记

3
hayes029 at bama dot ua dot edu
20 年前
在寻找一个简单地返回结果标识符中字段名称的数组的函数时,我唯一能找到的是 odbc_field_name 函数。因此,对于任何其他人正在寻找此类函数的人,这是我编写的(非常简单)的函数

function odbc_field_names ($result) {
for ($i=1; $i <= odbc_num_fields($result); $i++) $return_array[$i-1] = odbc_field_name($result, $i);
return $return_array;
}

我知道,非常简单,但我认为它可能会有所帮助。
0
anuga at anuga dot se
15 年前
我一直围绕着这个玩了一段时间,使其尽可能简单和快速。

<?php

/* 开始连接 */
if(!$odbc['connection'] = odbc_connect('DNS','USER','PASS'))
{
exit(
"连接失败<br />\n");
}
else
{
echo(
"已连接<br />\n");
}

/* 选择哪个表 */
$odbc['table'] = "table";

/* 将字段名获取到数组中 */
if($result = odbc_exec($odbc['connection'],"select * from $odbc['table';"))
{
for(
$i = 1;$i <= odbc_num_fields($result);$i++)
{
$odbc['rows']['fields'][$i] = odbc_field_name($result,$i);
}
unset(
$i);
odbc_free_result($result);
}
else
{
exit(
"SQL 查询错误");
}

/* 关闭连接 */
if(odbc_close($odbc['connection']))
{
odbc_close($odbc['connection']);
}

/* 打印数组 */
if(!empty($odbc['rows']))
{
print_r($odbc['rows']);
}

?>
0
sica at wnet dot com dot br
15 年前
嗨,hayes029,你的想法非常有帮助。
这是一个针对选择表单字段的改编版本。
<?php
$consulta
= "select * from schema.table";
$resposta = odbc_exec($con, $consulta);
for(
$i=1; $i <= odbc_num_fields($resposta); $i++)
echo
"<option value=".odbc_field_name($resposta, $i).">".odbc_field_name($resposta, $i)."</option>";
?>
0
marco
16 年前
我们遇到了使用 cakephp dbo_odbc.php 类(版本 1.1.18.5850)时 31 个字符的限制

最后,它调用 odbc_fetch_row 导致了问题(我跟踪到可能是由于 php 对 ODBCv2 模型的实现,该模型对文件名长度进行了硬编码,为 4 字节、32 位,而 ODBCv3 似乎对此值有单独的规范,仅供参考)

我们从另一个用户(遇到了 dbo_mssql.php 类类似的问题)那里了解到如何解决此问题,

我们使用继承解决了这个问题,重新定义了该方法(在我们的应用程序中本地),以
- 在执行查询之前创建查询字段的“映射”(作为数组)
- 以非关联方式执行查询
- 返回结果后,应用之前创建的“映射”恢复真实字段名称

另一种方法是使用 COM,例如
new COM("ADODB.Connection")
它没有显示 31 个字符的问题,但它可能更慢并且绑定到 Windows 平台。
0
NoEgzit
16 年前
如果你真的需要超过 31 个字符,你可以这样做

在像 notepad++ 这样的编辑器中打开 php5.x.x/ext/odbc/php_odbc_includes.h


typedef struct odbc_result_value {
char name[32];
char *value;
SDWORD vallen;
SDWORD coltype;
} odbc_result_value;

中将 32 更改为更大的值,然后重新编译 php。

我使用 char name[64] 进行了操作,因为我拥有像 “0214_1_VD_Type d'exploitation Type d'opération (Niveau 1)” 这样的列名 [我没有选择这个愚蠢的名字,它来自 Eccairs 项目]
并使用此处给出的方法重新构建 php https://php.net/manual/en/install.windows.building.phphttp://elizabethmariesmith.com/2006/11/09/
compiling-php52-on-windows-with-net-toolchain-is-it-even-possible/

使用 Visual C++ Express Edition。
0
jezzghost
18 年前
请注意,这有一个已知限制,它会将返回的字段名称长度截断为 31 个字符,而不会发出警告。
0
andrea dot galli at acotel dot com
21 年前
示例:函数字段名称。

$Link_ID = odbc_connect("DSN", "user", "pass");

$query = "SELECT * FROM products";

$Query_ID = odbc_exec($Link_ID, $query);

while($field = $field_name($Query_ID ))
{
echo("字段:$field<br />\n");
}

---------------------

function field_name($PrQuery_ID)
{
if($Column < odbc_num_fields($PrQuery_ID))
{
$Column += 1;
$FieldName = odbc_field_name($PrQuery_ID, $Column);

return $FieldName;
}
else
{
return 0;
}
}
0
aleckzandr at yahoo dot com
21 年前
我已经学习了 PHP 四个小时,多亏了“我的前辈”(gold163、curt 等),我取得了以下进展。在学习任何 Web 脚本语言时,我首先尝试学习从数据源构建动态表格。(gold,你之前没有必要做的一件事是为字段值构建数组。)干杯!Alex

<html>
<head>
<title>PHP 数据库示例</title>
</head>
<style type="text/css">
<!--
body {font: 10pt/12pt Tahoma, Verdana, Helvetica, sans-serif; color: indigo; margin: .25in .5in }
table {color:Navy; background-color:AntiqueWhite; border-color:Maroon; border-style:Solid; border-width: 2px; }
th {color: blue; font-weight: bold; }
td {font-size: smaller; }
.mytable {color:Maroon; background-color:White; border-color:Navy; border-style:Solid; border-width: 1px; }
th.mytable {background-color:#C0C0C0; }
//-->
</style>
<body>

<p><?php echo date("j F, Y"); ?></p>
<?php

$db
= odbc_connect("eSell22MDB","","");
$result = odbc_exec($db, "select ProductID, ProductName, Description1 from Products");

// 酷炫的功能 - 返回表格
odbc_result_all($result, "border=\"1\" class=\"def\"");

$result = odbc_exec($db, "select * from Products") or die("Select failed");

$myUtil = new Utilities();

$myUtil->standard_table($result,"mytable");

class
Utilities {

function
standard_table($result,$class="")
{
// 如果你想使用层叠样式表来格式化你的表格
if ($class == "")
{
$css_table = " border=\"1\"";
$css_tr = "";
$css_th = "";
$css_td = "";
}
else
{
$css_table = " class=\"$class\"";
$css_tr = " class=\"$class\"";
$css_th = " class=\"$class\"";
$css_td = " class=\"$class\"";
}

// 为表格标题行创建字段名称
$i = 0;
$fieldCount = odbc_num_fields($result);
echo
" <table$css_table>\n";
echo
" <tr$css_tr>\n";

while (
$i < $fieldCount)
{
$i++;
$fieldName = odbc_field_name($result, $i);
echo
" <th$css_th>$fieldName</th>\n";
}
echo
" </tr>\n";

# 为查询结果创建表格数据行
while (odbc_fetch_row($result))
{
$i = 0;
echo
" <tr$css_tr>\n";
while (
$i < $fieldCount)
{
$i++;
$fieldData = trim(odbc_result($result, $i));
if (
$fieldData == "")
echo
" <td$css_td>&nbsp;</td>\n";
else
echo
" <td$css_td>$fieldData</td>\n";
}
echo
" </tr>\n";
}
echo
" </table>";
}
}
// 类 Utilities

?>

</body>
</html>
0
gold163 at lisco dot com
21 年前
使用你的代码,并更进一步,我可以通过调用我的包含文件中的函数来从一行代码创建一个标准表格 - 奖励是,我可以选择为我的样式表类提供一个参数 - 进一步简化了我对表格的格式化。

你在这些论坛中发现了什么协同作用 - 是吧?

$Conn = odbc_connect('dsn','user','pass');
$query = "SELECT * FROM yourtable";
$result = odbc_exec($Conn, $query) or die('Select failed!');

standard_table($result);

Function standard_table($result,$class='')
{
# 如果你想使用层叠样式表来格式化你的表格
if ($class == '')
{
$css_table = ' border=1';
$css_tr = '';
$css_th = '';
$css_td = '';
}
else
{
$css_table = ' class=\"$class\"';
$css_tr = ' class=\"$class\"';
$css_th = ' class=\"$class\"';
$css_td = ' class=\"$class\"';
}

# 为表格标题行创建字段名称
$i = 0;
$fCount = odbc_num_fields($result);
echo "<table$css_table><tr>";
while ($i < $fCount)
{
$i++;
$fName = odbc_field_name($result, $i);
echo "<th>$fName</th>";
}
echo "</tr>";

# 为查询结果创建表格数据行
$i = 0;
$fCount = odbc_num_fields($result);
while (odbc_fetch_row($result))
{
echo "<tr>";
while ($i < $fCount)
{
$i++;
$fName = odbc_field_name($result, $i);
$job[$fName] = odbc_result($result, $i);
echo "<td>$job[$fName]</td>";
}
echo "</tr>";
$i = 0;
}
echo "</table>";
}
0
Anonymous
23 年前
哇,我终于有东西可以贡献了。
如果你,像我一样,一直在寻找一种方法来用适当的名称和值来命名和填充你的变量,而不是命名每个变量并使用 odbc_result($result, 1)、odbc_result($result, 2) 等...那么这个小循环就是为你准备的!把它用作函数可能更好,但我相信你能自己做到,对吧?

<?php
$query
= "SELECT * FROM TableName";
$result = odbc_exec($conn, $query) or die('Select failed!');
$i = 0;
$fCount = odbc_num_fields($result);

while (
odbc_fetch_row($result)) {
while (
$i < $fCount) {
$i++;
$fName = odbc_field_name($result, $i);
$job[$fName] = odbc_result($result, $i);
}
$i=0;
}
?>

这段代码应该很容易理解,你可以在以后的任何时间使用表格中的列名来访问你的变量。现在我用它们的真实值来访问它们,并简单地用它来避免在我的代码开头写出所有变量名。玩得开心。

Jason/ArtHacker.com
-1
curt at digmo dot com
23 年前
我将 Jason 的代码变成了一个函数,以大致模拟 mysql_fetch_array 函数。我不是程序员,而且我使用 PHP 还不到一周,所以我想我的方法一定有更有效率的。


function odbc_fetch_array($rownum, $res)
{

$i = 0;
$fCount = odbc_num_fields($res);
odbc_fetch_row($res, $rownum);
while ($i < $fCount)
{
$i++;
$fName = odbc_field_name($res, $i);
$myrow[$fName] = odbc_result($res, $i);
}
$i=0;
return $myrow;
}
To Top