Проблема запроса SELECT к базе данных - PullRequest
2 голосов
/ 11 сентября 2011

Я новичок в базе данных, недавно я столкнулся с очень странной проблемой:

  1. Я создаю базу данных в качестве сервера списка лидеров для своей игры, в которой хранятся имена и оценки игроков. Я создал php scipt для запроса базы данных, и игра откроет php url с аргументами GET.

  2. Моя функция отправки оценки работает отлично. Я использую phpadmin для проверки. Каждый раз, когда я отправляю, он будет корректно обновлять базу данных.

  3. Проблема в получении таблицы лидеров, моя игра будет получать таблицу лидеров каждые 10 секунд. Это удается каждый раз. Но результаты, которые он получает, не всегда последние записи в базе данных, все предыдущие записи. И через несколько часов он может получить более новые данные.

Ниже приведены мои проблемы: 1 Я не включил «commit» в свой php скрипт для отправки результатов. Так что я вручную выполняю коммит, но игра все еще не может получить самые последние данные.

  1. Я пытаюсь вручную распечатать данные в веб-браузере, введя php-адрес с аргументами GET. Показывает предыдущие данные так же, как в моей игре. Так что проблема не в игре. Я также вручную ввожу команды sql в phpadmin, он вернет последние данные. Так что я уверяю, что проблема с моим PHP?

php скрипт:

$query = "SELECT * FROM `space_scores` ORDER by `score` DESC";
    $result = mysql_query($query) or die('Query failed: ' . mysql_error());

    $num_results = mysql_num_rows($result); 


    for($i = 0; ($i < $lines)&&($i<$num_results); $i++)
    {
         $row = mysql_fetch_array($result);
         echo $i+1 . "," . $row['name'] . "," . $row['score'] . "|";
    }

Ответы [ 4 ]

3 голосов
/ 11 сентября 2011

Вам нужно отключить кеширование запросов

set session query_cache_type=0;

Подробности смотрите по этой ссылке:

http://dev.mysql.com/doc/refman/5.5/en/query-cache.html

1 голос
/ 12 сентября 2011

Ваш php-сервер кэширует SQL-запрос, чтобы избежать повторяющихся запросов и снизить нагрузку

Выключите его

set session query_cache_type=0;

в начале сценария php для select.

Кроме того, выполнение запроса базы данных каждые 10 секунд не очень хорошая идея. Когда вы масштабируете до 1000 пользователей (предположим), у вас будет не менее 100 запросов в секунду, что не очень хорошо для вашего сервера.

Подумайте о запуске сценария php, который запрашивает базу данных и записывает результаты в файл с разделителями-запятыми или xml каждые 1 минуту или около того, настроив задание cron и получая этот файл с сервера каждые 10 секунд вместо php * 1010. *

0 голосов
/ 12 сентября 2011

Я думаю, вы должны снова просмотреть весь код и посмотреть, не использовали ли вы экземпляр Score. Чтобы сделать это более понятным, посмотрите, использовали ли вы данные оценки из предыдущего поиска в базе данных. Убедитесь, что вы удаляете такие экземпляры и извлекаете необходимые данные из базы данных каждый раз.

0 голосов
/ 11 сентября 2011

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

Если вы закрываете соединение, возможно, вы захотите узнать, настроена ли сама БД на кеширование данных на определенный период времени.

Я действительно думаю, что это звучит как проблема с кэшированием.

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