powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Цикл выводит только одну строчку из БД (DLE)
15 сообщений из 15, страница 1 из 1
Цикл выводит только одну строчку из БД (DLE)
    #38706644
smarton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу для DLE модуль, который выводит баллы, заработанные в игре. Столкнулся с тем, что цикл выводит один показатель из базы, а должен выдать 10 значений, отсортированных по убыванию. В запросе я указываю критерий выдачи 10. Ошибка может или в самом запросе (перед циклом) или в цикле. Сделал описание строк.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
NoAjaxQuery();		
$id = intval($_POST['id']);
			
//Выводим данные о игре
$row = $db->super_query("SELECT id, title, poster, descr, traf FROM `".PREFIX."_games` WHERE id = '{$id}'");

//Загружаем шаблон
$tpl->load_template('score.tpl');

//Здесь я опустил код, который выдает из первого запроса ($row) название игры, описание, количество участников и др.
//...
				
//Выводим данные о рейтинге и пользователе
$sql_score = $db->super_query("SELECT 
                  tb1.res_id, res_game_id, res_user, res_date, res_score, 
                  tb2.user_id, user_search_pref, user_photo 
                  FROM `".PREFIX."_games_result` tb1, `".PREFIX."_users` tb2 
                  WHERE tb1.res_user = tb2.user_id AND tb1.res_game_id = '{$id}' 
                  ORDER by res_score DESC LIMIT 0, 10", 1);

//Если данные присутствуют в базе, то...
if($sql_score){	

//Создаем цикл
foreach($sql_score as $row_score){
   $tpl->set('{name}', $row_score['user_search_pref']);
   $tpl->set('{user-id}', $row_score['user_id']);
   $tpl->set('{score}', $row_score['res_score']);
   megaDate($row_score['res_date'], 1, 1);
   if($row_score['user_photo']) 
      $tpl->set('{ava}', $config['home_url']."uploads/users/{$row_score['user_id']}/50_{$row_score['user_photo']}");
   else 
      $tpl->set('{ava}', "{theme}/images/no_ava_50.png");
   }

$tpl->set('[yes-score]', '');
$tpl->set('[/yes-score]', '');
$tpl->set_block("'\\[no-score](.*?)\\[/no-score]'si","");

//...если данных нет в базе, то указываем в шаблоне, что результаты отсутствуют
} else {
$tpl->set('[no-score]', '');
$tpl->set('[/no-score]', '');
$tpl->set_block("'\\[yes-score](.*?)\\[/yes-score]'si","");
}

//Формируем контент
$tpl->compile('content');

AjaxTpl();
exit();


Могу предоставить структуру таблицы, если будет нужна.
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38706660
SharuPoNemnogu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну var_dump() и вперед.
Вывели запрос сделали в phpmyadmin (или что там у вас). Вывели $sql_score посмотрели что там.
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38706664
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smartonОшибка может или в самом запросе (перед циклом) или в цикле.
Ну так определитесь, в SQL-запросе ошибка или в обработке результатов запроса.
1. Посмотрите текст запроса. Возможно, используемые при сборке запроса переменные имеют не то значение, которое ожидаете.
2. Выполните запрос к БД с использованием альтернативных средств (консоль, phpMyAdmin и т.п.).
3. По результатам уже смотрите, 10 ли строк возвращается (запрос правильный) или одна.

А еще в базе может быть недостаточно данных для возвращения десяти строк результата, но достаточно для одной строки.
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38706666
smarton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleА еще в базе может быть недостаточно данных для возвращения десяти строк результата, но достаточно для одной строки.
Ну уж нет. На это я бы сразу обратил внимание )))
В базе 5 значений, а получаю только один.
Буду проверять, учитывая ваши рекомендации.
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38706684
smarton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот, что я выяснил.

1. Выполняю запрос в phpMyAdmin:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT tb1.res_id, res_game_id, res_user, res_date, res_score, 
       tb2.user_id, user_search_pref, user_photo, 
       tb3.id 
FROM `vr_games_result` tb1, `vr_users` tb2, `vr_games` tb3 
WHERE tb1.res_user = tb2.user_id AND tb1.res_game_id = tb3.id 
ORDER by res_score DESC LIMIT 0, 10


получаю выборку:

Здесь все правильно.

2. Выполняю код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
$query_text = "SELECT tb1.res_id, res_game_id, res_user, res_date, res_score, 
                      tb2.user_id, user_search_pref, user_photo, 
                      tb3.id 
               FROM `".PREFIX."_games_result` tb1, `".PREFIX."_users` tb2, `".PREFIX."_games` tb3 
               WHERE tb1.res_user = tb2.user_id AND tb1.res_game_id = tb3.id 
               ORDER by res_score DESC LIMIT 0, 10";
$res = $db->query($query_text);
$row = $db->get_row($res);
var_dump($row);
echo $db->mysql_error;
die;


получаю только одну строку:

Но я выполняю код через
Код: php
1.
2.
$res = $db->query($query_text);
$row = $db->get_row($res);
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38706686
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверняка, так все строки получите:
Код: php
1.
2.
3.
while($row = $db->get_row($res)) {
  var_dump($row);
}



А вообще, смотрите, что там этот super_query() делает и что возвращает.
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38706687
smarton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleНаверняка, так все строки получите:
Код: php
1.
2.
3.
while($row = $db->get_row($res)) {
  var_dump($row);
}



Да, получил все строки.
В коде я уже пробовал заменить цикл foreach на while, но это проблему не решало. А вообще, в движке везде используется foreach.
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38706695
smarton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleА вообще, смотрите, что там этот super_query() делает и что возвращает.
Функция super_query()
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
	function super_query($query, $multi = false, $cache_prefix = false, $system_cache = false){
		//Если включен кеш, то проверяем на его существование
		if($cache_prefix){
			if($system_cache)
				$data = system_cache($cache_prefix);
			else
				$data = mozg_cache($cache_prefix);
		}
		//Если есть ответ с кеша
		if($data){
			$unSerData = unserialize($data);	
			if($unSerData)
				return $unSerData;
			else
				return array();
		} else {
			if(!$multi) {
				$this->query($query);
				$data = $this->get_row();
				$this->free();	
				//Если включен кеш, то создаём его
				if($cache_prefix){				
					$cache_rows = serialize($data);					
					mozg_create_cache($cache_prefix, $cache_rows);					
				}				
				return $data;				
			} else {
				$this->query($query);				
				$rows = array();
				while($row = $this->get_row()) {
					$rows[] = $row;
				}
				$this->free();			
				//Если включен кеш, то создаём его
				if($cache_prefix){				
					$cache_rows = serialize($rows);					
					if($system_cache)					
						creat_system_cache($cache_prefix, $cache_rows);						
					else					
						mozg_create_cache($cache_prefix, $cache_rows);
				}				
				return $rows;
			}		
		}
	}


У меня происходит взрыв мозга, когда я пытаюсь вникнуть в super_query()
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38706703
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smartonУ меня происходит взрыв мозгаСтранно, запрограммировано вроде некое неразрушающее, а то даже и созидающее воздействие на мозг:

Код: php
1.
2.
3.
$data = mozg_cache($cache_prefix);
...
mozg_create_cache($cache_prefix, $cache_rows);
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38706704
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то мне подсказывает, что единичка, переданная вторым параметром в super_query(), означает что возвращать надо только одну строку. По крайней мере, в этой ветке кода не вижу цикла выборки множества строк.
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38706878
smarton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vklesmartonУ меня происходит взрыв мозгаСтранно, запрограммировано вроде некое неразрушающее, а то даже и созидающее воздействие на мозг:

Код: php
1.
2.
3.
$data = mozg_cache($cache_prefix);
...
mozg_create_cache($cache_prefix, $cache_rows);


У меня могзг не кэшируется и возвращает error
А при второй попытке - echo "Access denied";

vkleЧто-то мне подсказывает, что единичка, переданная вторым параметром в super_query(), означает что возвращать надо только одну строку. По крайней мере, в этой ветке кода не вижу цикла выборки множества строк.

Эту единичку я проверял. Без нее запрос не выполняется. Насколько я понял, она работает как true. Можно 1 заменить на true, запрос выполнится успешно. В общем, не в ней беда.
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38706882
smarton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для примера приведу код вывода (показа) всех комментариев к заметке. Этот код заведомо правильный и выводит все комментарии из базы к определенной заметке.
Так вот, не вижу принципиальной разницы в логике построения моего кода и этого.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
NoAjaxQuery();
$note_id = intval($_POST['note_id']);
$comm_num = intval($_POST['comm_num']);
if($comm_num > 10 && $note_id){
	$limit = $comm_num-10;
	
	$sql_ = $db->super_query("SELECT 
	   tb1.id, from_user_id, text, date, 
	   tb2.user_search_pref, user_photo, user_last_visit, user_logged_mobile 
	   tb3.owner_user_id 
	   FROM `".PREFIX."_notes_comments` tb1, `".PREFIX."_users` tb2, `".PREFIX."_notes` tb3 
	   WHERE tb1.note_id = '{$note_id}' AND tb1.from_user_id = tb2.user_id AND tb1.note_id = tb3.id 
	   ORDER by `add_date` ASC LIMIT 0, {$limit}", 1);
		
	$tpl->load_template('notes/comment.tpl');
	foreach($sql_ as $row_comm){
		if($row_comm['user_photo'])
			$tpl->set('{ava}', $config['home_url'].'uploads/users/'.$row_comm['from_user_id'].
                                  '/50_'.$row_comm['user_photo']);
		else
			$tpl->set('{ava}', '{theme}/images/no_ava_50.png');
						
		OnlineTpl($row_comm['user_last_visit'], $row_comm['user_logged_mobile']);
					
		megaDate(strtotime($row_comm['date']));
						
		if($row_comm['from_user_id'] == $user_id || $row_comm['owner_user_id'] == $user_id){
			$tpl->set('[owner]', '');
			$tpl->set('[/owner]', '');
		} else
			$tpl->set_block("'\\[owner\\](.*?)\\[/owner\\]'si","");
						
		$tpl->set('{author}', $row_comm['user_search_pref']);
		$tpl->set('{uid}', $row_comm['from_user_id']);
		$tpl->set('{id}', $row_comm['id']);
		$tpl->set('{comment}', stripslashes($row_comm['text']));
		$tpl->compile('content');
	}
	AjaxTpl();
}
die();
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38707651
smarton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С помощью var_dump() выяснил, что получаю 5 строк до $tpl->compile('content');

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
//...
$sql_score = $db->super_query("SELECT 
                  tb1.res_id, res_game_id, res_user, res_date, res_score, 
                  tb2.user_id, user_search_pref, user_photo 
                  FROM `".PREFIX."_games_result` tb1, `".PREFIX."_users` tb2 
                  WHERE tb1.res_user = tb2.user_id AND tb1.res_game_id = '{$id}' 
                  ORDER by res_score DESC LIMIT 0, 10", 1);
//получаю 5 строк из базы (всего их 5 в базе)

foreach($sql_score as $row_score){
   $tpl->set('{name}', $row_score['user_search_pref']);
   $tpl->set('{user-id}', $row_score['user_id']);
   $tpl->set('{score}', $row_score['res_score']);
   megaDate($row_score['res_date'], 1, 1);
   if($row_score['user_photo']) 
      $tpl->set('{ava}', $config['home_url']."uploads/users/{$row_score['user_id']}/50_{$row_score['user_photo']}");
   else 
      $tpl->set('{ava}', "{theme}/images/no_ava_50.png");
//получаю 5 строк из базы по каждой переменной {name}, {score} и т.д.
   }
//за циклом уже нет пяти строк, только одна
$tpl->compile('content');
exit();


Думаю, что нужно компилировать контент в цикле. Но $tpl->compile('content'); отказывается компилировать в цикле. Нужно создавать отдельный $tpl->compile()? Знающие DLE, подскажите.
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38707691
smarton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В целом разобрался, но нужно еще допиливать и непонятны некоторые детали.
...
Рейтинг: 0 / 0
Цикл выводит только одну строчку из БД (DLE)
    #38707716
smarton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задачу решил. Долго, нудно, но сам. Зато теперь подобный модуль смогу написать быстрее

Спасибо vkle и SharuPoNemnogu за помощь и рекомендации, они мне очень помогли.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Цикл выводит только одну строчку из БД (DLE)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]