2024年PHP开发者大会日本站

odbc_exec

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

odbc_exec直接执行SQL语句

描述

odbc_exec(Odbc\Connection $odbc, string $query): Odbc\Result|false

将SQL语句发送到数据库服务器。

参数

odbc

ODBC连接对象,详情请参见 odbc_connect()

query

SQL语句。

返回值

如果SQL命令成功执行,则返回一个ODBC结果对象;否则在出错时返回 false

变更日志

版本 描述
8.4.0 odbc 现在期望一个 Odbc\Connection 实例;以前,期望的是一个 resource
8.4.0 此函数现在返回一个 Odbc\Result 实例;以前,返回的是一个 resource
8.0.0 flags 已移除。

参见

添加笔记

用户贡献笔记 19条笔记

james @ php-for-beginners co uk
19年前
大家好,我成功地运行了这段小程序,如果您需要将长表单插入数据库,它非常有用。

if ( ! empty ( $_POST ) ){
array_pop($_POST);
foreach($_POST as $key => $val){
$columns .= addslashes($key) . ", ";
$values .= "'" . addslashes($val) . "', ";

}
$values = substr_replace($values, "", -2);
$columns = substr_replace($columns, "", -2);

$sql = "INSERT INTO table ($columns) VALUES ($values)";
echo $sql;
$results = odbc_exec($conn, $sql);
if ($results){
echo "Query Executed";
}else {
echo "Query failed " .odbc_error();
}
}

虽然安全性不是最高的,但这加快了从大型表单中收集数据的速度。
rupix at rediffmail dot com
21年前
我尝试了以下代码行

<?php
$odbc
=odbc_connect("pbk", "root","") or die(odbc_errormsg());
$q="insert into pbk values(\"$name\", \"$phone\")";
print
$q;
odbc_exec($odbc, $q) or die("<p>".odbc_errormsg());
?>

它不起作用。但是,如果我使用单引号而不是双引号,则代码可以顺利运行。

因此,以下代码可以运行:

<?php
$odbc
=odbc_connect("pbk", "yourworstnightmare","abracadabra") or die(odbc_errormsg());
$q="insert into pbk values('$name', '$phone')";
print
$q;
odbc_exec($odbc, $q) or die("<p>".odbc_errormsg());
?>

此外,在Win2k上使用用户DSN不好。始终使用系统DSN。我还不知道这样做会产生什么影响。
gross at arkana dot de
25年前
如果您在运行NT/IIS和PHP 3.0.11,并希望使用带有“存储过程”的MS Access数据库,您可以发送类似以下的ODBC SQL查询:
<?php
$conn_id
= odbc_connect( "odbc_test_db", "", "", SQL_CUR_USE_DRIVER );
$qry_id = odbc_do( $conn_id, "{CALL MyQuery}" );
?>
这样,您就不需要在php文件中集成诸如

SELECT * FROM TblObject WHERE (((TblObject.something) Like "blahblahblah"));

之类的查询字符串。您可以直接调用由MS Access生成的查询“MyQuery”。
rmkim at uwaterloo dot ca
25年前
对于Win32(NT)和MSAccess 2000,每当您检索日期列/字段时,php都会自动将其转换为'yyyy/mm/dd hh:mm:ss'格式,而不管您在Access中指定的日期样式如何。
当您执行SELECT、UPDATE或DELETE查询时,这似乎会带来问题,但奇怪的是INSERT可以正常工作。我已经尝试将日期解析为所需的格式,但php仍然提示标准不匹配。
mir eder
17年前
如果您在ODBC查询中遇到文本字段被截断的问题(例如,在4096个字符处),请尝试以下方法:

在php.ini中
- odbc.defaultlrl = 65536

在您的php代码中,在您的查询之前
- ini_set ( 'odbc.defaultlrl' , '65536' );
das_yrch at hotmail dot com
21年前
我尝试了这种方法来查看查询的结果,它有效!!

$Conn = odbc_connect
("bbdd_usuaris","","",SQL_CUR_USE_ODBC );

$result=odbc_exec($Conn,"select nom from usuaris;");

while(odbc_fetch_row($result)){
for($i=1;$i<=odbc_num_fields($result);$i++){
echo "Result is ".odbc_result($result,$i);
}
}
test
7年前
如果eval()是答案,那么你几乎肯定问错了问题。
匿名
19年前
以下内容对我来说似乎违反直觉,所以我经常因此而被困扰。我只是想为其他可能也会被困扰的人添加一个注释。

if (!odbc_exec("select MyValue from MyTable where Key1='x' and Key2='y'"))

并不是搜索是否存在Key1 = x且Key2 = y记录的好方法。odbc_exec始终返回结果句柄,即使没有任何记录。

相反,你必须使用其中一个 fetch 函数来确定记录确实不存在。这应该有效

如果 (!($Selhand = odbc_exec("select MyValue from MyTable where Key1='x' and Key2='y'"))
|| !odbc_result($Selhand, 1))
Sean Boulter
20年前
如果你的WHERE语句中指定的字段内存在单引号,ODBC会由于解析错误而失败。虽然看起来很直观,但在字段周围使用双引号不起作用("\$var")。我找到的唯一解决方案是用两个单引号替换字段中的所有单引号。ODBC将第一个单引号解释为转义字符,并将第二个单引号解释为字面量。感谢http://www.devguru.com/features/knowledge_base/A100206.html 提供此提示。
miguel dot erill at doymer dot com
22年前
在之前的贡献中提到,如果你运行的是带有PHP 3.0.11的NT/IIS,你可以使用MS Access dbs的“存储过程”。

这是正确的,但如果这些存储过程有参数,你必须像这样在命令行中提供它们

$conn_id = odbc_connect( "odbc_test_db", "","", SQL_CUR_USE_DRIVER );
$qry_id = odbc_do( $conn_id, "{CALL MyQuery(".$param.")}" );
lee200082 at hotmail dot com
22年前
作为对前面关于方括号的说明的补充

用'['和']'括起SQL字段名,还可以使用MS Access的保留字,例如'date'、'field'和'time'作为你的SQL查询中的字段名……方括号似乎只是告诉Access忽略其内部任何其他含义,并将它们简单地作为字段名。
sk2xml at gmx dot net
23年前
问题:SQL语句中的字段名包含空格,并且[]不起作用!

解决方案:尝试使用""代替

例如:

SELECT table2.first, table1.[last name] FROM tabel1, table2 -> 不起作用

SELECT table2.first, table1."last name" FROM tabel1, table2 -> 请尝试这个

PS:不要忘记转义字符!!!
akchu at at ualberta dot ca
23年前
ODBC/MS Access日期字段

在MS Access的SELECT语句中匹配日期需要以下格式
#Y-m-d H:i:s#

例如

SELECT * FROM TableName WHERE Birthdate = #2001-01-07 00:00:00#

或者

SELECT * FROM TableName WHERE Birthdate BETWEEN #2000-01-07 00:00:00# AND #2001-01-07 00:00:00#

我花了很长时间才弄明白这一点。
vpil at retico dot com
24年前
ODBC_exec 的附加链接
如何实际编写SQL命令
http://www.roth.net/perl/odbc/faq/
http://www.netaxs.com/~joc/perl/article/SQL.html
SQL详解
大型参考手册
http://w3.one.net/~jhoffman/sqltut.htm
结构化查询语言入门
涵盖数据的读取、添加、修改和删除。
rob at vendorpromotions dot com
21年前
这在db2中默认情况下打开“for update”的select语句。如果你使用的是db2,则必须在末尾添加“for read only”才能从SYSCAT.TABLES中选择数据,否则会引发错误,例如

警告:SQL错误:[IBM][CLI驱动程序][DB2/LINUX] SQL0151N 无法更新列“MAXFREESPACESEARCH”。SQLSTATE=42808,SQL状态42808在SQLExecDirect中

例如

$query = odbc_exec($conn, "select * from syscat.tables for read only");
odbc_result_all($query);

将起作用(仅适用于db2)。我不知道其他数据库。

由于这种副作用,select语句可以在“db2”命令行中工作,但在php中却不能工作。
delowing gmail dot com
18年前
很容易将恶意代码注入SQL语句中。这将参数用引号括起来,因此它们不可执行。在您自己的存储过程中,您可以根据需要将字符串转换为数字。

function sql_make_string($sin){
return "'".str_replace("'","''",$sin)."'";
}

// 这可能会删除MYTABLE中的所有数据
$evil = "734'; DELETE FROM MYTABLE; print 'ha ha";
$sql = "SELECT * FROM MYTABLE WHERE mykey = '$evil'";
$rst = odbc_exec($connection,$sql);

// 这可能不会删除数据。
$good = sql_make_string($evil);
$sql = "SELECT * FROM MYTABLE WHERE mykey =".$good
$rst = odbc_exec($connection,$sql);
petercdow at gmail dot com
11年前
包含引号(即")而不是撇号(即')来分隔字符串的SQL语句在Access中运行良好,但在odbc_exec中,它会失败,并显示

[Microsoft][ODBC Microsoft Access Driver] 参数太少。预期6个。

例如

$q = "INSERT INTO TableA (Fld1, Fld2, Fld3) VALUES('A', 'B', 'C');";

在Access和ODBC中都能正常工作,但是

$q = 'INSERT INTO TableA (Fld1, Fld2, Fld3) VALUES("A", "B", "C");';

会因上述错误而失败。
fuadMD at gmail dot com
19年前
<?php
// - 这是一个完整的可工作的动态示例,它使用:
// odbc_connect、odbc_exec、获取列名、
// odbc_fetch_row和行数。希望对您有所帮助
// - 您的驱动程序应指向您的MS Access文件

$conn = odbc_connect('MSAccessDriver','','');

$nrows=0;

if (
$conn)
{
$sql = "select * from $month";
//此函数将执行sql语句
$result=odbc_exec($conn, $sql);

echo
"<table align=\"center\" border=\"1\" borderColor=\"\" cellpadding=\"0\" cellspacing=\"0\">\n";
echo
"<tr> ";
// -- 打印字段名
$colName = odbc_num_fields($result);
for (
$j=1; $j<= $colName; $j++)
{
echo
"<th align=\"left\" bgcolor=\"#CCCCCC\" > <font color=\"#990000\"> ";
echo
odbc_field_name ($result, $j );
echo
"</font> </th>";
}
$j=$j-1;
$c=0;
// 字段名结束
while(odbc_fetch_row($result)) // 获取数据
{
$c=$c+1;
if (
$c%2 == 0 )
echo
"<tr bgcolor=\"#d0d0d0\" >\n";
else
echo
"<tr bgcolor=\"#eeeeee\">\n";
for(
$i=1;$i<=odbc_num_fields($result);$i++)
{
echo
"<td>";
echo
odbc_result($result,$i);
echo
"</td>";
if (
$i%$j == 0 )
{
$nrows+=1; // 计数行数
}
}
echo
"</tr>";
}

echo
"</td> </tr>\n";
echo
"</table >\n";
// -- 表结束
if ($nrows==0) echo "<br/><center> $month 暂无数据!请稍后再试</center> <br/>";
else echo
"<br/><center> 总记录数:$nrows </center> <br/>";
odbc_close ($conn);

}
else echo
"odbc未连接 <br>";
?>
phobo at at at paradise dot net dot nz
24年前
如果Openlink -> MS Access数据库失败并给出“驱动程序功能不足”错误或“无可用元组”警告,则在使用odbc_connect()时使用SQL_CUR_USE_ODBC游标……

签名
To Top