Регистрация OUT-параметра в ф-ции bind_param

J-Pro

Новичок
Регистрация OUT-параметра в ф-ции bind_param

Народ, всем привет.

Столкнулся с проблемкой.. Есть в базе процедура с несколькими IN-параметрами и одним OUT-параметром. Пока выполнял из пхп только процедуры с IN-параметрами - всё было ок, пользовался ф-цией $stmt->bind_param или mysqli_stmt_bind_param, что одно и то же.

Но как только захотел забиндить OUT-параметр этой же функцией:
PHP:
$procedureCallStatement = "CALL AddNew(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

$newID = -1;

$stmt = $mysqli->prepare($procedureCallStatement);
$stmt->bind_param('isssiisssiii', $activityTypeID, $articleName, $pathToPhoto, $pathToFirstPhoto, $old,$new, $startDate, $endDate, $description, $language, $updatedBy, $newID);
,получил такую ошибку:
PHP:
OUT or INOUT argument 12 for routine backoffice.AddNew is not a variable or NEW pseudo-variable in BEFORE trigger

На всякий случай определение ф-ции:
PHP:
CREATE PROCEDURE `AddNew`(IN activitytypeid BIGINT, IN articlename VARCHAR(128), IN pathtophoto VARCHAR(255), IN pathtofirstphoto VARCHAR(255), IN old INT(11), IN new INT(11), IN startdate DATE, IN enddate DATE, IN description VARCHAR(255), IN languageid BIGINT, IN updatedby BIGINT, OUT newid BIGINT)
    NOT DETERMINISTIC
    SQL SECURITY DEFINER
    COMMENT ''
....

Кто знает, как забиндить OUT-параметр? Для DB2 всё просто, там указывается прямо в ф-ции:
PHP:
$stmt->bindParam(1, $second_name, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 32);
, а тут по-другому...

Кто знает как? Народ, подскажите, полиз, выбился из сил искать в нете :( Везде не то :(

Спасибо огромное заранее тому, кто откликнется!
 

svetasmirnova

маленький монстрик
>Кто знает, как забиндить OUT-параметр?
Никак насколько я знаю.

То есть просто нужно сначала создать переменную, а потом уже её использовать. Типа:

PHP:
$mysqli->query('SET @foo = 0');
$procedureCallStatement = "CALL AddNew(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, @foo)";
// далее как и раньше
$mysqli->query('SELECT @foo');
 

J-Pro

Новичок
Автор оригинала: svetasmirnova
То есть просто нужно сначала создать переменную, а потом уже её использовать. Типа:
PHP:
$mysqli->query('SET @foo = 0');
$procedureCallStatement = "CALL AddNew(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, @foo)";
// далее как и раньше
$mysqli->query('SELECT @foo');
Хм... Спасибо, теоретически должно работать...
А как потом поучить эту переменную из резалта?

Дело в том, что получать результат из $stmt я могу, а после выполнения query не получается...
Делаю так, как Вы подсказали, а после этого:
PHP:
$result = $mysqli->query('SELECT @foo');
$row = $mysqli_fetch_array($result);
echo "<BR>New ID = " . $row[0];
Вылазит ошибка на вторую строчку в моём примере:
PHP:
Fatal error: Function name must be a string in ...
Если же писать $mysqli->fetch_array, то такой ф-ции просто нет:
PHP:
Fatal error: Call to undefined method mysqli::fetch_array() in ...
Не подскажете, как безболезненно получить эту переменную?
Спасибо большое заранее.

P.S.: Кстати, вдвойне приятно,что отвечает девушка ;)
 

Андрейка

Senior pomidor developer
я не девушка, поэтому ничего приятного вам не скажу

$mysqli_fetch_array - это пять
использование оо и mysqli_* функций - это уже десять
$mysqli->fetch_array .. со счету сбился

в мануале ж все описано %)
 

J-Pro

Новичок
Автор оригинала: Андрейка
я не девушка, поэтому ничего приятного вам не скажу
Ничего страшного, я не ради удовольствия тут :) Но если это сопутствует делу, то я за ;)

Автор оригинала: Андрейка
$mysqli_fetch_array - это пять
использование оо и mysqli_* функций - это уже десять
$mysqli->fetch_array .. со счету сбился
пять, десять... - РАЗ описано в форуме? Я понимаю, как их использовать. Но я пишу об ошибках, возникающих при их работе. И я думаю, неординарных. Использую mysqli->query во время выполнения хранимой процедуры, поэтому, вполне возможно, что ошибки связаны с этим.

Автор оригинала: Андрейка
в мануале ж все описано %)
Он постоянно открыт у меня и я постоянно обращаюсь к нему. Но, к сожалению, я не нашёл там(если оно вообще есть), функции и атрибуты различных классов и их описание, таких как mysqli, result и т.д. К примеру, о различных ф-циях класса result я могу узнать из РАЗЛИЧНЫХ частей мануала. А так, чтобы всё в одном месте - не находил. Поэтому и спрашиваю, может, есть какая-то ф-ция, которая в данном случае, при использовании mysqli->query во время выполнения хранимой процедуры окажется полезнее, нежели другие.


Кстати, уважаемая svetasmirnova, попробовал так:
PHP:
$mysqli->query('SET @foo = 0'); 
$procedureCallStatement = "CALL AddNew(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, @foo)"; 
$result = $mysqli->query('SELECT @foo');
$row = $result->fetch_array();
echo "<BR>NEw ID = " . $row[0];
$result->close();
Ошибок нет, но, не смотря на то, что в хранимой процедуре OUT переменная меняется на определённое значение(уверен на 100%, пробовал обычным SQL-запросом), то тут она остаётся 0, т.к. вывод выглядит следующим образом:
PHP:
NEw ID = 0
Может, я что не так делаю?
 

J-Pro

Новичок
svetasmirnova , спасибо большое, всё получилось.

Дело в том, что кроме хранимой процедуры, работал триггер. После того, как я всё в очередной раз перепроверил, оказалось, сам же допустил в нём ошибку :(

Но уже исправил, всё работает!

Спасибо, svetasmirnova , ещё раз Вам за помощь.
 

itprog

Cruftsman
А pdo таким же образом заставлять работать?
PHP:
$stmt = $db->prepare("CALL accept(?, ?)");
$id = 15;
$stmt->bindParam(1, $id, PDO::PARAM_INT);
$stmt->bindParam(2, $affected, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 32);
$stmt->execute();
Код:
SQLSTATE[HY000]: General error: 1414 OUT or INOUT argument 2 for 
routine mzz.accept is not a variable or NEW pseudo-variable in BEFORE trigger
При этом setAttribute(PDO::ATTR_EMULATE_PREPARES, true), последний php 5.2.х со snaps-ов взял.
 
Сверху