Ola, somos Arume

Desenvolvemos páxinas web, aplicacións para móbiles, capas de realidade aumentada e aplicacións para Facebook. Apaixónanos a informática e somos uns perfeccionistas incurables; por eso nos nosos proxectos utilizamos estándares.

tel. 625 519 694

Mendaña de Neyra, 34, 3º B, 15008, A Coruña

Autenticarse

Rexistrarse. Esqueceches o teu contrasinal?

Etiquetas

Saltar as etiquetas

Subscríbete ás RSS

Estás en:

  • Inicio >
  • Blog >
  • Procedementos almacenados en SQL Server desde PHP

Procedementos almacenados en SQL Server desde PHP

16 Set 2011 por Luis

Comentarios: 10

PHP + SQL Server

Os procedementos almacenados (stored procedures) son pequenos programas que se almacenan e executan na base de datos. No caso de Microsoft SQL Server son grupos de ordes en Transact-SQL (T-SQL) que se executan seguindo un plan. A estes procedementos almacenados, coma se fosen funcións, pódenselles pasar parámetros para a súa execución (por valor ou por referencia) e poden devolver un valor numérico ou o resultado dunha consulta. Neste artigo veremos como se poden chamar estes procedementos almacenados desde PHP e como manexar os parámetros e valores devoltos.

Empezaremos por un exemplo simple de procedemento almacenado e veremos como se executaría desde PHP. O código do procedemento almacenado será este:

CREATE PROCEDURE usp_simple
	@cadea VARCHAR(10),
	@enteiro INT,
	@mensaxe VARCHAR(50) OUTPUT
AS
BEGIN
	SET NOCOUNT ON;

	SET @mensaxe = 'cadea: ' + @cadea + ', enteiro: ' + CAST(@enteiro AS Varchar);

	RETURN 50001
END

Como vemos é un código moi simple, que o único que fai é asignar un valor a @mensaxe e devolver 50001.

Agora, para executalo desde PHP:

$conn = mssql_connect('servidor', 'usuario', 'contrasinal');
mssql_select_db('base_datos', $conn);

$p_cadea = 'Probando';
$p_enteiro = 6;
$p_mensaxe = '';
$p_saida = 0;

$stmt = mssql_init('usp_simple', $conn);

mssql_bind($stmt, '@cadea', $p_cadea, SQLVARCHAR, false, false, 10);
mssql_bind($stmt, '@enteiro', $p_enteiro, SQLINT4);
mssql_bind($stmt, '@mensaxe', $p_mensaxe, SQLVARCHAR, true, false, 50);
mssql_bind($stmt, 'RETVAL', $p_saida, SQLINT4);

mssql_execute($stmt);
mssql_free_statement($stmt);

echo 'Mensaxe:: ', $p_mensaxe, "\r\n", 'Saída:: ', $p_saida;

mssql_close($conn);

Os exemplos aquí expostos están feitos o máis sinxelos posible e, polo tanto, non deben ser usados "tal cal", xa que habería que facer todo tipo de comprobacións de seguridade.

O que facemos no código é o seguinte:

  1. Conectamos ca base de datos
  2. Definimos os valores que lle pasaremos ó procedemento almacenado
  3. Iniciamos o procedemento almacenado
  4. Pasámoslle ó procedemento almacenado as variables necesarias mediante mssql_bind
  5. Executamos o procedemento almacenado e liberamos a memoria usada polo mesmo
  6. Mostramos o que o procedemento almacenado puxo no parámetro de saída @mensaxe e o valor que nos devolve

Neste caso, o que este código mostraría por pantalla sería:

Mensaxe:: cadea: Probando, enteiro: 6
Saída:: 50001

Como é evidente, o procedemento almacenado podería facer cousas moito máis útiles cos datos que se lle pasan (por exemplo introducilos na base de datos), non ter ningún parámetro de saída ou devolver o resultado dunha consulta. Para este último caso, veremos agora un exemplo.

Devolvendo resultados de consultas

O código que usaremos como exemplo de procedemento almacenado será:

CREATE PROCEDURE usp_normal
	@clase VARCHAR(2)
AS
BEGIN
	SET NOCOUNT ON;

	SELECT id, nome FROM alumnos WHERE clase=@clase;
END

O procedemento almacenado devolverá os datos dos alumnos da clase pedida. Para executalo desde PHP:

$conn = mssql_connect('servidor', 'usuario', 'contrasinal');
mssql_select_db('base_datos', $conn);

$stmt = mssql_init('usp_normal', $conn);

$clase = '2B';

mssql_bind($stmt, '@clase', $clase, SQLVARCHAR, false, false, 2);

$result = mssql_execute($stmt);

do
{
	while ($row = mssql_fetch_row($result))
	{
		echo $row[0],  ', ', $row[1], "\r\n";
	}
}
while (mssql_next_result($result) !== false);

mssql_free_result($result);
mssql_free_statement($stmt);

mssql_close($conn);

Este código pasaría por pantalla algo así:

1, Alejandro García
2, Manuel Pérez
3, Luis Fernández
...

Neste caso, $result é o conxunto de resultados da consulta feita no procedemento almacenado. Para poder ir pasando dunha fila á seguinte na consulta, hai que usar a función mssql_next_result, ata que esta devolva false. Para converter cada fila nun array, usamos as funcións habituais mssql_fetch_row, mssql_fetch_array, ...

Se o procedemento almacenado quixese devolver ademais do resultado da consulta un parámetro de saída ou un valor de devolución, estes estarían dispoñibles unicamente logo de executar mssql_next_result ata que esta devolva false.

Comentarios

10 comentarios. Comentar.

1. Bereess o 25 Nov 2011 ás 19:40:23

El 2do ejem. dice el siguiente error:

Fatal error: Only variables can be passed by reference

En la linea 7:mssql_bind($stmt, '@clase', '2B', SQLVARCHAR, false, false, 2);

2. Luis o 28 Nov 2011 ás 09:38:02

Bienvenido Bereess.

Tienes razón, el tercer parámetro de mssql_bind debe ser una variable porque se pasa por referencia, a pesar de que en la página de PHP los ejemplos los ponen así: http://es.php.net/manual/es/function.mssql-bind.php

Ya está cambiado el código. Gracias.

3. Cdwl o 08 Xuñ 2012 ás 19:51:05

grcias x el aporte...;)

4. xPapaChox o 09 Xuñ 2012 ás 18:00:01

Hola.

Muy bueno tu aporte.

5. Anónimo o 03 Abr 2014 ás 23:39:16

buen trabajo

6. Kam o 16 Xul 2014 ás 17:32:21

Hola tengo un procedimiento almacenado cuyo parametro de entrada es del tipo uniqueidentifier al hacer el mssql_bind($stmt, '@invoiceableid', $cuenta, SQLVARCHAR);

me arroja un error de sql indicando que no se puede colocar un valor caracter como uniqueidentifier

En este caso como hago entonces con el tipo de variable, cual utilizaria o no se si existe otra forma de poder hacer la ejecucion del procedimiento desde php con mssql

Gracias por cualquier informacion q me puedan dar

7. Anónimo o 29 Dec 2014 ás 16:44:49

Ese tipo de dato es nativo del membership de microsoft.

Sugiero que lo mandes desde el app web como varchar y dentro del store lo conviertas a uniqueidentifier.

8. proteus8 o 01 Abr 2015 ás 23:44:44

Hola a todos tengo una consulta espero me puedan ayudar, quiero ejecutar un procedimiento almacenado en una base de datos Sybase el que quiero ejecutar desde PHP, el código que estoy usando es el siguiente:

<?php

$qry=("Call sp_trendView 'collect', 'analog.AYS52G_01_____P.curval', 'value' , '03/15/15 00:00:00','03/15/15 23:00:00'");

$result=odbc_exec($conn,$qry);

while ($row = odbc_fetch_array($result)){

echo $row['timestamp'] ." ". $row['value'] .'<br>';

}

?>

si ejecuto el procedimiento directo en la base de datos con algún administrador este entrega resultados sin problemas.

pero si lo hago desde PHP me muestra el siguiente error:

Warning: odbc_exec() [function.odbc-exec]: SQL error: [INTERSOLV][ODBC SQL Server driver][SQL Server]Incorrect syntax near 'sp_trendView'. , SQL state 37000 in SQLExecDirect in C:\AppServ\www\prueba\datos_scada.php on line 29

Warning: odbc_fetch_array(): supplied argument is not a valid ODBC result resource in C:\AppServ\www\prueba\datos_scada.php on line 31

debo mencionar que me conecto a la base de datos por ODBC y la conexión funciona sin problemas.

Espero me puedan ayudar.

saludos

9. Ezequiel o 19 Xul 2015 ás 01:08:28

Hola amigo, ya tengo una base de datos hecha en Mysql y un triguers que ejecuta las consultas.. quisiera saber si me darias una mano con un ejemplo de un procedimiento que tome un valor y ya calcule un resultado de venta... tengo todo hecho en php maker y me falta saber como hacer para que cuando cargue el precio me muestre automaticamente el resultado del total de productos. Espero que hayas entendido mi duda y espero tu respuesta.. gracias..

11. wagner o 19 Set 2016 ás 18:04:14

muchas gracias por el aporte, genial el tutorial...

saludos desde colombia

Comentar

Comentar de forma anónima

Podes comentar poñendo calquera nome ou alcume, exceptuando os nomes de usuarios rexistrados. Máximo de 50 caracteres.

Comentar como usuario rexistrado

Rexistrarse. Esqueceches o teu contrasinal?