PHP 和 Mysqli 以及存储过程

标签 php mysql stored-procedures mysqli

我有以下函数,我希望它从 MySQL 数据库检索匹配的记录:

public function GetUserData($conn){
        $username = $_SESSION['username'];
        $stmt = $conn->prepare("CALL GetUserData(?)") or die("Query fail: " . mysqli_error($conn));
        $stmt->bind_param("s",$username);
        $stmt->execute() or die("Query fail: " . mysqli_error($conn));
        while($row = $stmt->fetch()){
            print_r($row);
        }
        exit;
    }

GetUserData 是一个存储过程,如下所示:

CREATE DEFINER=`root`@`localhost` PROCEDURE `GetUserData`(IN `StoredUsername` VARCHAR(255))
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
select firstname from users where username=StoredUsername;
END

我的问题是 print_r($row) 只打印“1” 如果匹配行是两行,则打印“11”

我似乎无法弄清楚我使用/做错了什么。

预先感谢您的帮助。

最佳答案

  • mysqli_stmt_fetch() 的行为与您的想法不同
  • 用户名应通过参数传递
  • 虽然连接应该是一个类变量
  • 获得结果后,您必须移至过程返回的其他结果,以便能够运行其他查询。

    public function GetUserData($username){
        $stmt = $this->conn->prepare("CALL GetUserData(?)");
        $stmt->bind_param("s",$username);
        $stmt->execute();
        $data = $stmt->get_result()->fetch_all();
        $this->conn->next_result(); 
        return $data;
    }
    

此外,不要手动检查每个数据库命令的结果,而是告诉 mysqli 自动抛出错误。在 mysqli_connect 之前添加此行,然后永远忘记所有这些丑陋的或死:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

关于PHP 和 Mysqli 以及存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32682913/

相关文章:

php - Youtube API v3-检索 channel 名称

javascript - 我想将数据从 window.prompt 发送到我的服务器,但可能缺少某些东西 (javascript+php)

php artisan 迁移 : Class Schema not found

Php simplexml 循环将简单元素放入数组中。我该如何摆脱它?

javascript - 替换/显示从 MYSQL 到 PHP 的新行

php - 在 MySQL 中将大约 100 个值从一个表存档到另一个表的最佳方法?

mysql - 为每个数据库或每个表设置 mysql auto_increment_offset 和 auto_increment_increment?

sql-server - 有没有办法在每个 SSIS 包之前和之后启动存储过程?

sql-server - 编写 sql 存储过程的最佳实践是什么

sql - 在SQL Server 2008中,我应该如何将数据从一个数据库复制到另一个数据库?