Come posso utilizzare una stored procedure in un database MySql con Zend Framework?

Recentemente ho imparato a usare Zend Framework. Ho fatto una semplice applicazione CRUD. Ma ora voglio usare un database esistente per un’applicazione più complessa e voglio sapere come chiamo una stored procedure nel modello, come inviare parametri, come leggere i risultati e memorizzarli in un array in PHP. Per favore. Apprezzo ogni tipo di aiuto 🙂

Non è troppo difficile. Ecco un esempio di una stored procedure MySQL con un parametro IN , un parametro OUT e un set di risultati:

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

Puoi chiamare questo con il metodo query() e passare un parametro:

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

Il trucco è che i proc memorizzati da MySQL potrebbero restituire più set di risultati (se il proc avesse più richieste SELECT per esempio). Quindi l’API deve avanzare attraverso tutti i set di risultati prima di poter eseguire un’altra query SQL. Oppure ottieni l’errore ” Comandi non sincronizzati “.

Se si utilizza l’adattatore PDO_MySQL:

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

Se usi l’adattatore MySQLi, scoprirai che Zend_Db_Statement_Mysqli non implementa nextRowset() , quindi devi chiamare l’object di connessione mysqli interno:

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

Una volta eliminati i set di risultati, è ansible eseguire query SQL successive, ad esempio per recuperare il valore del parametro OUT della procedura:

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

Ottima risposta da parte di Bill. Solo per completezza, se incontri:

 SQLSTATE[HY000]: General error: 2053 

Quando si utilizza questo metodo per ottenere un set di risultati dalla propria procedura, controllare i propri argomenti. Ho rifattorizzato un metodo e passando NULLs come argomenti alla procedura in quanto le variabili che avevo usato erano fuori portata. Una volta risolto questo stupido errore, il problema è andato via (per essere sostituito da un altro):

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

Sto usando $stmt->fetchAll() però. Sono passato a utilizzare prepare() ed execute() al posto di query() . Passare a mysqli da pdo_mysql nella mia configurazione di Zend_Db ha finalmente funzionato per me. Ho trovato queste informazioni dalla seguente domanda SO:

Chiama più stored procedure con Zend Framework

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

Se qualcuno sta cercando ZendFramework 2 \ Zend Expressive usando Zend\Db :

C’è un altro modo per farlo usando il metodo 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() }