【发布时间】:2015-11-17 14:36:11
【问题描述】:
我正在尝试为 iSeries 上的 DB2 上的表函数准备一个语句,但我收到了 db2_prepare() 警告。当我将参数值直接插入到 SQL 语句中时,它工作正常。
这是我要准备的:
$sql = 'SELECT U8.VALIDUSER(?) '
. 'FROM SYSIBM.SYSDUMMY1';
$stmt = db2_prepare($this->conn, $sql);
db2_bind_param($stmt, 1, 'userID', DB2_PARAM_IN);
PHP 返回:Warning: db2_prepare(): Statement Prepare Failed in... 用于 db2_prepare() 行。
如果我把它改成这个,它就可以了:
$sql = 'SELECT U8.VALIDUSER(\'' . $userID . '\') '
. 'FROM SYSIBM.SYSDUMMY1';
$stmt = db2_prepare($this->conn, $sql);
为什么绑定参数会失败,直接插入就可以了?我自然想绑定参数,这样我就不必为这种情况添加不必要的清理。
我有什么遗漏吗?
【问题讨论】:
-
你不能绑定表格/列,故事结束。使用安全列表。
-
@Fred-ii-,看起来他不是在尝试参数化表或列,而是函数调用的参数......
-
@bhamby 查看
SELECT U8.VALIDUSER(?)并告诉我这不是在尝试绑定。这家伙甚至说SELECT U8.VALIDUSER(\'' . $userID . '\')有效。我在这里没有抓住什么? -
@Fred-ii-,如果我猜的话,我会说
U8.VALIDUSER要么是一个存储过程,要么可能是一个标量函数。如果我猜测(我不太熟悉 DB2 for iSeries,只熟悉其他 DB2 平台),我会认为 DB2 无法确定参数的数据类型,这就是它失败的原因。 OP,尝试在参数周围添加CAST,看看是否有效(例如CAST(? AS CHAR(8))) -
@bhamby,您应该将此作为答案发布。这解决了我的问题。