Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Цикл выводит только одну строчку из БД (DLE) / 15 сообщений из 15, страница 1 из 1
26.07.2014, 21:31
    #38706644
smarton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
Пишу для 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
26.07.2014, 23:06
    #38706660
SharuPoNemnogu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
ну var_dump() и вперед.
Вывели запрос сделали в phpmyadmin (или что там у вас). Вывели $sql_score посмотрели что там.
...
Рейтинг: 0 / 0
26.07.2014, 23:16
    #38706664
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
smartonОшибка может или в самом запросе (перед циклом) или в цикле.
Ну так определитесь, в SQL-запросе ошибка или в обработке результатов запроса.
1. Посмотрите текст запроса. Возможно, используемые при сборке запроса переменные имеют не то значение, которое ожидаете.
2. Выполните запрос к БД с использованием альтернативных средств (консоль, phpMyAdmin и т.п.).
3. По результатам уже смотрите, 10 ли строк возвращается (запрос правильный) или одна.

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

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
27.07.2014, 01:18
    #38706686
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
Наверняка, так все строки получите:
Код: php
1.
2.
3.
while($row = $db->get_row($res)) {
  var_dump($row);
}



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



Да, получил все строки.
В коде я уже пробовал заменить цикл foreach на while, но это проблему не решало. А вообще, в движке везде используется foreach.
...
Рейтинг: 0 / 0
27.07.2014, 02:11
    #38706695
smarton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
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
27.07.2014, 07:56
    #38706703
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
smartonУ меня происходит взрыв мозгаСтранно, запрограммировано вроде некое неразрушающее, а то даже и созидающее воздействие на мозг:

Код: php
1.
2.
3.
$data = mozg_cache($cache_prefix);
...
mozg_create_cache($cache_prefix, $cache_rows);
...
Рейтинг: 0 / 0
27.07.2014, 07:59
    #38706704
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
Что-то мне подсказывает, что единичка, переданная вторым параметром в super_query(), означает что возвращать надо только одну строку. По крайней мере, в этой ветке кода не вижу цикла выборки множества строк.
...
Рейтинг: 0 / 0
27.07.2014, 22:39
    #38706878
smarton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
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
27.07.2014, 22:48
    #38706882
smarton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
Для примера приведу код вывода (показа) всех комментариев к заметке. Этот код заведомо правильный и выводит все комментарии из базы к определенной заметке.
Так вот, не вижу принципиальной разницы в логике построения моего кода и этого.
Код: 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
28.07.2014, 21:48
    #38707651
smarton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
С помощью 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
29.07.2014, 00:01
    #38707691
smarton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
В целом разобрался, но нужно еще допиливать и непонятны некоторые детали.
...
Рейтинг: 0 / 0
29.07.2014, 04:33
    #38707716
smarton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл выводит только одну строчку из БД (DLE)
Задачу решил. Долго, нудно, но сам. Зато теперь подобный модуль смогу написать быстрее

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


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