Pregunta

La pregunta es bastante abierto.He estado usando Procedimientos Almacenados con MS SQLServer durante algún tiempo con ASP clásico y ASP.net y el amor de ellos, un montón.

Tengo un pequeño hobby proyecto en el que estoy trabajando y que por diversas razones se han ido de la LÁMPARA de la ruta.Consejos/trucos/trampas o buenos puntos de partida para entrar en el uso de procedimientos almacenados con MySQL y PHP5?Mi versión de MySQL soporta Procedimientos Almacenados.

¿Fue útil?

Solución

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

En su lugar, echar un vistazo a PDO, específicamente preparado las instrucciones 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";

Otros consejos

@michal kralik - por desgracia, hay un bug con la API en C de MySQL PDO utiliza lo que significa que la ejecución de su código como el anterior y con algunas versiones de MySQL resultados en el error:

"Error de sintaxis o de infracción de acceso:1414 OUT o INOUT argumento $parameter_number de rutina $procedure_name no es una variable o una NUEVA pseudo-variable".

Usted puede ver el informe de fallo en bugs.mysql.com.Se ha corregido para la versión 5.5.3+ & 6.0.8+.

Para solucionar el problema, sería necesario separar dentro y fuera de los parámetros, y el uso de variables de usuario para almacenar el resultado como este:

$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";

No es obligatorio usar mysqli o PDO para llamar a procedimientos almacenados en MySQL 5.Usted puede llamar bien con el viejo funciones mysql_.La única cosa que no puede hacer es devolver varios conjuntos de resultados.

He encontrado que la devolución de varios conjuntos de resultados es algo propenso a errores, de todos modos;no funciona en algunos casos, pero sólo si la aplicación recuerda a consumir todos ellos, de lo contrario la conexión se queda en un estado roto.

Usted necesitará utilizar MySQLI (Extensión de MySQL Mejorada) para llamar a procedimientos almacenados.He aquí cómo usted llamaría una SP:

$mysqli = new MySQLI(user,pass,db);

$result = $mysqli->query("CALL sp_mysp()");

Cuando se utiliza SPs necesitará cerrar el primer conjunto de resultados o usted recibirá un error.Aquí más información :

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

Como alternativa, puede utilizar Declaraciones Preparadas, que yo encuentro muy sencillo:

  $stmt = $mysqli->prepare("SELECT Phone FROM MyTable WHERE Name=?");

  $stmt->bind_param("s", $myName);

  $stmt->execute();

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

He estado usando ADODB, que es una gran cosa para la abstracción de comandos para hacerlo portable entre diferentes Servidores de SQL (es decir mysql a mssql).Sin embargo, los procedimientos Almacenados no parecen ser directamente compatibles.Lo que esto significa, es que tengo ejecutar una consulta SQL como si es uno normal, pero para "llamar" al SP.Una consulta de ejemplo:

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

Esta no es la contabilidad de los datos devueltos,lo cual es importante.Supongo que esto se llevaría a cabo mediante el establecimiento de un @Var , que se pueden seleccionar a sí mismo como el retorno de @Variable .

Se Resumen a pesar de que, a pesar de hacer un primer php procedimiento almacenado en función de la aplicación web de era muy difícil de evitar (mssql está muy bien documentado, este no lo es), Es genial después de su hecho - los cambios son muy fáciles de hacer debido a la separación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top