用 PHP 编写的 ODBC 语句

2022-08-31 00:54:51

我试图在PHP中使用odbc_prepare和odbc_execute,如下所示:

$pstmt=odbc_prepare($odb_con,"select * from configured where param_name='?'");
$res=odbc_execute($pstmt,array('version'));
var_dump($res);  //bool(true)
$row = odbc_fetch_array($pstmt);
var_dump($row);  //bool(false)

第一个var_dump返回 true,因此执行成功,但不返回任何行。确实存在一行,param_name = “version”。为什么不返回任何行?

为了让事情变得有趣,我用准备好的插件在php中运行了另一个非常简单的例子。

$pstmt=odbc_prepare($odb_con,"insert into tmp1 values(?,'?')");

这行本身就插入了一行到数据库中!!这肯定是错误的吗?输入的数据为 col 1 = 空白,col 2 = ?

任何关于从哪里开始解决这个问题的建议将不胜感激,谢谢。

编辑:这是在 PHP 5.2.8 中


答案 1

尝试从查询字符串中删除单引号,并将它们添加到参数值本身:

$pstmt=odbc_prepare($odb_con,"select * from configured where param_name=?");
$res=odbc_execute($pstmt,array(" 'version'"));
var_dump($res);  //bool(true)
$row = odbc_fetch_array($pstmt);
var_dump($row);  //bool(false)

参数值开头的单个空格字符非常重要 - 如果空格不存在,它将把变量视为文件的路径。

http://www.php.net/manual/en/function.odbc-execute.php

如果要存储实际上以单引号开头和结尾的字符串,则必须在参数的开头或结尾添加空格或其他非单引号字符,这将防止参数被视为文件名。


答案 2

当我读到这一段时

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

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

在我看来,没有必要向字符串添加单引号,只有当您真的想在数据库中将引号作为文本时'

因此,如果我只想插入文本,没有单引号,我会写这样的东西......

从 odbc-prepare 查看此示例

http://www.php.net/manual/en/function.odbc-prepare.php

Use this example for IBM DB/2:

$q = "update TABLE set PASS=? where NAME=?";
$res = odbc_prepare ($con, $q);

$a = "secret"; $b="user";
$exc = odbc_execute($res, array($a, $b));

这将导致以下语句

$pstmt=odbc_prepare($odb_con,"select * from configured where param_name=?");

$name = "version";
$params = array($name);

$res=odbc_execute($pstmt,$params);
var_dump($res);  //bool(true)

$row = odbc_fetch_array($pstmt);
var_dump($row);  //bool(false)

看到我不仅删除了参数数组中值的 qoutes,还删除了 SQL 语句中的 qoutes

如果这是正确的,请提供反馈


推荐