PHP Conference Japan 2024

odbc_field_name

(PHP 4、PHP 5、PHP 7、PHP 8)

odbc_field_name获取列名

描述

odbc_field_name(Odbc\Result $statement, int $field): string|false

获取给定结果对象中占据给定列号的字段的名称。

参数

statement

ODBC 结果对象。

field

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

返回值

返回字段名称作为字符串,如果出错则返回 false

变更日志

版本 描述
8.4.0 statement 现在需要一个 Odbc\Result 实例;之前,需要一个 resource
添加注释

用户贡献的笔记 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
16 年前
嗨,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
17 年前
如果你真的需要超过 31 个字符,你可以这样做

在编辑器(如 notepad++)中打开 php5.x.x/ext/odbc/php_odbc_includes.h

在以下位置将 32 更改为更大的值
typedef struct odbc_result_value {
char name[32];
char *value;
SDWORD vallen;
SDWORD coltype;
} odbc_result_value;

并重新编译 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: $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 -上一篇文章- 不需要做的一件事是为字段值构建数组。)干杯!亚历克斯

<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>";
}
}
// class 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
匿名用户
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