ODBC编写的PHP语句

psy*_*ott 16 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)
Run Code Online (Sandbox Code Playgroud)

第一个var_dump返回true,因此执行成功,但没有返回任何行.param_name ='version'确实存在一行.为什么没有返回行?

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

$pstmt=odbc_prepare($odb_con,"insert into tmp1 values(?,'?')");
Run Code Online (Sandbox Code Playgroud)

这行本身就是在数据库中插入一行!! 当然这是错的?输入的数据是col 1 =空白,col 2 =?

任何关于从哪里开始修复此建议的建议将不胜感激,谢谢.

编辑:这是在PHP 5.2.8中

Mic*_*ael 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)
Run Code Online (Sandbox Code Playgroud)

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

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

如果您希望存储实际以单引号开头和结尾的字符串,则必须在参数的开头或结尾添加空格或其他非单引号字符,这将阻止将该参数作为文件名.


Jer*_* S. 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));
Run Code Online (Sandbox Code Playgroud)

这将导致以下声明

$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)
Run Code Online (Sandbox Code Playgroud)

看到我不仅删除了params数组中qoutes,还删除了SQL语句中qoutes.

如果这是对的,请给出反馈