Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как ограничить вывод в запросе
 
 автор: Nur-maga   (24.02.2013 в 23:10)   письмо автору
 
 

Здравствуйте! Есть запрос, который выводит пользователей на сайте:
$query = "SELECT
SQL_CALC_FOUND_ROWS user_id,
user_country_city_name,
user_search_pref,
user_photo,
user_status, alias 
FROM `".PREFIX."_users`
WHERE user_id = '{$guest_id}'
ORDER by rand() DESC
LIMIT 0, 6";
$sql_guests = $db->super_query($query, 1);


Этот запрос выводит всех подряд.
Подскажите пожалуйста, как выводит 5 пользователя?

  Ответить  
 
 автор: cheops   (26.02.2013 в 07:20)   письмо автору
 
   для: Nur-maga   (24.02.2013 в 23:10)
 

>как выводит 5 пользователя?
Имеется в виду 5 пользователей или пятого пользователя?

  Ответить  
 
 автор: Nur-maga   (26.02.2013 в 16:49)   письмо автору
 
   для: cheops   (26.02.2013 в 07:20)
 

5 пользователей конечно, изменяюсь за ошибки))

  Ответить  
 
 автор: Igorek   (26.02.2013 в 20:53)   письмо автору
 
   для: Nur-maga   (24.02.2013 в 23:10)
 

> Этот запрос выводит всех подряд.

Вы уверены, что это точно он? Судя по условию WHERE - должен быть найден определенный пользователь по $guest_id, если конечно user_id уникально определяет юзера. Ну и даже если это не так, тогда все равно запрос должен вернуть не более 6 записей (LIMIT 0, 6).

Еще раз проверьте, выведите значение $query перед выполнением, выполните запрос вручную, уберите лишнее, не забывайте про защиту от sql-инъекций

  Ответить  
 
 автор: Nur-maga   (27.02.2013 в 00:05)   письмо автору
 
   для: Igorek   (26.02.2013 в 20:53)
 

>> Этот запрос выводит всех подряд.
>
>Вы уверены, что это точно он?
Да, конечно. Вот весь код, который отвечает за вывод:

<?

if($row['user_guests']){
                
$guests_arr array_unique(explode('|',$row['user_guests']));
                foreach(
$guests_arr as $guest_id) {
                    
                    
$query "SELECT 
                        SQL_CALC_FOUND_ROWS user_id, 
                        user_country_city_name, 
                        user_search_pref, 
                        user_photo, 
                        user_status, alias  
                        FROM `"
.PREFIX."_users` 
                        WHERE user_id = '
{$guest_id}
                        ORDER by rand() DESC 
                        LIMIT 0, 6"

                    
$sql_guests $db->super_query($query1);
                    
                    
                    
$tpl->load_template('profile_guest.tpl');
                foreach(
$sql_guests as $row_guests){

                    
//Оригинальный (id) - пользователя.
                    
$tpl->set('{user-id-original}'$row_guests['user_id']);

                    
//Замена (id) - на уникальное имя (aliast).
                    
if($row_guests['alias']){
                        
$tpl->set('{user-id}'$row_guests['alias']); 
                    } else {
                        
$tpl->set('{user-id}''id'.$row_guests['user_id']);
                    }

                    
//Выводим статус пользователя, если нету статус то выводим, место прожывания.
                    
if($row_guests['user_status']){
                        
$tpl->set('{guest_status}'stripslashes(substr($row_guests['user_status'], 050)));
                    } else {
                        
$country_city_guest explode('|'$row_guests['user_country_city_name']);
                        
$tpl->set('{guest_status}'$country_city_guest[1]);
                    }

                    
$guest_info explode(' '$row_guests['user_search_pref']);
                    
$tpl->set('{name}'$guest_info[0]);
                    
$tpl->set('{last-name}'$guest_info[1]);
                if(
$row_guests['user_photo'])
                    
$tpl->set('{ava}'$config['home_url'].'uploads/users/'.$row_guests['user_id'].'/50_'.$row_guests['user_photo']);
                else
                    
$tpl->set('{ava}''/images/no_ava_50.png');
                    
$tpl->compile('all_guests_friends');}

                }
            }


?>

Здесь есть лимит 6 но почему то выводятся все подряд.
И вот дамп таблицы users^

CREATE TABLE IF NOT EXISTS `new_users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_email` varchar(200) NOT NULL,
  `user_password` char(50) NOT NULL,
  `user_name` varchar(25) NOT NULL,
  `user_lastname` varchar(25) NOT NULL,
  `user_sex` int(11) NOT NULL,
  `user_day` int(11) NOT NULL,
  `user_month` int(11) NOT NULL,
  `user_year` int(11) NOT NULL,
  `user_country` varchar(50) NOT NULL,
  `user_city` varchar(50) NOT NULL,
  `user_reg_date` varchar(60) NOT NULL,
  `user_lastdate` varchar(60) NOT NULL,
  `user_group` smallint(11) NOT NULL,
  `user_hid` char(100) NOT NULL,
  `user_country_city_name` varchar(60) NOT NULL,
  `user_search_pref` varchar(25) NOT NULL,
  `user_birthday` char(11) NOT NULL,
  `user_privacy` text NOT NULL,
  `user_status` varchar(200) NOT NULL,
  `user_audio` int(11) NOT NULL,
  `user_last_visit` text NOT NULL,
  `user_photo` varchar(90) NOT NULL,
  `user_delet` int(11) NOT NULL,
  `user_ban` int(11) NOT NULL,
  `user_balance` int(11) NOT NULL,
  `user_wall_num` mediumint(11) NOT NULL,
  `user_notes_num` mediumint(11) NOT NULL,
  `user_videos_num` mediumint(11) NOT NULL,
  `user_wall_id` int(11) NOT NULL,
  `user_pm_num` mediumint(11) NOT NULL,
  `user_ban_date` varchar(255) NOT NULL,
  `user_friends_demands` int(11) NOT NULL,
  `user_support` int(11) NOT NULL,
  `user_lastupdate` int(11) NOT NULL,
  `user_msg_type` int(11) NOT NULL,
  `user_new_mark_photos` int(11) NOT NULL,
  `user_friends_num` mediumint(11) NOT NULL,
  `user_xfields` text NOT NULL,
  `user_xfields_all` text NOT NULL,
  `user_subscriptions_num` mediumint(11) NOT NULL,
  `user_albums_num` mediumint(11) NOT NULL,
  `user_sp` varchar(10) NOT NULL,
  `user_gifts` int(11) NOT NULL,
  `user_public_num` mediumint(11) NOT NULL,
  `xfields` text NOT NULL,
  `user_doc_num` mediumint(11) NOT NULL,
  `user_fave_num` mediumint(11) NOT NULL,
  `user_blacklist` text NOT NULL,
  `user_blacklist_num` mediumint(11) NOT NULL,
  `user_rate` int(11) NOT NULL,
  `all_liked_users` text NOT NULL,
  `alias` text NOT NULL,
  `user_guests` text NOT NULL,
  `user_guests_date` datetime NOT NULL,
  `user_img_fon` text NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

  Ответить  
 
 автор: Sfinks   (27.02.2013 в 10:18)   письмо автору
 
   для: Nur-maga   (27.02.2013 в 00:05)
 

Раз уж не об этом речь, то про нормализацию и типы полей я промолчу.

Но....

Судя по "AUTO_INCREMENT=4 ;" у вас сейчас в таблице не более 3ех записей. Как вы хотите из них вывести только первые 5? Это по-любому будут все.

  Ответить  
 
 автор: Nur-maga   (27.02.2013 в 12:05)   письмо автору
 
   для: Sfinks   (27.02.2013 в 10:18)
 

>Судя по "AUTO_INCREMENT=4 ;" у вас сейчас в таблице не более 3ех записей. Как вы хотите из них вывести только первые 5? Это по-любому будут все.
Это потому что на локальном сервере нет столько пользователей, на реальном хостинге, где есть много пользователей, этот кусок кода выводит всех подряд.

>Выводит всё судя по всему из-за цикла. А какая задача должна выполняться этим кодом?
Выводит из базы последние 5 пользователей.

  Ответить  
 
 автор: Igorek   (27.02.2013 в 13:16)   письмо автору
 
   для: Nur-maga   (27.02.2013 в 12:05)
 

>>Выводит всё судя по всему из-за цикла. А какая задача должна выполняться этим кодом?
>Выводит из базы последние 5 пользователей.

Вам как бы намекают на цикл внимание обратить:
<? if($row['user_guests']){ 
                
$guests_arr array_unique(explode('|',$row['user_guests'])); 
                foreach(
$guests_arr as $guest_id) { 

ваш запрос, с последующей компиляцией шаблона, выполнится count($guest_arr) раз. Откуда берутся id'шники в $row['user_guests']? Зачем для каждого id'шника выполнять выборку, когда можно и нужно все сразу вытащить?

  Ответить  
 
 автор: Den*s   (27.02.2013 в 13:20)   письмо автору
 
   для: Nur-maga   (27.02.2013 в 12:05)
 


SELECT * FROM new_users ORDER BY user_id DESC LIMIT 0, 5

* - берём все поля, нужное поле укажите в пхп коде
ORDER BY user_id DESC - упорядочивание в обратном порядке от последнего добавленного пользователя
LIMIT 0, 5 - думаю понятно

  Ответить  
 
 автор: Sfinks   (27.02.2013 в 15:40)   письмо автору
 
   для: Nur-maga   (27.02.2013 в 12:05)
 

Стоп!
Так у вас же "PRIMARY KEY (`user_id`)"!
Как может быть WHERE user_id = '{$guest_id}' и LIMIT?
Пользователей с user_id = '{$guest_id}' всегда будет 0 или 1 и не более!
(кстати кавычки для значения поля типа int не нужны)
Так что вам нужно, я так и не могу понять?

- Пользователь с конкретным user_id? Тогда:
SELECT * FROM new_users WHERE user_id = {$guest_id}

- Пять случайных пользователей? Тогда:
SELECT * FROM new_users ORDER BY rand() LIMIT 5

- Пять последних пользователей? Тогда:
SELECT * FROM new_users ORDER BY user_id DESC LIMIT 5

Что из этого вам подходит и что не работает???

  Ответить  
 
 автор: Nur-maga   (27.02.2013 в 16:40)   письмо автору
 
   для: Sfinks   (27.02.2013 в 15:40)
 

Есть сайт http://kavkaznet.org/ и там есть пункт посетители, т.е. гости. там выводятся пользователи, которые просматривали профиль. Это CMS Vii Engine.
На чистом PHP я бы смог это реализовать, но здесь не получается одному.
Есть такблица:

--
-- Структура таблицы `new_users`
--

CREATE TABLE IF NOT EXISTS `new_users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_email` varchar(200) NOT NULL,
  `user_password` char(50) NOT NULL,
  `user_name` varchar(25) NOT NULL,
  `user_lastname` varchar(25) NOT NULL,
  `user_sex` int(11) NOT NULL,
  `user_day` int(11) NOT NULL,
  `user_month` int(11) NOT NULL,
  `user_year` int(11) NOT NULL,
  `user_country` varchar(50) NOT NULL,
  `user_city` varchar(50) NOT NULL,
  `user_reg_date` varchar(60) NOT NULL,
  `user_lastdate` varchar(60) NOT NULL,
  `user_group` smallint(11) NOT NULL,
  `user_hid` char(100) NOT NULL,
  `user_country_city_name` varchar(60) NOT NULL,
  `user_search_pref` varchar(25) NOT NULL,
  `user_birthday` char(11) NOT NULL,
  `user_privacy` text NOT NULL,
  `user_status` varchar(200) NOT NULL,
  `user_audio` int(11) NOT NULL,
  `user_last_visit` text NOT NULL,
  `user_photo` varchar(90) NOT NULL,
  `user_delet` int(11) NOT NULL,
  `user_ban` int(11) NOT NULL,
  `user_balance` int(11) NOT NULL,
  `user_wall_num` mediumint(11) NOT NULL,
  `user_notes_num` mediumint(11) NOT NULL,
  `user_videos_num` mediumint(11) NOT NULL,
  `user_wall_id` int(11) NOT NULL,
  `user_pm_num` mediumint(11) NOT NULL,
  `user_ban_date` varchar(255) NOT NULL,
  `user_friends_demands` int(11) NOT NULL,
  `user_support` int(11) NOT NULL,
  `user_lastupdate` int(11) NOT NULL,
  `user_msg_type` int(11) NOT NULL,
  `user_new_mark_photos` int(11) NOT NULL,
  `user_friends_num` mediumint(11) NOT NULL,
  `user_xfields` text NOT NULL,
  `user_xfields_all` text NOT NULL,
  `user_subscriptions_num` mediumint(11) NOT NULL,
  `user_albums_num` mediumint(11) NOT NULL,
  `user_sp` varchar(10) NOT NULL,
  `user_gifts` int(11) NOT NULL,
  `user_public_num` mediumint(11) NOT NULL,
  `xfields` text NOT NULL,
  `user_doc_num` mediumint(11) NOT NULL,
  `user_fave_num` mediumint(11) NOT NULL,
  `user_blacklist` text NOT NULL,
  `user_blacklist_num` mediumint(11) NOT NULL,
  `user_rate` int(11) NOT NULL,
  `all_liked_users` text NOT NULL,
  `alias` text NOT NULL,
  `user_guests` text NOT NULL,
  `user_guests_date` datetime NOT NULL,
  `user_img_fon` text NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

--
-- Дамп данных таблицы `new_users`
--

INSERT INTO `new_users` (`user_id`, `user_email`, 
`user_password`, `user_name`, `user_lastname`, `user_sex`, 
`user_day`, `user_month`, `user_year`, `user_country`, 
`user_city`, `user_reg_date`, `user_lastdate`, 
`user_group`, `user_hid`, `user_country_city_name`, 
`user_search_pref`, `user_birthday`, `user_privacy`, 
`user_status`, `user_audio`, `user_last_visit`, 
`user_photo`, `user_delet`, `user_ban`, `user_balance`, 
`user_wall_num`, `user_notes_num`, `user_videos_num`, 
`user_wall_id`, `user_pm_num`, `user_ban_date`, 
`user_friends_demands`, `user_support`, `user_lastupdate`, 
`user_msg_type`, `user_new_mark_photos`, 
`user_friends_num`, `user_xfields`, `user_xfields_all`, 
`user_subscriptions_num`, `user_albums_num`, `user_sp`, 
`user_gifts`, `user_public_num`, `xfields`, `user_doc_num`, 
`user_fave_num`, `user_blacklist`, `user_blacklist_num`, 
`user_rate`, `all_liked_users`, `alias`, `user_guests`, 
`user_guests_date`, `user_img_fon`) VALUES
(1, 'adds@bk.ru', '63ee451939ed580ef3c4b6f0109d1fd0', 
'Нурмагомед', 'Цехаев', 1, 27, 5, 1989, '1', '2425', 
'1361616449', '1361616449', 1, 
'63ee451939ed580ef3c4b6f0109d1fd0499 b95eea599df1950b335b8b4e3ea8b',
 'Россия|Гудермес', 'Нурмагомед Цехаев', '1989-5-27', 
'val_msg|1||val_wall1|1||val_wall2|1||val_wall3|1||val_info|1||val_guests1|1||val_guests2|1||',
 'Просто статус', 2, '1361956427', '47656a9903a4efe.jpg', 
0, 0, 9464, 8, 1, 1, 5, 0, '', 0, 0, 1361955928, 1, 0, 1, 
'vk|http://vk.com/nurmaga95||od|http://www.odnoklassniki.ru/nurmaga||phone|+79288965718||site|это и есть мой сайт||', 
'activity|Программист||interests|Наука||myinfo|ничего....||music|Рок||kino|Ужасы||books|PHP ООП||games|Бильярд||',
 0, 1, '7|0', 1, 1, '', 0, 0, '', 0, 650, '', 'nurmaga', 
'|2||2||2||2||2||2||2||3||3||2||4||4|',
 '0000-00-00 00:00:00', '/uploads/fon/1/147a8527c2b2e8c.jpg'),
;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Когда пользователи приходят в гости, записывается id гостей примерно так: |2||2||2||2||2||2||2||3||3||2||4||4| не 1, не 5 а выводятся все.
Я бы хотел вывести последние 5 посетителей.

>Пять последних пользователей? Тогда:
Не пользователей, а посетителей, которые просматривали мой профиль.

  Ответить  
 
 автор: Den*s   (27.02.2013 в 10:45)   письмо автору
 
   для: Nur-maga   (27.02.2013 в 00:05)
 


<?
 
foreach($guests_arr as $guest_id) { 
?>

Выводит всё судя по всему из-за цикла. А какая задача должна выполняться этим кодом?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования