db2_prepare(): 绑定参数时语句准备失败
db2_prepare(): Statement Prepare Failed when binding parameter
我正在尝试为 iSeries 上的 DB2 上的 table 函数准备一个语句,但我收到 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 returns:Warning: db2_prepare(): Statement Prepare Failed in...
用于 db2_prepare() 行。
如果我把它改成这个,它就有效:
$sql = 'SELECT U8.VALIDUSER(\'' . $userID . '\') '
. 'FROM SYSIBM.SYSDUMMY1';
$stmt = db2_prepare($this->conn, $sql);
为什么绑定参数失败,直接插入就可以?我自然想绑定参数,这样我就不必为这种情况添加不必要的清理。
有什么我遗漏的吗?
如评论中所述,我猜测您的问题是DB2 在进行绑定时无法确定您的参数是什么类型。如果您在参数周围添加一个 CAST
来告诉 DB2 您传递的是什么类型,它应该可以工作。
我不确定 PHP 是否有选项,但在 C# 中,您可以在定义参数时传入类型,因此如果可用的话,这可能是一个选项,而不是 hard-在 SQL.
中编码类型
查看此 other answer I have about how to fetch the "native" DB2 errors, which are likely much more helpful than the ones thrown by PHP. I also have another answer about SQL0418N
,这可能是您在查看本机错误时收到的实际错误。
我正在尝试为 iSeries 上的 DB2 上的 table 函数准备一个语句,但我收到 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 returns:Warning: db2_prepare(): Statement Prepare Failed in...
用于 db2_prepare() 行。
如果我把它改成这个,它就有效:
$sql = 'SELECT U8.VALIDUSER(\'' . $userID . '\') '
. 'FROM SYSIBM.SYSDUMMY1';
$stmt = db2_prepare($this->conn, $sql);
为什么绑定参数失败,直接插入就可以?我自然想绑定参数,这样我就不必为这种情况添加不必要的清理。
有什么我遗漏的吗?
如评论中所述,我猜测您的问题是DB2 在进行绑定时无法确定您的参数是什么类型。如果您在参数周围添加一个 CAST
来告诉 DB2 您传递的是什么类型,它应该可以工作。
我不确定 PHP 是否有选项,但在 C# 中,您可以在定义参数时传入类型,因此如果可用的话,这可能是一个选项,而不是 hard-在 SQL.
中编码类型查看此 other answer I have about how to fetch the "native" DB2 errors, which are likely much more helpful than the ones thrown by PHP. I also have another answer about SQL0418N
,这可能是您在查看本机错误时收到的实际错误。