【问题标题】:How to call a MySQL stored procedure from within PHP code?如何从 PHP 代码中调用 MySQL 存储过程?
【发布时间】:2011-04-27 09:00:18
【问题描述】:

我在 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 代码是什么?

【问题讨论】:

标签: php mysql stored-procedures mysqli user-defined-functions


【解决方案1】:

这是我使用 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();

【讨论】:

    【解决方案2】:

    我现在找到了使用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,以后会去掉
    【解决方案3】:

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

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

    【讨论】:

    • +1 因为它有效,但是 mysql_query 停止为所有以下选择语句工作。
    • 我假设你也可以像这样添加一个变量:$result = mysql_query('CALL getNodeChildren($a)');
    【解决方案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”。
    猜你喜欢
    • 1970-01-01
    • 2014-09-07
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多