ODBC编写的PHP语句

时间:2011-04-22 14:18:33

标签: php odbc prepared-statement

我正在尝试在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

6 个答案:

答案 0 :(得分:11)

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

$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

  

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

答案 1 :(得分:5)

当我读到这段话时

  

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中的值在params数组中,而且还删除了SQL语句中的 qoutes 。 / p>

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

答案 2 :(得分:2)

编辑:

Gah,不理我,误读了php.net

odbc_fetch_array接受odbc_execute的结果作为参数,你好像是在准备好的语句中传递。

答案 3 :(得分:2)

您使用的是什么DBMS?事实上,单独的插入准备语句似乎是针对数据库执行而不是准备指向PHP的不良实现(不太可能)或DBMS不支持准备好的sql。如果是后者,那么他们支持命令的方式可能只是执行导致你得到的结果的语句。如果DBMS 支持预处理语句并且php实现正确处理它,则执行插入时存在某种问题,这也需要一些调查。

答案 4 :(得分:2)

您尝试使用双引号吗?即。

$res=odbc_execute($pstmt,array("version"));

答案 5 :(得分:2)

您不应将变量用引号括在预准备语句中:


$pstmt=odbc_prepare($odb_con,"select * from configured where param_name=?");
$res=odbc_execute($pstmt,array(" 'version'"));

应该是:


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

问号表示参数占位符,传递的值表示未转义的未封闭值,将由SQL解释器正确转义。