2009-08-20 29 views
17

Recientemente aprendí a usar Zend Framework. Hice una simple aplicación CRUD. Pero ahora quiero usar una base de datos existente para una aplicación más compleja y quiero saber cómo llamo a un procedimiento almacenado en el Modelo, cómo enviar parámetros, cómo leer los resultados y almacenarlos en una matriz en PHP. Por favor. Agradezco cualquier tipo de ayuda :)¿Cómo puedo usar un procedimiento almacenado en una base de datos MySql con Zend Framework?

+0

Si desea utilizar procedimientos almacenados dentro de GoDaddy de alojamiento de base de datos MySQL, comprobar si puede realizar copias de seguridad junto con la copia de seguridad de base de datos. Desde mi experiencia, NO permiten hacer copias de seguridad de los procedimientos almacenados. Me hace inaceptable usarlos. –

Respuesta

23

No es demasiado difícil. He aquí un ejemplo de un procedimiento de MySQL almacenado con un parámetro IN, un parámetro OUT, y un conjunto de resultados:

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

Usted puede llamar a esto con el método query(), y pasar un parámetro:

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

El truco es que los procs almacenados de MySQL pueden devolver múltiples conjuntos de resultados (si el proceso tiene múltiples consultas SELECT, por ejemplo). Por lo tanto, la API debe avanzar a través de todos los conjuntos de resultados antes de poder ejecutar otra consulta SQL. O bien, obtiene el error "Comandos no sincronizados".

Si utiliza el adaptador PDO_MySQL:

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

Si se utiliza el adaptador de MySQLi, usted encontrará que Zend_Db_Statement_Mysqli no implementa nextRowset(), por lo que tiene que llamar a la mysqli objeto de conexión interna:

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

Una vez que se borre los conjuntos de resultados, puede ejecutar consultas SQL posteriores, por ejemplo, para ir a buscar el valor del parámetro del procedimiento OUT:

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

No he probado los procedimientos almacenados de llamadas en otras marcas de bases de datos además de MySQL. –

+0

Gracias Bill ... Lo intentaré lo antes posible :) – l2mt

1

Gran respuesta de Bill. Simplemente para la corrección, si se encuentra con:

SQLSTATE[HY000]: General error: 2053 

Cuando se utiliza este método para obtener un conjunto de resultados de su procedimiento, compruebe sus argumentos. Refactoreé un método y estaba pasando NULLs como argumentos para el procedimiento ya que las variables que había usado estaban fuera del alcance. Una vez que había corregido este error tonto el problema se fue (para ser reemplazado por otro):

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

estoy usando $stmt->fetchAll() sin embargo. Cambié a usar prepare() y execute() en lugar de query(). Cambiar a mysqli desde pdo_mysql en mi configuración de Zend_Db finalmente me funcionó. He encontrado esta información desde el siguiente SO pregunta:

Call Multiple Stored Procedures with the Zend Framework

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

Bienvenido a StackOverflow. Para proporcionar una buena respuesta, debe escribir una explicación con el código que ha proporcionado. – filipst

Cuestiones relacionadas