Llamar Store Procedure en MYSQL desde PHP

Bueno de hace tiempo atras tuve esta inquietud es algo básico para empezar, antes debo dar gracias a Razo Duke12
que anteriormete ya se habia encaminado con esto de como acceder a store procedures en mysql desde php, cito el post,Mysqli – Mysql – PHP – Sto
red Procedures. en lo particular la idea era acceder sin usar Mysqli y aprovechar las bondades de ADODB(como capa de abstracción de datos).Gracias a Duke12 que me brindo su ayuda. Luego de esta corta introducción describimos lo hasta ahora logrado.

1. descargar ADODB copiar la carpeta dentro el direcctorio que contiene nuestro proyeto

para los ubunteros : ~$ sudo mv adodb.xxx /opt/lampp/htdocs/poo_php (este path es por que configure php,apache,mysql con XAMMP en este enlace se detalla su configuración en ubuntu ).

2. Creamos la base de datos ejemplo en mysql y dentro de ella la tabla EMPLEADOS y luego el store procedure

– Estructura de tabla para la tabla `empleados`

CREATE TABLE `empleados` (

`id_empleado` int(5) NOT NULL auto_increment,

`nombre` varchar(200) collate latin1_general_ci NOT NULL,

`direccion` varchar(200) collate latin1_general_ci NOT NULL,

`edad` int(5) NOT NULL,

`email` varchar(200) collate latin1_general_ci NOT NULL,

PRIMARY KEY (`id_empleado`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=4 ;

– Volcar la base de datos para la tabla `empleados`

INSERT INTO `empleados` VALUES (1, ‘Isabel’, ‘tucuman 565′, 2, ‘isabel_vr@hotmail.com’);

INSERT INTO `empleados` VALUES (2, ‘Olga’, ‘tucuman 565′, 28, ‘olgars_2@hotmail.com’);

INSERT INTO `empleados` VALUES (3, ‘Kathy’, ‘tucuman 565′, 7, ‘kathya@hotmail.com’);

INSERT INTO `empleados` VALUES (4, ‘Gilmer’, ‘tucuman 565′, 30, ‘gilmerv@gmail.com’);

– ——————————————————–

creamos el store procedure PRO_LEE_EMPLEADOS()

DELIMITER $$

DROP PROCEDURE IF EXISTS `ejemplo`.`PRO_LEE_EMPLEADOS`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `PRO_LEE_EMPLEADOS`()
BEGIN
    select * from empleados;
    END$$

DELIMITER ;

3. creamos la clase para la conexión (class BaseDatos):cls_conexionDB.php

<?php

include(‘adodb/adodb.inc.php’);
class BaseDatos
{
var $row;

var $conn;
var $dbdriver;
var $servidor;
var $usuario;
var $contraseña;
var $database;
var $DB;

function baseDatos(){
$this->dbdriver=’mysql’;

$this->servidor = “localhost”;
$this->usuario = “root”;
$this->pass = “”;
$this->database= “ejemplo”;
$this->conn = $this->conectar()

;

}

function conectar(){

$dsn = “$this->dbdriver://$this->usuario:$this->pass@$this->servidor/$this->database?clientflags=65536″;
$this->DB = NewADOConnection($dsn);
if ( !$this->DB ) die(“No se establecio la conexion – $dsn”);

$this->DB->SetFetchMode(ADODB_FETCH_ASSOC);
return $this->DB;

}
function consulta($sql1)
{

$rs = $this->conn->Execute($sql1);/*ejecutamos el query*/

return $rs;

}

function Execute($query=’select now()’){
$this->row = $this->DB->Execute($query) or die ($this->DB->ErrorMsg());
}
function FetchAll($query){

$this->Execute($query);
while(!$this->row->EOF){
$temp[] = $this->row->fields;
$this->row->MoveNext();

$this->bbdd_desc();

}
return $temp;
}

function resultado($rs)
{
if ($rs)
while ($row = $rs->GetRows()) /*armamos el arreglo con los datos obtenidos de la consulta*/
{
return $row;
}
}

function numeroFilas($rs)
{
$cant = $rs->RecordCount();
return $cant;
}

function numeroColumnas

($rs)
{

$nuncolum=$rs->FieldCount();
return $nuncolum;
}

function nombreCampo($table)
{

return $this->conn->MetaColumnNames($table);
}

public function bbdd_desc()
{
return $this->DB->Close();

}

}

?>

4. por último creamos el script para probar nuestra clase test_conexionDB.php

<?
include ‘cls_conexionDB.php’; //importo la clase
$b = new BaseDato

s();

$sql1 = ‘SELECT * FR

OM empleados’;
echo $sql1;

$r = $b->consulta($sql1);

$canti= $b->nu

meroFilas($r);
$result= $b->resultado($r);
$tabla=’empleados’;
$nombrecampos= $b->nombreCampo($tabla);

$cantcol=$b->numeroColumnas($r);
echo “<p><b>RESUL

TADO ANTES DE USAR STORE PROCEDURE<b></P>”;
echo “<table border=0 cellspacing=2 cellpadding=2 style=’border:1px solid red; background-color:transparent’>”;
echo “<tr style=’color:#B5360B’ >”;
foreach ($nombreca

mpos as $valor){
print “<td><b>”. strtoupper($valor) . “</b></td>”;
}

echo “</tr>”;
foreach ($result as $valor){
echo “<tr>”;
print “<td>”. $valo

r['id_empleado'] . “</td>”;
print “<td>”. $valor['nombre'] . “</td>”;
print “<td>”. $valor['direccion'] . “</td>”;
print “<td>”. $valor['edad'] . “</td>”;
print “<td>”. $

valor['email'] . “</td>”;
echo “</tr>”;

}
echo “</table><br>”;

$SQL=”CALL PRO_LEE_EMPLEADOS()”;

echo $SQL;

$rs=$b->FetchAll($SQL);

echo “<p><b>RESULTADO USANDO STORE PROCEDURE</b></P>”;

echo “<table border=

0 cellspacing=2 cellpadding=2 style=’border:1px solid blue; background-color:transparent’><br>”;
?>
<tr align=”center” style=’color:blue’>
<td><b>ID EMPLEADO</b></td>
<td><b>NOMBRE <

/b></td>
<td><b>DIRECCION </b></td>
<td ><b>EDAD </b></td>
<td><b>EMAIL </b

></td>
</tr>
<?
foreach ($rs as $valor_sp){
echo “<tr >”;

print “<td>”.$valor_sp['id_empleado'] . “</td>”;
print “<td>”. $valor_sp['nombre'] . “</td>”;
print “<td>”. $valor

_sp['direccion'] . “</td>”;
print “<td>”. $valor_sp['edad'] . “</td>”;
print “<td>”. $valor_sp['email'] . “</td>”;

echo “</tr>”;

}

echo “</table>”;

echo “MAS CONSULTAS”

$consultaAdd1 = new BaseDatos();

$SQL=”CALL PRO_LEE_EMPLEADOS()”;
$rs1=$consultaAdd1->FetchAll($SQL);

echo “<pre>”;
print_r($rs1);
echo “<pre><br/>”;

$consultaAdd2 = new BaseDatos();

$SQL=”CALL PRO_LEE_EMPLEADOS()”;
$rs2=$consultaAdd2->FetchAll($SQL);

echo “<pre>”;
print_r($rs2);
echo “<pre><br/>”;

?>

capturas de pantalla ;

tabla_empleados2.pngllamada-a-sp.pngresultado.png

7 comentarios por mucho »

  1. 1

    joseph escribió,

    cuando ejecuto un procedimiento que me devuelve valores y despues esjecuto otro procedimiento sale el sigueinte error:

    Commands out of sync; you can’t run this command now

    cual seria la solucion

  2. 2

    Ricardo Núñez escribió,

    Hola, me arroja el siguiente error al probar con la llamada al procedimiento almacenado:
    Invalid argument supplied for foreach()

    ¿Qué será?

  3. 3

    leotrux escribió,

    verifica que se este llamando correctamente al store procedure luego haces un var_dump() al resultado de la consulta

  4. 4

    claudio escribió,

    hola, veo que tienes unos screenshot , mi duda es que interfas utilisastes para mysql?,

    gracias

  5. 5

    leotrux escribió,

    Con wine logré instalar un editor para la administracion de Mysql llamado SQLYog

  6. 6

    Pepe Luna escribió,

    exactamente tienes que usar :

    $resultado = mysqli_query($this->conexion, $sqlQuery)
    or die(“Error : “.mysqli_error($this->conexion));

    para ejecutar un procedimiento… pero el PHP tiene un error!!!
    Cuando trates de ejecutar un segundo procedimiento en una pagina te dará el error:

    Commands out of sync; you can’t run this command now

    Error al que no he encotrado solución, hasta el momento.

  7. 7

    leotrux escribió,

    Bueno en el ejemplo no estoy usando mysqli. pero también me tope con el mismo error hice unas modificaciones al script , no se si te sirva pero por el momento este es la solución que encontré, haciendo las modificaciones, por cada consulta crear el objeto conexión
    siempre y cuando estes usando el escript de ejemplo:
    $consultaAdd1 = new BaseDatos();

    $SQL="CALL PRO_LEE_EMPLEADOS()";
    $rs1=$consultaAdd1->FetchAll($SQL);

    echo "";
    print_r($rs1);
    echo "";

    $consultaAdd2 = new BaseDatos();

    $SQL="CALL PRO_LEE_EMPLEADOS()";
    $rs2=$consultaAdd2->FetchAll($SQL);

    echo "";
    print_r($rs2);
    echo "";


Comentario RSS · URI para TrackBack.

Diga sus palabras