我正在尝试在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
答案 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解释器正确转义。