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

18

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

    
задан l2mt 20.08.2009 в 06:11
источник
  • Если вы хотите использовать хранимые процедуры в хостинге базы данных MySQL GoDaddy, проверьте, можете ли вы создать резервную копию вместе с резервной копией базы данных. По моему опыту, они НЕ позволяют резервировать хранимые процедуры. Для меня неприемлемо использовать их. –  Yevgeniy Afanasyev 23.12.2014 в 04:05

4 ответа

24

Это не так уж сложно. Вот пример хранимой процедуры 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 Karwin 20.08.2009 в 08:50
  • Я не тестировал вызов хранимых процедур в других марках базы данных, кроме MySQL. –  Bill Karwin 20.08.2009 в 08:54
  • Спасибо Билл .. Я постараюсь как можно скорее :) –  l2mt 21.08.2009 в 06:18
1

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

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

    
ответ дан Greg K 05.12.2012 в 12:57
0
    $db = Zend_Db_Table::getDefaultAdapter();    
    $stmt = $db->query("CALL procedure()");
    $data = $stmt->fetchAll();
    
ответ дан Eric Lemes 18.05.2017 в 15:25
  • Добро пожаловать в StackOverflow. Чтобы дать хороший ответ, вы должны написать объяснение с кодом, который вы предоставили. –  filipst 18.05.2017 в 15:48
0

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

}
    
ответ дан Amit Chigadani 13.03.2018 в 11:52