2010-10-19 9 views
28

Ho memorizzato la procedura che ho creato in MySQL e voglio che PHP chiami quella stored procedure. Qual è il modo migliore per farlo?Come chiamare una procedura memorizzata MySQL da un codice PHP?

-MySQL versione client: 4.1.11
-MySQL versione server: 5.0.45

Ecco la mia procedura immagazzinata:

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 ; 

Qual è il codice PHP di avviare la procedura getTreeNodeName?

+0

Procedura dettagliata sulla creazione di una stored procedure MySQL: http://stackoverflow.com/a/20433501/445131 –

risposta

40

ora trovato soluzione utilizzando mysqli invece di 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]; 
    } 

?> 

ho scoperto che molte persone sembrano avere un problema con l'utilizzo mysql_connect, mysql_query and mysql_fetch_array.

+1

molte persone commettono errori perché non si preoccupano di controllare è 'if ($ connection instanceof mysqli) {}', come 'if ($ arr [0] == 'forget checking') {};' senza avere 'if (is_array ($ arr) && isset ($ arr [0]) && $ arr [0] == 'forget_checking') {} ' – ajreal

+0

mysqli_connect non funzionerebbe per me senza un'istruzione o die alla fine: $ connection = mysqli_connect ("hostname", "user", "password", "db", "port") o die ("Errore". mysqli_error ($ connection)); – Praesagus

+0

L'estensione mysql è 'deprecated' e verrà rimossa in 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

Grazie Petah, funziona . – Pheap

+0

Funziona per la prima domanda quando la procedura di archiviazione restituisce solo un valore, ma il codice per i risultati multipli non funziona. Qualche idea? – Pheap

+0

@ user480259, Ive ha modificato lo snippet che ho fornito per includere la verifica degli errori. Prova questo e guarda cosa ottieni. – Petah

14

è possibile chiamare una stored procedure utilizzando la seguente sintassi:?

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

+1 perché ha funzionato, tuttavia mysql_query ha smesso di funzionare per tutte le seguenti istruzioni select. – Praesagus

+0

Suppongo che tu possa anche aggiungere una variabile come questa: $ result = mysql_query ('CALL getNodeChildren ($ a)'); –

-2

ho ottenuto la soluzione da 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

codice seguente mostrano, come chiamare negozio procedura con esempio

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