Недавно я научился использовать Zend Framework. Я сделал простое приложение CRUD. Но теперь я хочу использовать существующую базу данных для более сложного приложения, и я хочу знать, как я вызываю хранимую процедуру в модели, как отправлять параметры, как читать результаты и хранить их в массиве в PHP. Пожалуйста. Я ценю любую помощь:)
Как я могу использовать хранимую процедуру в базе данных MySql с Zend Framework?
Ответ 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:
Ответ 3
$db = Zend_Db_Table::getDefaultAdapter();
$stmt = $db->query("CALL procedure()");
$data = $stmt->fetchAll();