odbc 有一个最大缓冲区大小,这意味着它每次只存储和检索有限大小的数据到/从数据库。最大缓冲区大小为 4096,并在 php.ini (odbc.defaultlrl) 中设置。你可以将其设置为更高的值以用于更大的数据访问。
(PHP 4, PHP 5, PHP 7, PHP 8)
odbc_execute — 执行准备好的语句
statement
来自 odbc_prepare() 的结果 ID 资源。
params
params
中的参数将按顺序替换准备好的语句中的占位符。此数组的元素将通过调用此函数转换为字符串。
任何以单引号开头和结尾的 params
中的参数将被视为要读取的文件名,并将作为相应占位符的数据发送到数据库服务器。
示例 #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)。
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 一起使用创建表时,如果计划存储非常大或很长的数据,应该为这些类型的字段选择 LONG VARCHAR 或 LONG VARBINARY。例如:超过 64k 长度的数据,例如 GIF/JPG 或非常大的文本区域。
当 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");
在将 odbc_execute 用于 MS Access 数据库时,请使用单引号(而不是双引号)来定义文字字符串。
例如 $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 ) );
?>
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));
// 以及您想对结果执行的操作
// 但您得到的只有“预期参数”或“计数不匹配”
}
此类函数缺少文档应该是警示信号。
回复 tcmleung at yahoo dot com (09-Nov-2001),我想补充说明我发现的一个警告,即 odbc.defaultlrl/odbc_longreadlen() 值可能仅适用于 odbc->php 转换,而不是 php->odbc(尽管这可能是特定于数据库的)。因此,如果您想发布二进制数据,则 4096 字节限制仍然存在。所以,您更有可能使用上面描述的带引号的文件名上传过程来发布二进制数据,而不是使用准备...执行方法来处理保存在 php 变量中的数据。
不要错过说明,如果您的字符串以单引号开头和结尾,则该字符串将被解释为文件名!
这意味着您不能执行
$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 将其插入数据库。
要使用准备好的 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>";
// 添加其他逻辑
}
?>
我弄清楚之后,我的应用程序完美运行了。