Php не возвращает последний обновленный результат процедуры sql - PullRequest
5 голосов
/ 30 сентября 2019

Я использую mariaDB, codeigniter php

, когда выполняется процедура в рабочей среде, она показывает правильный результат. bewlow image

Но когда я запускаю ту же процедуру, используя 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);

Ответы [ 4 ]

6 голосов
/ 03 октября 2019

Различие может быть связано с тем, что пользовательские переменные могут иметь разные значения при выполнении кода из рабочей среды vs codeigniter, поскольку пользовательские переменные сохраняют свои значения в течение сеанса.

Комуисключите это, сбросьте значения @running_time и @running_student в начале процедуры.

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

SELECT sum(Score)...
0 голосов
/ 09 октября 2019

Попробуйте использовать var_dump для оператора mysqli_fetch_all (), который у вас есть. Это даст вам представление о том, что возвращается.

В вашей хранимой процедуре присвойте полный запрос переменной и выведите его, чтобы убедиться, что sql - это то, что вы ожидаете.

0 голосов
/ 09 октября 2019

Похоже, вы пытаетесь сгенерировать промежуточную сумму, используя пользовательские переменные. DONT . Просто слишком много ошибок. Порядок, в котором оценивается SELECT @x := ...; @x + 1 AS foo, не гарантируется, и ORDER BY внутри подзапроса можно просто игнорировать.

Если вы используете MariaDb 10.2 или более позднюю версию, тогда используйте оконные функции. Без примера ввода и ожидаемого вывода, поэтому я могу предоставить только приблизительную схему внутреннего запроса для расчета промежуточной суммы :

select tap.idStudent, tap.StartTime, ta.idTestQuestion, ta.score, ta.TimeTaken
     , date_add(tap.StartTime, INTERVAL sum(ta.TimeTaken) over (partition by tap.idStudent order by ta.SortOrder, ta.idTestAnswer) SECOND) as running_time
from `testanswerpaper` tap
left join testanswer ta on ta.idTestAnswerPaper = tap.idTestAnswerPaper and (ta.Status = 'Flagged' || ta.Status = 'Answered')
where tap.`idTestQuestionPaper` = TestQuestionPaperID
0 голосов
/ 04 октября 2019

попробуйте этот код или используйте функцию $this->readDB->reconnect(); непосредственно перед процедурой coll каждый раз.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...