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

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

 Yevgeniy Afanasyev23 дек. 2014 г., 04:05
Если вы хотите использовать хранимые процедуры в GoDaddy, в котором размещена база данных MySQL, проверьте, можете ли вы создать ее резервную копию вместе с резервной копией базы данных. По моему опыту, они НЕ позволяют создавать резервные копии хранимых процедур. Это делает недопустимым для меня их использование.

Ответы на вопрос(4)

    $db = Zend_Db_Table::getDefaultAdapter();    
    $stmt = $db->query("CALL procedure()");
    $data = $stmt->fetchAll();
 filipst18 мая 2017 г., 15:48
Добро пожаловать в StackOverflow. Чтобы дать хороший ответ, вы должны написать объяснение с кодом, который вы предоставили.
Решение Вопроса

Это не так уж сложно. Вот пример хранимой процедуры 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 могут возвращать несколько результирующих наборов (если у процесса было несколькоSELECT запросы, например). Поэтому API должен пройти через все наборы результатов, прежде чем вы сможете выполнить другой SQL-запрос. Или иначе вы получитеКоманды не синхронизированы" ошибка.

Если вы используете адаптер 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() );
 Bill Karwin20 авг. 2009 г., 08:54
Я не проверял вызов хранимых процедур в других базах данных, кроме MySQL.
 l2mt21 авг. 2009 г., 06:18
Спасибо, Билл .. Я попробую как можно скорее :)

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

ZendFramework 2 \ Zend Expressive с помощьюZend\Db :

Есть еще один способ сделать это, используяcreateStatement() метод.

// prepare create statement from adapter
$stmt = $this->getAdapter()->createStatement();

$stmt->prepare('CALL myproc("myVal")');
// execute sql query
$records = $stmt->execute();
// manipulate results
if ($records instanceof ResultInterface && $records->isQueryResult()) {
    $resultSet = new ResultSet;
    $resultSet->initialize($records);
    // return records if found
    if (count($resultSet)) {
       // return array of result set
       return $resultSet->toArray();
    }
   // if no records found
   return array()

}

Ваш ответ на вопрос