【问题标题】:db2_prepare(): Statement Prepare Failed when binding parameterdb2_prepare():绑定参数时Statement Prepare Failed
【发布时间】: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,您应该将此作为答案发布。这解决了我的问题。

标签: php db2 db2-400


【解决方案1】:

正如评论中提到的,我猜您的问题是 DB2 在进行绑定时无法确定您的参数是什么类型。如果您在参数周围添加CAST 来告诉 DB2 您传递的是什么类型,它应该可以工作。

我不确定 PHP 是否有选项,但在 C# 中,您可以在定义参数时传入类型,因此如果可用,这可能是一个选项,而不是在 SQL 中硬编码类型。

查看other answer I have,了解如何获取“本机”DB2 错误,这可能比 PHP 抛出的错误更有帮助。我也有another answer about SQL0418N,如果您查看本机错误,这可能是您收到的实际错误。

【讨论】:

  • 提供一些为什么需要知道数据类型的背景:DB2 使用参数的数量及其数据类型来解析函数,因此使用无类型参数标记它无法确定相应的函数是否存在.
猜你喜欢
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
相关资源
最近更新 更多