with utilizarlos stored procedimientos procedimiento ejecutar desde almacenados almacenado php mysql stored-procedures

stored - procedimientos almacenados en mysql y utilizarlos en php



Procedimientos almacenados, MySQL y PHP (5)

La pregunta es bastante abierta. He estado utilizando Stored Procs con MS SQLServer durante algún tiempo con ASP y ASP.net clásicos y me encantan, muchísimos.

Tengo un pequeño proyecto de pasatiempo en el que estoy trabajando y por diversos motivos he elegido la ruta LAMP. ¿Alguna sugerencia / trucos / trampas o buenos puntos de partida para entrar en el uso de procedimientos almacenados con MySQL y PHP5? Mi versión de MySQL admite Stored Procedures.


En realidad, no es obligatorio utilizar mysqli o PDO para llamar a procedimientos almacenados en MySQL 5. Puede llamarlos muy bien con las antiguas funciones mysql_. Lo único que no puede hacer es devolver múltiples conjuntos de resultados.

Descubrí que devolver conjuntos de resultados múltiples es algo propenso a errores; funciona en algunos casos, pero solo si la aplicación recuerda consumirlos todos, de lo contrario, la conexión se deja en un estado roto.


He estado usando ADODB, que es una gran cosa para abstraer los comandos reales para que sea portátil entre diferentes servidores SQL (es decir, mysql a mssql). Sin embargo, los procedimientos almacenados no parecen ser compatibles directamente. Lo que esto significa es que he ejecutado una consulta SQL como si fuera una normal, pero para "llamar" al SP. Una consulta de ejemplo:

$query = "Call HeatMatchInsert(''$mMatch'', ''$mOpponent'', ''$mDate'', $mPlayers, $mRound, ''$mMap'', ''$mServer'', ''$mPassword'', ''$mGame'', $mSeason, $mMatchType)";

Esto no es responsable de los datos devueltos, que es importante. Supongo que esto se haría estableciendo un @Var, que puede seleccionar usted mismo como el retorno @Variable.

Sin embargo, para ser abstracto, aunque fue muy difícil evitar una primera aplicación web basada en procedimientos almacenados de php (mssql está muy bien documentado, esto no es así), es genial una vez hecho: los cambios son muy fáciles de realizar debido a la separación.


@michal kralik - desafortunadamente hay un error con la API C de MySQL que utiliza PDO, lo que significa que ejecutar el código como el anterior con algunas versiones de MySQL da como resultado el error:

"Error de sintaxis o infracción de acceso: argumento 1414 OUT o INOUT $ parameter_number para la rutina $ procedure_name no es una variable o una nueva pseudovariable".

Puede ver el informe de error en bugs.mysql.com . Se ha corregido para la versión 5.5.3+ y 6.0.8+.

Para solucionar el problema, necesitaría separar los parámetros de entrada y salida, y usar variables de usuario para almacenar el resultado de esta manera:

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(:in_string, @out_string)"); $stmt->bindParam('':in_string'', ''hello''); // call the stored procedure $stmt->execute(); // fetch the output $outputArray = $this->dbh->query("select @out_string")->fetch(PDO::FETCH_ASSOC); print "procedure returned " . $outputArray[''@out_string''] . "/n";


Olvídate de mysqli , es mucho más difícil de usar que PDO y debería haber sido eliminado. Es cierto que introdujo grandes mejoras sobre mysql, pero para lograr el mismo efecto en mysqli a veces se requiere un esfuerzo enorme sobre PDO, es decir, fetchAll asociativo.

En cambio, eche un vistazo a PDO , declaraciones preparadas específicamente y procedimientos almacenados .

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = ''hello''; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); // call the stored procedure $stmt->execute(); print "procedure returned $value/n";


Tendrá que usar MySQLI (extensión mejorada de MySQL) para llamar a los procedimientos almacenados. Así es como llamarías a un SP :

$mysqli = new MySQLI(user,pass,db); $result = $mysqli->query("CALL sp_mysp()");

Al usar los SP necesitarás cerrar el primer conjunto de resultados o recibirás un error. Aquí hay algo más de información:

http://blog.rvdavid.net/using-stored-procedures-mysqli-in-php-5/ (enlace roto)

Alternativamente, puede usar Declaraciones preparadas , que me parece muy sencillo:

$stmt = $mysqli->prepare("SELECT Phone FROM MyTable WHERE Name=?"); $stmt->bind_param("s", $myName); $stmt->execute();

Documentación de MySQL: http://no.php.net/manual/en/book.mysqli.php