Alf162
@Alf162

Вызов хранимой процедуры php PDO, firebird?

Здравствуйте. Не получается выполнить ХП средствами PDO. Сама процедура:

CREATE PROCEDURE P_NAME_ID(<br>
    INTAB VARCHAR(10),<br>
    NAME VARCHAR(60))<br>
RETURNS (<br>
    ID INTEGER,<br>
    PNO SMALLINT)<br>
AS<br>
DECLARE VARIABLE UPNAME VARCHAR(60);<br>
begin<br>
 if (INTAB = 'TGOS')  then begin<br>
  if ( NOT EXISTS(select ID from TGOS where UPPER(GOS) = :UPNAME) ) then begin<br>
    insert into TGOS (GOS) values (:NAME);   /* пишем, что пришло */<br>
    PNO = 1;<br>
  end<br>
  select ID from TGOS where UPPER(GOS) = :UPNAME into :ID;<br>
  Exit;<br>
 end<br>
.....<br>


Вызываю как положено:

$sql="CALL P_NAME_ID (?,?,?,?)";<br>
$sth = $dbo->prepare($sql);<br>
$sth->bindParam(1, 'TFAM', PDO::PARAM_STR);<br>
$sth->bindParam(2, 'Post body', PDO::PARAM_STR);<br>
$sth->bindParam(3, $id, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 11);<br>
$sth->bindParam(4, $id_, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 11);<br>
$sth->execute();<br>


В ответ получаю Fatal error: Call to a member function bindParam() on a non-object

В чем моя ошибка?
  • Вопрос задан
  • 7051 просмотр
Решения вопроса 1
Alf162
@Alf162 Автор вопроса
Видимо проблема все-таки с PDO. Правильно будет так:
$sql="EXECUTE PROCEDURE P_NAME_ID ('TFAM','Post body')";
$sth = $dbo->prepare($sql);
$r = $res->fetchAll();

Тогда в $r вернется результат выполнения процедуры. Но это не работает почему-то. Зато работает без PDO:
$db = ibase_connect($database, $user, $password)or die($err_logon);
$sql= "EXECUTE PROCEDURE P_NAME_ID ('TFAM','Post body')";
$sql_res = ibase_query($sql, $db);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 8
Mendel
@Mendel
PHP-developer
Всё указывает на то, что ошибка здесь:
$sql="CALL P_NAME_ID (?,?,?,?)";

Я не знаю firebird, так что не подскажу дальше. Но глаз режет отсутствие точки с запятой. По идее она не обязательная но…

PS: на вскидку гугл мне не выдал ничего про
зато выдал про
CALL P_NAME_ID

EXECUTE PROCEDURE

Уверенны в синтаксисе?
Прямое выполнение инструкции в консоли ошибку не выдает?
Ответ написан
@Domini
Ссылка
$sql="EXECUTE P_NAME_ID (:INTAB,:NAME,:ID,:PNO)";
$sth = $dbo->prepare($sql);
$sth->bindParam(':INTAB', 'TFAM', PDO::PARAM_STR);
$sth->bindParam(':NAME', 'Post body', PDO::PARAM_STR);
$sth->bindParam(':ID', $id, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 11);
$sth->bindParam(':PNO', $id_, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 11);
Ответ написан
prepare() не вернул PDOStatement, скорее всего вернул false, почему так сделал надо смотреть в документации.
Ответ написан
@Tramvai
php.net/manual/ru/pdo.prepare.php
Если СУБД успешно подготовила запрос, PDO::prepare() возвращает объект PDOStatement. Если подготовить запрос не удалось, PDO::prepare() возвращает FALSE или выбрасывает исключение PDOException (зависит от текущего режима обработки ошибок).
Ответ написан
Alf162
@Alf162 Автор вопроса
Без процедур все отлично
Ответ написан
Комментировать
$sth->bindParam(1, 'TFAM', PDO::PARAM_STR);

Замените на:
$sth->bindValue(1, 'TFAM', PDO::PARAM_STR);
Ответ написан
> Fatal error: Call to a member function bindParam() on a non-object
Ошибка в этом. Переведите ошибку. :)
Ответ написан
svd71
@svd71
для того, что бы процедура вернула параметры, небходимо добавить в нее строку:

...
  select ID from TGOS where UPPER(GOS) = :UPNAME into :ID;
SUSPEND;
  Exit;
....
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы