odbc_execute

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

odbc_execute执行准备好的语句

描述

odbc_execute(资源 $statement, 数组 $params = []): 布尔值

执行使用 odbc_prepare() 准备的语句。

参数

statement

来自 odbc_prepare() 的结果 ID 资源

params

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

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

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

返回值

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

示例

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

在以下代码中,$success 只有在 myproc 的所有三个参数都是 IN 参数时才会为 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
22 年前
odbc 有一个最大缓冲区大小,这意味着它每次只存储和检索有限大小的数据到/从数据库。最大缓冲区大小为 4096,并在 php.ini (odbc.defaultlrl) 中设置。你可以将其设置为更高的值以用于更大的数据访问。
a dot brock at hhv-rheinklang dot de
17 年前
我有一个解决方案可以解决字符串由于单引号而被解释为文件名的问题

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

<?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
25 年前
稳固问题
Solid 将 CHAR、VARCHAR、LONG VARCHAR、BINARY、VARBINARY 和 LONG VARBINARY 定义为最大长度为 2G。但是,在为与 PHP 一起使用创建表时,如果计划存储非常大或很长的数据,应该为这些类型的字段选择 LONG VARCHAR 或 LONG VARBINARY。例如:超过 64k 长度的数据,例如 GIF/JPG 或非常大的文本区域。
alvaro at demogracia dot com
12 年前
当 odbc_execute() 失败时,它会返回 FALSE 并触发警告,但它不会一定填充 odbc_error() 和 odbc_errormsg()。
svemir_AT_baltok.com
21 年前
回复 cpoirier 在 2001 年 3 月 4 日 03:30 的笔记

目前,Access 2000 通过 ODBC 支持参数化查询。它似乎仍然在 Memo 和 OLE 字段方面存在问题,但“普通”类型可以正常工作。
sjericson at mindspring dot com
22 年前
我认为 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 年前
在将 odbc_execute 用于 MS Access 数据库时,请使用单引号(而不是双引号)来定义文字字符串。

例如 $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
23 年前
当与参数一起使用并且语句失败时,您不能再使用不同的参数,将使用与失败语句相同的参数。
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
16 年前
Obdc_prepare 和 obdc_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 (09-Nov-2001),我想补充说明我发现的一个警告,即 odbc.defaultlrl/odbc_longreadlen() 值可能仅适用于 odbc->php 转换,而不是 php->odbc(尽管这可能是特定于数据库的)。因此,如果您想发布二进制数据,则 4096 字节限制仍然存在。所以,您更有可能使用上面描述的带引号的文件名上传过程来发布二进制数据,而不是使用准备...执行方法来处理保存在 php 变量中的数据。
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 的内容将作为“名称”插入您的数据库。

此外,尽管文档建议,但似乎(难以置信地)没有任何方法可以转义您的单引号(通过实验和阅读源代码):如果您的字符串以单引号开头和结尾,您不能使用 odbc_execute 将其插入数据库。
Marco Napetti
11 年前
要使用准备好的 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);

?>
anonymous
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