joomla-php mysql не обновляет запись данными предыдущего запроса - PullRequest
0 голосов
/ 21 марта 2012

Я считаю правильное поле ответов таблицы и сохраняю вычисленное значение в другой таблице.Для этого я использую два запроса, первый - запрос количества, я получаю значение, используя loadResult ().После этого я обновляю другую таблицу с этим значением и датой / временем.Проблема в том, что в некоторых случаях вычисленное значение не сохраняется, только дата / время.

запросы выглядят примерно так:

        $sql = 'SELECT count(answer)

                FROM #_questionsTable
                WHERE 

                    answer = 1

                    AND

                    testId = '.$examId;

        $db->setQuery($sql);

        $rightAnsCount = $db->loadResult();

        $sql = 'UPDATE #__testsTable

                SET finish = "'.date('Y-m-d H:i:s').'", rightAns='.$rightAnsCount.'

                WHERE testId = '.$examId;

        $db->setQuery($sql);

        $db->Query();

answer = 1 означает, что вопрос былответил нормально.

Я думаю, что когда второй запрос выполняется, первый еще не завершен, но везде, где я читаю, говорится, что он ждет, что первый запрос завершен, чтобы перейти ко второму, и я неНе знаю, как заставить второй запрос ждать завершения первого.

Любая помощь будет принята с благодарностью.Спасибо!

Ответы [ 3 ]

2 голосов
/ 21 марта 2012
  1. запрос PHP MySQL является синхронным, т.е. он завершается перед возвратом - класс базы данных Joomla! не реализует какие-либо функции асинхронного или обратного вызова.

  2. Пока вам не хватает ';' это не объясняло бы его работоспособность.

  3. Как определяется столбец rightAns - например, что происходит, когда ваш $rightAnsCount равен 0

  4. Включите режим отладки Joomla! И проверьте SQL, сгенерированный в разделе профиля, он выглядит примерно так

например.

Profile Information

Application afterLoad: 0.002 seconds, 1.20 MB
Application afterInitialise: 0.078 seconds, 6.59 MB
Application afterRoute: 0.079 seconds, 6.70 MB
Application afterDispatch: 0.213 seconds, 7.87 MB
Application afterRender: 0.220 seconds, 8.07 MB
Memory Usage

8511696
8 queries logged.

SELECT * 
      FROM jos_session 
      WHERE session_id = '5cs53hoh2hqi9ccq69brditmm7'
DELETE 
      FROM jos_session 
      WHERE ( TIME < '1332089642' )
etc...
0 голосов
/ 21 марта 2012

Я почти уверен, что вместо этого вы можете сделать это в одном запросе:

    $sql = 'UPDATE #__testsTable

            SET finish = NOW()
            , rightAns = (
               SELECT count(answer)
                 FROM #_questionsTable
                 WHERE 
                    answer = 1
                    AND
                    testId = '.$examId.'
            )

            WHERE testId = '.$examId;

    $db->setQuery($sql);
    $db->Query();

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

0 голосов
/ 21 марта 2012

вам может понадобиться добавить точку с запятой в конце ваших запросов sql

...testId = '.$examID.';';

ах, кое-что упомянутое cppl - ключ, я думаю. Возможно, вам придется учитывать нулевые значения из вашего первого запроса.

Изменение этой строки:

$rightAnsCount = $db->loadResult();

Чтобы это могло иметь значение:

$rightAnsCount = ($db->loadResult()) ? $db->loadResult() : 0;

В основном установка на 0, если нет результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...