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

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

Ответы [ 4 ]

24 голосов
/ 20 августа 2009

Это не так уж сложно. Вот пример хранимой процедуры 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() );
1 голос
/ 05 декабря 2012

Отличный ответ от Билла. Просто для полноты, если вы встретите:

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

0 голосов
/ 13 марта 2018

Если кто-то ищет 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()

}
0 голосов
/ 18 мая 2017
    $db = Zend_Db_Table::getDefaultAdapter();    
    $stmt = $db->query("CALL procedure()");
    $data = $stmt->fetchAll();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...