programing

Php가 최신 업데이트된 sql 프로시저 결과를 반환하지 않음

goodsources 2022. 9. 8. 22:51
반응형

Php가 최신 업데이트된 sql 프로시저 결과를 반환하지 않음

mariaDB, 코드 시그니터 php 사용

작업대에서 절차를 실행하면 올바른 결과가 나타납니다.낮은 이미지

그러나 php codeigniter를 사용하여 동일한 프로시저를 실행하면 다른 결과 세트가 반환됩니다.

array(1) {
[0]=>
array(1) {
    [0]=>
    array(2) {
        ["stuScore"]=> string(7) "44.0000"
        ["answerdQues"]=> string(2) "50"
    }
}
}

프로시저에서 쿼리...

SELECT sum(Score) as stuScore, count(distinct ta1.idTestQuestion) as answerdQues
            FROM (select ta0.*, @running_time := if(@running_student = idStudent, @running_time, 0) + ta0.TimeTaken, date_add(ta0.StartTime, INTERVAL @running_time SECOND) as running_time, @running_student := idStudent
                from (select tap.idStudent, ta.score, ta.idTestQuestion, tap.StartTime, ta.TimeTaken
                    from `testanswerpaper` tap
                    left join testanswer ta on ta.idTestAnswerPaper = tap.idTestAnswerPaper and (ta.Status = 'Flagged' || ta.Status = 'Answered')
                    where  tap.`idTestQuestionPaper` = TestQuestionPaperID
                    order by tap.idStudent, ta.SortOrder, ta.idTestAnswer
                ) ta0
                join (select @running_time := 0, @running_student) running
            ) ta1
            join student s on s.idStudent = ta1.idStudent
            join user u on s.idUser = u.idUser
            WHERE ta1.running_time <= now()
            group by ta1.idStudent
            order by stuScore desc, answerdQues DESC;

php 코드는

$this->readDB = $this->load->database('read', TRUE);
        $connectId = $this->readDB->conn_id ;
        $sql = "call GetLeaderBoardData($TestQuestionPaperID);";
        if (mysqli_multi_query($connectId,$sql))
        {
            do
            {
                // Store first result set
                if ($result=mysqli_store_result($connectId)) {

                        $resultArray[] = mysqli_fetch_all($result, MYSQLI_ASSOC);

                }
            } while (mysqli_next_result($connectId));

        } 
        var_dump($resultArray);

사용자 정의 변수가 세션 내내 값을 유지하므로 workbench에서 코드를 실행할 때 사용자 정의 변수의 값이 다를 수 있습니다.

이것을 제외하려면 , 를 리셋 합니다.@running_time그리고.@running_student값을 지정합니다.

set @running_time = null;
set @running_student = null;

SELECT sum(Score)...

이 코드를 시험하거나 사용하세요.$this->readDB->reconnect();매번 절차 충돌 직전에 작동합니다.

try {
            $this->readDB = $this->load->database('read', TRUE);
            $this->readDB->reconnect();
            $sql = "CALL GetLeaderBoardData(".$TestQuestionPaperID.")";
            $resultArray = $this->readDB->query($sql)->custom_result_object(); 
            $this->readDB->close();
        } catch (Exception $e) {
            echo $e->getMessage();
        }
        var_dump($resultArray);

가지고 있는 mysqli_fetch_all() 문에서 var_dump를 사용해 보십시오.어떤 물건이 반환되는지 알 수 있을 겁니다.

저장 프로시저에서 완전한 쿼리를 변수에 할당하고 SQL이 예상대로 실행되도록 인쇄합니다.

언급URL : https://stackoverflow.com/questions/58168082/php-not-returning-the-latest-updated-sql-procedure-result

반응형