Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Не правильно работает SELECT mysql
Форумы портала PHP.SU » » Работа с СУБД » Не правильно работает SELECT mysql

Страниц (1): [1]
 

1. igosja - 23 Октября, 2013 - 20:29:55 - перейти к сообщению
Здравствуйте, форумчане.
Прошу вашей помощи со следующей проблемой.

У меня на разрабатываемом сайте есть необходимость пересчета больших объемов статистической информации (онлайн менеджер, пересчет игровой ситуации), пересчитывающие скрипты разбиты на файлы, которые запускаются цепочкой (для избежания сверхлимитного использования процессорного времени хостинга).

Все файлы работаю нормально, кроме одного файла - player_phisical.php?limit=0.
Код проблемной части файла:
PHP:
скопировать код в буфер обмена
  1. include '../../database.php';
  2. include '../../function.php';
  3.  
  4. $limit = $_GET['limit'];
  5. $player_sql = mysql_query("     SELECT `player_id`, `player_phisical`
  6.                                 FROM `player`
  7.                                 WHERE `player_age`<'40'
  8.                                 LIMIT $limit, 100");
  9. $count_player = mysql_num_rows($player_sql);
  10. if ($count_player > 0)
  11. {
  12.         $shedule_sql = mysql_query("    SELECT `shedule_id`
  13.                                         FROM `game`, `shedule`
  14.                                         WHERE `game_played`='0'
  15.                                         AND `game_shedule_id`=`shedule_id`
  16.                                         ORDER BY `shedule_date`
  17.                                         LIMIT 1");
  18.         $shedule_id_new = mysql_result($shedule_sql,0,'shedule_id');
  19.         print $shedule_id_new; /*Строка введена для поиска ошибки - ошибка именно в этой выборке. Потом идут расчеты с обновлением таблиц*/
  20.         $limit = $limit + 100;
  21.         $href = 'player_phisical.php?limit='.$limit;
  22.         print   '<script type="text/javascript">
  23.                 function doit()
  24.                 {
  25.                         window.location.href="'.$href.'";
  26.                 }
  27.                 setTimeout(doit, 1);
  28.                 </script>';
  29. }
  30. else
  31. {
  32.         $href = 'player_realpower.php?limit=0';
  33.         print   '<script type="text/javascript">
  34.                 function doit()
  35.                 {
  36.                         window.location.href="'.$href.'";
  37.                 }
  38.                 setTimeout(doit, 1);
  39.                 </script>';
  40. }


Проблема в том, что при запуске этого файла в общей цепочке начиная с index.php значение переменной $shedule_id_new выбирается неправильное - оно постоянно равно 39. Если же файл запустить отдельно через адресную строку .../player_phisical.php?limit=0, переменная выбирается правильно - она варьируется в диапазоне от 1 до 92. Кроме limit файл ничего не получает с предыдущего скрипта, переменная не переприсвается.

Подскажите в чем может быть проблема, так как я додуматься никак не могу.
2. esterio - 23 Октября, 2013 - 22:09:22 - перейти к сообщению
да здраствует sql-иньекция

http://phpfaq[dot]ru/debug
3. igosja - 24 Октября, 2013 - 08:18:48 - перейти к сообщению
esterio пишет:
да здраствует sql-иньекция

Это очень помогает в решении моей проблемы.
4. Silver Soft - 25 Октября, 2013 - 07:01:56 - перейти к сообщению
Действительно, так делать нельзя у вас в первый запрос подставляется не проверенная переменная из GET в запрос, что мешает в адресной строке написать в limit не цифру а SQL-запрос)

esterio пишет:
http://phpfaq[dot]ru/debug

очень правильная ссылка, советую почитать, там как раз про то как отлавливать ошибки.

так не совсем видно, где закралась ошибка... я незнаю, какую цель вы преследуете, но во втором запросе, я бы не подключал сразу две таблицы, а воспользовался бы INNER JOIN)
5. deblogger - 01 Ноября, 2013 - 10:15:49 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $shedule_sql = mysql_query("    SELECT `shedule_id`
  2.                                        FROM `game`, `shedule`
  3.                                        WHERE `game_played`='0'
  4.                                        AND `game_shedule_id`=`shedule_id`
  5.                                        ORDER BY `shedule_date`
  6.                                        LIMIT 1");
  7.         $shedule_id_new = mysql_result($shedule_sql,0,'shedule_id');


Запрос фундаментальный, без единой переменной. Вы берете из него строку номер 0. Если я правильно понял синтаксис этого динозавра - майскыл. Типа потому что у вас там орден и лимита. Так вот, это не факт что так оно и будет, да еще в ораклевом синтаксисе джойна.

Добавьте явное указание ASC или DESC.

(Добавление)
Про инъекции. Никому они не стучат.

ТС, на всякий случай можете вот так сделать

$limit = (int) $_GET['limit'];
if($limit < 0) die('Короче, склифасофский!');

 

Powered by ExBB FM 1.0 RC1