2010-10-19 23 views
28

He almacenado el procedimiento que he creado en MySQL y quiero que PHP llame a ese procedimiento almacenado. ¿Cuál es la mejor manera de hacer esto?¿Cómo llamar a un procedimiento almacenado de MySQL desde el código PHP?

-MySQL versión del cliente: 4.1.11
-MySQL Server versión: 5.0.45

Aquí está mi procedimiento almacenado:

DELIMITER $$ 

DROP FUNCTION IF EXISTS `getNodeName` $$ 
CREATE FUNCTION `getTreeNodeName`(`nid` int) RETURNS varchar(25) CHARSET utf8 
BEGIN 
DECLARE nodeName varchar(25); 
SELECT name into nodeName FROM tree 
WHERE id = nid; 
RETURN nodeName; 
END $$ 

DELIMITER ; 

¿Cuál es el código PHP para invocar el procedimiento getTreeNodeName?

+0

Tutorial sobre la creación de un procedimiento almacenado de MySQL: http://stackoverflow.com/a/20433501/445131 –

Respuesta

40

ahora he encontrado una solución mediante el uso de mysqli en lugar de mysql.

<?php 

    //connect to database 
    $connection = mysqli_connect("hostname", "user", "password", "db", "port"); 

    //run the store proc 
    $result = mysqli_query($connection, 
    "CALL StoreProcName") or die("Query fail: " . mysqli_error()); 

    //loop the result set 
    while ($row = mysqli_fetch_array($result)){ 
     echo $row[0] . " - " . + $row[1]; 
    } 

?> 

He encontrado que muchas personas parecen tener un problema con el uso mysql_connect, mysql_query and mysql_fetch_array.

+1

muchas personas se equivocan porque no se molestan en comprobar es 'if ($ connection instanceof mysqli) {}', lo mismo que 'if ($ arr [0] == 'forget checking') {};' sin tener 'if (is_array ($ arr) && isset ($ arr [0]) && $ arr [0] == 'forget_checking') {} ' – ajreal

+0

mysqli_connect no funcionaría para mí sin una sentencia o die al final: $ connection = mysqli_connect ("nombre de host", "usuario", "contraseña", "db", "puerto") o morir ("Error". mysqli_error ($ connection)); – Praesagus

+0

La extensión mysql está 'en desuso' y se eliminará en el futuro –

4
<?php 
    $res = mysql_query('SELECT getTreeNodeName(1) AS result'); 
    if ($res === false) { 
     echo mysql_errno().': '.mysql_error(); 
    } 
    while ($obj = mysql_fetch_object($res)) { 
     echo $obj->result; 
    } 
+0

Gracias Petah, funciona . – Pheap

+0

Funciona para la primera pregunta cuando el procedimiento de la tienda devuelve solo un valor, pero el código para los resultados múltiples no funciona. ¿Alguna idea? – Pheap

+0

@ user480259, he modificado el fragmento que le di para incluir la comprobación de errores. Pruébalo y mira lo que obtienes. – Petah

14

puede llamar a un procedimiento almacenado utilizando la siguiente sintaxis:?

$result = mysql_query('CALL getNodeChildren(2)'); 
+1

+1 porque funcionó, sin embargo, mysql_query dejó de funcionar para todas las siguientes instrucciones de selección. – Praesagus

+0

Supongo que también puede agregar una variable como esta: $ result = mysql_query ('CALL getNodeChildren ($ a)'); –

-2

me dieron solución a partir de php.net

<?php 
$mysqli = new mysqli("localhost", "root", "", "joomla2.5"); 
if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 

/*if (!$mysqli->query("DROP TABLE IF EXISTS test") || 
    !$mysqli->query("CREATE TABLE test(id INT)") || 
    !$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)")) { 
    echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error; 
} 

if (!$mysqli->query("DROP PROCEDURE IF EXISTS p") || 
    !$mysqli->query('CREATE PROCEDURE p() READS SQL DATA BEGIN SELECT id FROM test; SELECT id + 1 FROM test; END;')) { 
    echo "Stored procedure creation failed: (" . $mysqli->errno . ") " . $mysqli->error; 
} 

if (!$mysqli->multi_query("CALL p()")) { 
    echo "CALL failed: (" . $mysqli->errno . ") " . $mysqli->error; 
} 

do { 
    if ($res = $mysqli->store_result()) { 
     printf("---\n"); 
     var_dump($res->fetch_all()); 
     $res->free(); 
    } else { 
     if ($mysqli->errno) { 
      echo "Store failed: (" . $mysqli->errno . ") " . $mysqli->error; 
     } 
    } 
} while ($mysqli->more_results() && $mysqli->next_result()); 

>

-1

Después de mostrar el código, cómo llamar a la tienda procedimiento con el ejemplo

$con = mysql_connect('localhost','root',''); 
mysql_select_db('books'); 
//Call the proc() procedure follow 
$result= mysql_query("CALL proc();") or die(mysql_error()); 

while($row = mysql_fetch_row($result)) 
{ 
for($i=0;$i<=6;$i++) 
{ 
echo $row[$i]."<br>"; 
} 
} 
mysql_close($con); 
Cuestiones relacionadas