如何从 PHP 代码中调用 MySQL 存储过程?

Posted

技术标签:

【中文标题】如何从 PHP 代码中调用 MySQL 存储过程?【英文标题】:How to call a MySQL stored procedure from within PHP code? 【发布时间】:2010-10-19 09:00:47 【问题描述】:

我在 mysql 中创建了存储过程,并希望 php 调用该存储过程。最好的方法是什么?

-MySQL客户端版本:4.1.11 -MySQL 服务器版本:5.0.45

这是我的存储过程:

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 ;

调用过程 getTreeNodeName 的 PHP 代码是什么?

【问题讨论】:

创建 MySQL 存储过程的演练:***.com/a/20433501/445131 【参考方案1】:

我现在找到了使用mysqli 代替mysql 的解决方案。

<?php 

// enable error reporting
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
//connect to database
$connection = mysqli_connect("hostname", "user", "password", "db", "port");

//run the store proc
$result = mysqli_query($connection, "CALL StoreProcName");

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

我发现很多人在使用mysql_connect, mysql_query and mysql_fetch_array时似乎有问题。

【讨论】:

很多人犯错是因为他们懒得去查是if ($connection instanceof mysqli) ,和if ($arr[0]=='forget checking') ;一样,没有if (is_array($arr) &amp;&amp; isset($arr[0]) &amp;&amp; $arr[0]=='forget_checking') mysqli_connect 在最后没有 or die 语句对我不起作用: $connection = mysqli_connect("hostname", "user", "password", "db", "port")or die ("错误" .mysqli_error($connection)); mysql扩展名是deprecated,以后会去掉【参考方案2】:

您可以使用以下语法调用存储过程:

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

【讨论】:

+1 因为它有效,但是 mysql_query 停止为所有以下选择语句工作。 我假设你也可以像这样添加一个变量:$result = mysql_query('CALL getNodeChildren($a)');【参考方案3】:

这是我使用 prepared statements 的解决方案,存储过程返回多行而不是一个值。

<?php

require 'config.php';
header('Content-type:application/json');
$connection->set_charset('utf8');

$mIds = $_GET['ids'];

$stmt = $connection->prepare("CALL sp_takes_string_returns_table(?)");
$stmt->bind_param("s", $mIds);

$stmt->execute();

$result = $stmt->get_result();
$response = $result->fetch_all(MYSQLI_ASSOC);
echo json_encode($response);

$stmt->close();
$connection->close();

【讨论】:

【参考方案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;
    

【讨论】:

当存储过程只返回一个值时,它适用于第一个问题,但多个结果的代码不起作用。有什么想法吗? @user480259,我修改了我给你的 sn-p 以包括错误检查。试试看,看看你会得到什么。 它说:“1305:FUNCTION getNodeChildren 不存在”。我检查了数据库,它确实存在,当我运行它时也得到了结果。但它是一个过程而不是一个函数。这有关系吗? 我将代码从“SELECT”更改为“CALL”,然后出现此错误:“1312: PROCEDURE proc-name can't return a result set in the given context”。

以上是关于如何从 PHP 代码中调用 MySQL 存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHP 代码中调用 MySQL 存储过程?

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀

PHP MySQL - 为啥存储过程调用在 PHP 代码中意外结束

在 PHP 上调用 MySQL 存储过程

MYSQL中存储过程的创建,调用及语法

如何从 PHP 在 mySQL 中插入/创建存储过程?