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?
Respuesta
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());
No he probado los procedimientos almacenados de llamadas en otras marcas de bases de datos además de MySQL. –
Gracias Bill ... Lo intentaré lo antes posible :) – l2mt
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:
$db = Zend_Db_Table::getDefaultAdapter();
$stmt = $db->query("CALL procedure()");
$data = $stmt->fetchAll();
Bienvenido a StackOverflow. Para proporcionar una buena respuesta, debe escribir una explicación con el código que ha proporcionado. – filipst
- 1. Usar la base de datos dentro de un procedimiento almacenado
- 2. ¿Cómo editas un procedimiento almacenado en MySQL?
- 3. Cómo simular una impresión en un procedimiento almacenado de MySQL
- 4. Transacciones de base de datos en Zend Framework: ¿Están aisladas?
- 5. Llamar a un procedimiento almacenado en un procedimiento almacenado en MySQL
- 6. Conexión MySql SSL con Zend-Framework
- 7. Zend Framework: Comenzando a usar SQLite
- 8. Cómo usar GROUP_CONCAT con Zend Framework?
- 9. ¿Cómo programar un procedimiento almacenado?
- 10. Procedimiento almacenado en la base de datos H2
- 11. ¿Cómo puedo ejecutar código almacenado en una base de datos?
- 12. Crear procedimiento almacenado en otra base de datos
- 13. Usar el cursor en un bucle de un procedimiento almacenado
- 14. ¿Cómo usar un valor de un procedimiento almacenado en otro?
- 15. MySQL - ¿Cómo lanzar una excepción en el procedimiento almacenado?
- 16. cómo configurar un procedimiento almacenado para acceder a una tabla en otra base de datos
- 17. Generar identidad para una base de datos Oracle a través de Entity Framework usando un procedimiento almacenado existente
- 18. MySQL Cómo INSERTAR EN [tabla temporal] FROM [Procedimiento almacenado]
- 19. ¿Cómo selecciono un procedimiento almacenado en Sybase?
- 20. Zend Framework MySQL Update Column
- 21. Llamar a un procedimiento almacenado con asp.net
- 22. Zend Framework - Actualizar una fila de base de datos con WHERE y Y
- 23. ¿Puedo establecer un esquema predeterminado dentro de un procedimiento almacenado?
- 24. Probar el procedimiento almacenado sin afectar la base de datos
- 25. Cómo ejecutar un procedimiento almacenado de Oracle a través de un enlace de base de datos
- 26. ¿Cómo puedo obtener datos de un procedimiento almacenado en una tabla temporal?
- 27. ¿Puedo llamar a un procedimiento almacenado con criterios de hibernación?
- 28. Llamar procedimiento almacenado dentro de TransactionScope en Entity Framework
- 29. Cómo llamar a un procedimiento almacenado (con parámetros) desde otro procedimiento almacenado sin tabla temporal
- 30. Zend Framework: ¿Cómo hacer una selección de base de datos con múltiples params?
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. –