2010-10-19 7 views
28

Ich habe eine Prozedur gespeichert, die ich in MySQL erstellt habe und möchte, dass PHP diese gespeicherte Prozedur aufruft. Was ist der beste Weg, dies zu tun?Wie kann ich eine gespeicherte MySQL-Prozedur in PHP-Code aufrufen?

-MySQL Client-Version: 4.1.11
-MySQL Server-Version: 5.0.45

Hier ist meine gespeicherten Prozedur:

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 ; 

Was ist die PHP-Code der Prozedur getTreeNodeName aufzurufen?

+0

Lösungsweg bieten: http://stackoverflow.com/a/20433501/445131 –

Antwort

40

Ich fand jetzt Lösung von mysqli statt mysql verwenden.

<?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]; 
    } 

?> 

fand ich, dass viele Leute scheinen ein Problem bei der Verwendung mysql_connect, mysql_query and mysql_fetch_array zu haben.

+1

viele Leute machen Fehler, weil sie sich Mühe geben zu überprüfen ist 'if ($ connection instanceof mysqli) {}', selbe wie 'if ($ arr [0] == 'forget checking') {};' ohne 'if (is_array ($ arr) && isset ($ arr [0]) && $ arr [0] == 'forget_checking') {} ' – ajreal

+0

mysqli_connect würde bei mir nicht funktionieren ohne eine oder die Anweisung am Ende: $ connection = mysqli_connect ("hostname", "user", "password", "db", "port") oder sterben ("Error". mysqli_error ($ verbindung)); – Praesagus

+0

Die mysql-Erweiterung ist "deprecated" und wird in Zukunft entfernt werden –

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

Dank Petah, es funktioniert . – Pheap

+0

Es funktioniert für die erste Frage, wenn die Speicherprozedur nur einen Wert zurückgibt, aber der Code für mehrere Ergebnisse nicht funktioniert. Irgendeine Idee? – Pheap

+0

@ user480259, Ich habe das Snippet modifiziert, das ich Ihnen gab, um die Fehlerüberprüfung einzuschließen. Probieren Sie das aus und sehen Sie, was Sie bekommen. – Petah

14

Sie können eine gespeicherte Prozedur rufen Sie die folgende Syntax:

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

+1, weil es funktioniert hat, aber mysql_query funktioniert nicht mehr für alle folgenden Select-Anweisungen. – Praesagus

+0

Ich nehme an, dass Sie auch eine Variable wie folgt hinzufügen können: $ result = mysql_query ('CALL getNodeChildren ($ a)'); –

-2

Ich habe Lösung von 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

Code zeigen Folgen, wie Speicher anrufen Verfahren mit Beispiel

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