首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP无法从mysqli语句中读取第二个结果集

PHP无法从mysqli语句中读取第二个结果集
EN

Stack Overflow用户
提问于 2018-06-01 14:53:32
回答 1查看 107关注 0票数 0

我正在尝试使用PHP从存储过程中读取两个结果集。第一个结果集很好,但是虽然第二个结果集似乎存在,但我无法强迫php处理它。相反,当尝试绑定时,它会使用旧板栗失败。

"PHP警告:mysqli_stmt_bind_result():绑定变量的数量与预准备语句中的字段数量不匹配“。

代码语言:javascript
复制
public function GetSession($sessionId) {
        $conn = mysqli_connect(DbConstants::$servername, DbConstants::$username, DbConstants::$password, DbConstants::$dbname);
        if ($conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
        }

        $call = mysqli_prepare($conn, 'CALL Sp_Session_GetById(?)');
        mysqli_stmt_bind_param($call, 'i', $sessionId);

        mysqli_stmt_execute($call);

        mysqli_stmt_bind_result(
            $call,
            $id,
            $startTime,
            $duration,
            $description,
            $instructorId,
            $aircraftId,
            $display,
            $bookable,
            $cancelled
        );

        mysqli_stmt_fetch($call);
        $session = new Session($id, $startTime, $duration, $description, $instructorId, $aircraftId, $display, $bookable, $cancelled, []);

        if(mysqli_stmt_more_results($call)) { /* This is true */
            mysqli_stmt_next_result($call);
            /* This is where it goes wrong */
            mysqli_stmt_bind_result(
                $call,
                $sessionTypeId,
                $spaces,
                $enabled
            );
        }
}

如果我在mysql工作台中执行存储过程,我会得到两个如下所示的结果选项卡:

代码语言:javascript
复制
# id, startTime, duration, description, instructor_id, aircraft_id, display, bookable, cancelled
'38', '2018-05-19 09:00:00', '180', NULL, '18', '2', '1', '1', '0'

# sessiontype_id, spaces, enabled
'1', '3', '1'
'2', '3', '1'

存储过程的创建方式如下:

代码语言:javascript
复制
DELIMITER //

CREATE PROCEDURE Sp_Session_GetById (IN
    _id int
)
BEGIN
SELECT 
    s.id,
    s.startTime,
    s.duration,
    s.description,
    s.instructor_id,
    s.aircraft_id,
    s.display,
    s.bookable,
    s.cancelled
FROM session s
WHERE s.id = _id
AND s.cancelled = false
AND s.display = true;

SELECT sst.sessiontype_id, sst.spaces, sst.enabled
FROM session_sessiontype as sst
WHERE sst.session_id = _id;

END //

DELIMITER ;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 02:51:10

使用Barmar提出的使用mysqli_multi_query()的建议,我已经得到了多个结果集,我将在下面发布。但是,它没有使用mysqli_stmt_next_result(),所以如果有人使用mysqli_stmt_next_result()提供了一个有效的解决方案,我会将他们的标记为可接受的解决方案。

代码语言:javascript
复制
        public function GetSession($sessionId) {
        $conn = mysqli_connect(DbConstants::$servername, DbConstants::$username, DbConstants::$password, DbConstants::$dbname);
        if ($conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
        }

        $query = 'CALL Sp_Session_GetById(' . $sessionId . ');';
        mysqli_multi_query($conn, $query);

        $sessionResult = mysqli_store_result($conn);
        $sessionRow = mysqli_fetch_row($sessionResult);

        $session = new Session(
            $sessionRow[0],
            $sessionRow[1],
            $sessionRow[2],
            $sessionRow[3],
            $sessionRow[4],
            $sessionRow[5],
            $sessionRow[6],
            $sessionRow[7],
            $sessionRow[8],
            []);

        mysqli_free_result($sessionResult);

        mysqli_next_result($conn);

        $sessionTypeResult = mysqli_store_result($conn);
        while($sessionTypeRow = mysqli_fetch_row($sessionTypeResult)) {
            array_push($session->sessionTypesForSession, $sessionTypeRow[0]);
        }

        $conn->close();

        return $session;

    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50637685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档