ODBC 具有最大缓冲区大小,这意味着它每次仅存储和检索数据库中的有限大小的数据。最大缓冲区大小为 4096,并设置在 php.ini (odbc.defaultlrl) 中。您可以将其设置为更高的值以访问更大的数据。
(PHP 4, PHP 5, PHP 7, PHP 8)
odbc_execute — 执行预处理语句
statement
来自 odbc_prepare() 的ODBC结果对象。
params
params
中的参数将按顺序替换预处理语句中的占位符。此数组的元素将通过调用此函数转换为字符串。
params
中任何以单引号开头和结尾的参数都将被视为要读取的文件名,并将作为相应占位符的数据发送到数据库服务器。
版本 | 描述 |
---|---|
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)。
ODBC 具有最大缓冲区大小,这意味着它每次仅存储和检索数据库中的有限大小的数据。最大缓冲区大小为 4096,并设置在 php.ini (odbc.defaultlrl) 中。您可以将其设置为更高的值以访问更大的数据。
我有一个解决字符串因单引号而被解释为文件名的问题的方案
只需在字符串末尾添加一个空格
<?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;
}
?>
重要问题
Solid 将 CHAR、VARCHAR、LONG VARCHAR、BINARY、VARBINARY 和 LONG VARBINARY 的最大长度定义为 2G。但是,当创建用于 PHP 的表时,如果计划存储非常大或很长的数据,例如长度超过 64k 的数据(如 GIF/JPG 或非常大的文本区域),则应为这些类型的字段选择 LONG VARCHAR 或 LONG VARBINARY。
当 odbc_execute() 失败时,它返回 FALSE 并触发警告,但它不一定能为 odbc_error() 和 odbc_errormsg() 提供信息。
回复 cpoirier 于 2001 年 3 月 4 日 03:30 的注释
目前,Access 2000 通过 ODBC 支持参数化查询。它似乎仍然在 Memo 和 OLE 字段上存在问题,但“普通”类型可以正常工作。
我认为 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");
当对 MS Access 数据库使用 odbc_execute 时,请对文字字符串定义使用单引号(而不是双引号)。
例如:$sql = "Insert into [table] ([first], [last]) select 'Bob', 'Builder';"
如果使用双引号,你可能会遇到类似这样的错误:[Microsoft] [ODBC Text Driver] 参数太少。预期:2
如果你想通过ODBC使用MSSQL的存储过程,请阅读
http://www.sitepoint.com/article/php-microsoft-sql-server/2
它可以节省你大量时间;)
在Windows下运行4.0.6的CGI版本时,当我尝试使用odbc_execute和参数数组调用SQL Server中的存储过程时,遇到了这个错误。
致命错误:emalloc(): 无法分配268675669字节
可怕的错误,对吧?在我的情况下,它只是意味着SQL Server找不到存储过程。完全是我的错,但错误消息相当模糊。
p。
我已经使用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 ) );
?>
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));
//以及你想对结果执行的操作
//但你只会得到“预期参数”或“计数不匹配”
}
这些函数缺乏文档应该是一个警报信号。
回复tcmleung at yahoo dot com (2001年11月9日),我想补充一点我发现的情况,即odbc.defaultlrl/odbc_longreadlen()值可能仅适用于odbc->php转换,而不适用于php->odbc(尽管这可能是数据库特定的)。因此,如果你想发布二进制数据,则4096字节的限制仍然存在。因此,与使用上面描述的带引号的文件名上传过程相比,使用包含在php变量中的数据的prepare...execute方法,你更有可能能够发布二进制数据。
不要错过它说明的那一部分:如果你的字符串以单引号开头和结尾,则该字符串将被解释为文件名!
这意味着你不能
$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将其插入数据库。
要将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);
?>
如果你在你的环境中无法使用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>";
// 添加其他逻辑
}
?>
一旦我弄清楚了这一点,我的应用程序就完美地工作了。