Подтвердить что ты не робот

Как я могу использовать хранимую процедуру в базе данных MySql с Zend Framework?

Недавно я научился использовать Zend Framework. Я сделал простое приложение CRUD. Но теперь я хочу использовать существующую базу данных для более сложного приложения, и я хочу знать, как я вызываю хранимую процедуру в модели, как отправлять параметры, как читать результаты и хранить их в массиве в PHP. Пожалуйста. Я ценю любую помощь:)

4b9b3361

Ответ 1

Это не слишком сложно. Здесь приведен пример хранимой процедуры MySQL с параметром IN, параметром OUT и набором результатов:

CREATE PROCEDURE MyProc(IN i INTEGER, OUT o INTEGER)
BEGIN
  SELECT i+10 INTO o;
  SELECT i, o;
END

Вы можете вызвать это с помощью метода query() и передать параметр:

$stmt = $db->query("CALL MyProc(?, @output)", array(25));
print_r( $stmt->fetchAll() );

Фокус в том, что MySQL хранимые procs могут возвращать несколько наборов результатов (если у proc было несколько запросов SELECT, например). Таким образом, API должен продвигаться по всем наборам результатов, прежде чем вы сможете выполнить другой SQL-запрос. Или вы получаете ошибку "Commands out of sync".

Если вы используете адаптер PDO_MySQL:

while ($stmt->nextRowset()) { }

Если вы используете адаптер MySQLi, вы обнаружите, что Zend_Db_Statement_Mysqli не реализует nextRowset(), поэтому вам нужно вызвать внутренний объект соединения mysqli:

while ($db->getConnection()->next_result()) { }

После очистки наборов результатов вы можете запускать последующие SQL-запросы, например, для получения значения параметра OUT:

$stmt = $db->query("SELECT @output");
print_r( $stmt->fetchAll() );

Ответ 2

Отличный ответ от Билла. Для полноты, если вы сталкиваетесь:

SQLSTATE[HY000]: General error: 2053

При использовании этого метода для получения набора результатов из вашей процедуры проверьте свои аргументы. Я реорганизовал метод и передавал NULL в качестве аргументов процедуры, поскольку переменные, которые я использовал, были вне сферы действия. Как только я исправил эту глупую ошибку, проблема исчезла (чтобы ее заменили другой):

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other 
unbuffered queries are active.  Consider using PDOStatement::fetchAll().

Я использую $stmt->fetchAll(). Я переключился на использование prepare() и execute() вместо query(). Переход на mysqli от pdo_mysql в моей конфигурации Zend_Db, наконец, заставил меня работать. Я нашел эту информацию из следующего вопроса SO:

Вызов нескольких хранимых процедур с помощью Zend Framework

Ответ 3

    $db = Zend_Db_Table::getDefaultAdapter();    
    $stmt = $db->query("CALL procedure()");
    $data = $stmt->fetchAll();