Я пытаюсь подготовить оператор для табличной функции в DB2 на iSeries, но получаю предупреждение 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);
Почему происходит сбой при привязке параметра, но работает, когда я вставляю его напрямую? Я естественно хочу связать параметр, чтобы мне не нужно было добавлять ненужную очистку для этой единственной ситуации.
Я что-то упускаю?
Как упоминалось в комментарии, я предполагаю, что ваша проблема в том, что DB2 не может определить тип вашего параметра, когда он выполняет связывание. Если вы добавите CAST
вокруг параметра, сообщающего DB2, какой тип вы передаете, он должен работать.
Я не уверен, есть ли в PHP опция, но в C # вы можете передать тип при определении параметра, так что это может быть опция, если она доступна, вместо жесткого кодирования типа в SQL.
Проверьте это другой ответ у меня есть о том, как извлекать «нативные» ошибки DB2, которые, вероятно, гораздо более полезны, чем те, которые выдает PHP. у меня тоже есть другой ответ о SQL0418N
, что, вероятно, является реальной ошибкой, которую вы получили бы, если бы смотрели на собственную ошибку.
Других решений пока нет …