2024年PHP开发者大会日本站

odbc_execute

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

odbc_execute执行预处理语句

描述

odbc_execute(Odbc\Result $statement, array $params = []): bool

执行使用 odbc_prepare() 预处理的语句。

参数

statement

来自 odbc_prepare() 的ODBC结果对象。

params

params 中的参数将按顺序替换预处理语句中的占位符。此数组的元素将通过调用此函数转换为字符串。

params 中任何以单引号开头和结尾的参数都将被视为要读取的文件名,并将作为相应占位符的数据发送到数据库服务器。

如果您想存储实际以单引号开头和结尾的字符串,则必须在参数的开头或结尾添加空格或其他非单引号字符,这将阻止参数被视为文件名。如果这不是一种选择,那么您必须使用其他机制来存储字符串,例如使用 odbc_exec() 直接执行查询。

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
8.4.0 此函数现在返回一个 Odbc\Result 实例;以前,返回的是 resource
8.0.0 已删除未使用的 flags 参数。

示例

示例 #1 odbc_execute()odbc_prepare() 示例

在以下代码中,只有当 myproc 的所有三个参数都是输入参数时,$success 才为 true

<?php
$a
= 1;
$b = 2;
$c = 3;
$stmt = odbc_prepare($conn, 'CALL myproc(?,?,?)');
$success = odbc_execute($stmt, array($a, $b, $c));
?>

如果您需要使用 INOUT 或 OUT 参数调用存储过程,建议的解决方法是使用数据库的本机扩展(例如,对于 Oracle 使用 oci8)。

参见

添加注释

用户贡献的注释 17 条注释

tcmleung at yahoo dot com
23年前
ODBC 具有最大缓冲区大小,这意味着它每次仅存储和检索数据库中的有限大小的数据。最大缓冲区大小为 4096,并设置在 php.ini (odbc.defaultlrl) 中。您可以将其设置为更高的值以访问更大的数据。
a dot brock at hhv-rheinklang dot de
18年前
我有一个解决字符串因单引号而被解释为文件名的问题的方案

只需在字符串末尾添加一个空格

<?php
function odbc_escape_params ($params) {
if (!
is_array($params) or empty($params)) {
return array();
}
foreach (
$params as $key=>$val) {
if (
strlen($val) > 1 and $val{0} == "'" and $val{strlen($val)-1} == "'") {
$params[$key] .= ' ';
}
}
return
$params;
}
?>
wntrmute at tampabay dot rr dot com
26年前
重要问题
Solid 将 CHAR、VARCHAR、LONG VARCHAR、BINARY、VARBINARY 和 LONG VARBINARY 的最大长度定义为 2G。但是,当创建用于 PHP 的表时,如果计划存储非常大或很长的数据,例如长度超过 64k 的数据(如 GIF/JPG 或非常大的文本区域),则应为这些类型的字段选择 LONG VARCHAR 或 LONG VARBINARY。
alvaro at demogracia dot com
12年前
当 odbc_execute() 失败时,它返回 FALSE 并触发警告,但它不一定能为 odbc_error() 和 odbc_errormsg() 提供信息。
svemir_AT_baltok.com
22年前
回复 cpoirier 于 2001 年 3 月 4 日 03:30 的注释

目前,Access 2000 通过 ODBC 支持参数化查询。它似乎仍然在 Memo 和 OLE 字段上存在问题,但“普通”类型可以正常工作。
sjericson at mindspring dot com
23年前
我认为 odbc_prepare 和 odbc_execute 不支持 MSSQL 存储过程的输出参数。MSSQL 输出参数的示例位于 http://support.microsoft.com/support/kb/articles/q174/2/23.asp

此外,我的 MSSQL 驱动程序似乎只有在我使用以下咒语时才满意

...代码已移除...
$stmt=odbc_prepare($conn_id, "exec my_proc_name ?,?,?");
$parms=array("fred","password",5);
if (!odbc_execute($stmt, &$parms)) die("odbc_execute failed");
dj at magma dot nz
5年前
当对 MS Access 数据库使用 odbc_execute 时,请对文字字符串定义使用单引号(而不是双引号)。

例如:$sql = "Insert into [table] ([first], [last]) select 'Bob', 'Builder';"

如果使用双引号,你可能会遇到类似这样的错误:[Microsoft] [ODBC Text Driver] 参数太少。预期:2
jeroen at pyromanic dot nl
16年前
如果你想通过ODBC使用MSSQL的存储过程,请阅读

http://www.sitepoint.com/article/php-microsoft-sql-server/2

它可以节省你大量时间;)
reaganpr at hotmail dot com
23年前
在Windows下运行4.0.6的CGI版本时,当我尝试使用odbc_execute和参数数组调用SQL Server中的存储过程时,遇到了这个错误。

致命错误:emalloc(): 无法分配268675669字节

可怕的错误,对吧?在我的情况下,它只是意味着SQL Server找不到存储过程。完全是我的错,但错误消息相当模糊。

p。
cpoirier at shelluser dot net
23年前
一个小提示,希望我的痛苦能帮助到其他人:Microsoft Access ODBC驱动程序不支持参数化查询。
edrenth at thematec dot nl
24年前
当使用参数且语句失败时,你无法再使用不同的参数,将使用与失败语句相同的参数。
vince at dinapoliwest dot com
8年前
我已经使用odbc函数有一段时间了,当我最终阅读关于参数在以单引号开头和结尾时如何处理的详细信息时,我感到震惊!我假设odbc_execute与odbc_exec的主要区别在于防止SQL注入,但显然这个附加功能实际上打开了另一个安全漏洞,也许更糟。这是我的解决方案

<?php

function odbc_execute_clean_parameters($result_id, $parameters_array){
for(
$i = 0; $i < count($parameters_array); ++$i){
if(
substr($parameters_array[$i], -1) == "'" && substr($parameters_array[$i], 0 ,1) == "'" ){
$parameters_array[$i].= " ";
}
}
return
odbc_execute($result_id, $parameters_array);
}

// 然后调用
$stmt = odbc_prepare($conn, " insert into mytable (col1, col2) values (?, ?) ");
$r = odbc_execute_clean_parameters($stmt, array( $val1, $val2 ) );

?>
traynor at uni hyphen hannover dot de
17年前
odbc_prepare和odbc_execute只能在有限的情况下作为odbc_exec的替代方案使用。

$con = obdc_connect ($dsn, $user, $pass);
$sql = "select * from TABLE";

$result = obdc_exec ($con, $sql); //此行可以用下面代码替换
//然后查看结果

odbc_result_all ($result);
odbc_free_result ($result);
odbc_close ($con);

中间行与以下代码结果相同

$result = odbc_prepare ($con, $sql);
odbc_execute ($result);

只要$sql包含一个格式正确且完整的查询。

尝试将其转换为使用问号作为占位符的参数化查询是没有意义的,因为这样的代码只会导致错误消息。

$sql = "select * from TABLE where needle = ?";
$result = odbc_prepare ($con, $sql);
for ($i = 0; $i < 4; $i++)
{
odbc_execute ($result, array ($i));
//以及你想对结果执行的操作
//但你只会得到“预期参数”或“计数不匹配”
}

这些函数缺乏文档应该是一个警报信号。
russell dot brown at removethis dot insignia dot com
20年前
回复tcmleung at yahoo dot com (2001年11月9日),我想补充一点我发现的情况,即odbc.defaultlrl/odbc_longreadlen()值可能仅适用于odbc->php转换,而不适用于php->odbc(尽管这可能是数据库特定的)。因此,如果你想发布二进制数据,则4096字节的限制仍然存在。因此,与使用上面描述的带引号的文件名上传过程相比,使用包含在php变量中的数据的prepare...execute方法,你更有可能能够发布二进制数据。
mjs at beebo dot org
18年前
不要错过它说明的那一部分:如果你的字符串以单引号开头和结尾,则该字符串将被解释为文件名!

这意味着你不能

$sth = odbc_prepare($dbh, "INSERT INTO people(name) VALUES(?)");
$res = odbc_execute($sth, array($name));

而不检查$name的值——如果$name是,比如说,'\\'c:\\passwords.txt\\'',则c:\\passwords.txt的内容将作为“name”插入到你的数据库中。

此外,尽管文档中建议的内容,但似乎(令人难以置信地)没有任何方法可以转义你的单引号(通过实验和阅读源代码):如果你的字符串以单引号开头和结尾,则无法使用odbc_execute将其插入数据库。
Marco Napetti
12年前
要将prepared用于select查询,正确的方法是
<?PHP

$rConnection
= odbc_connect('AS400', 'QSECOFR', 'QSECOFR');
if(
$rConnection === false) {
throw new
ErrorException(odbc_errormsg());
}

$rResult = odbc_prepare($rConnection, 'SELECT * FROM KMNSH00F WHERE SHTMST > ?');
if(
$rResult === false) {
throw new
ErrorException(odbc_errormsg());
}

if(
odbc_execute($rResult, array('0001-01-01 00:00:00.000000')) === false) {
throw new
ErrorException(odbc_errormsg());
}

odbc_result_all($rResult);

odbc_free_result($rResult);

odbc_close($rConnection);

?>
匿名
15年前
如果你在你的环境中无法使用php_mssql模块(suse linux,apache2,php5,FreeTDS,unixODBC),一个替代方法是使用SQL Server函数而不是存储过程。这是我的示例代码。

<?php
$connect
= odbc_connect($myDB, $myUser, $myPass);

$query = "SELECT dbo.<function>(<column>,<text>) alias";

// 执行查询
$result = odbc_exec($connect, $query);

while(
odbc_fetch_row($result)) {
$Var1 = odbc_result($result, <column alias>);
//echo "Var1: " . $Var1 . "<br>";

// 添加其他逻辑

}
?>

一旦我弄清楚了这一点,我的应用程序就完美地工作了。
To Top