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

Форум MySQL

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

 

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

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

тема: Установка сортировки
 
 автор: Ученик   (23.02.2006 в 15:30)
 
 

Например есть такая таблица

CREATE TABLE 'test' (
  'id' int(11) NOT NULL auto_increment,
  'text' text NOT NULL,
  'data' datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  ('id')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;

INSERT INTO 'тест' VALUES (1, 'Описание чего-то там 1', '2006-02-23 14:13:54');
INSERT INTO 'тест' VALUES (2, 'Описание чего-то там 2', '2006-02-23 14:14:21');
INSERT INTO 'тест' VALUES (3, 'Описание чего-то там 3', '2006-02-23 14:14:30');
INSERT INTO 'тест' VALUES (4, '4', '2006-02-23 14:14:37');


И такой код

$table="test";
$sql="SELECT * FROM $table ";
$result=mysql_query($sql);
if(!$result) {
echo "Ошибка выполнения запроса<BR>".mysql_error();
echo "<br>".$sql;
exit();
}

while(++$i<=mysql_num_rows($result))
{
    $r=mysql_fetch_array($result);
          echo $r[text]." <A href=some.php?up=1&id=".$r[id].">вверх</A><br>";
          echo $r[text]." <A href=some.php?up=1&id=".$r[id].">вниз</A><br>";
          echo "<br><br>";
}


На некоторых сайтах можно самому задать порядок сортировки данных. Вроде того "вверх" "вниз", и выбранная строка будет уже выводиться в том порядке в котором его изменил пользователь. Я тут придумал несколько вариантов: добавить еще одно поле, и в нем менять числа в зависимости от выбора пользователя. Если "вверх" то к этому полю прибавляеться како-е то число, "вниз" отнимается. Но в этом варианте есть несколько заковырок.
Хотелось бы узнать как это делаеться на самом деле...
Заранее спасибо

   
 
 автор: Sergey89   (23.02.2006 в 15:46)   письмо автору
 
   для: Ученик   (23.02.2006 в 15:30)
 


$sql="SELECT * FROM $table ORDER BY name DESC";

or

$sql="SELECT * FROM $table ORDER BY name ASC";

   
 
 автор: elenaki   (23.02.2006 в 15:47)   письмо автору
 
   для: Ученик   (23.02.2006 в 15:30)
 

я только сегодня переделала один скрипт. раньше у меня стояли две стрелки с направлением
сортировки - вверх и вниз. на стрелках - линк на тот же файл, но с передачей в URL условий -
$field - по какому полю сортировать, $sort - в каком порядке. но пришлось добавить еще
несколько столбиков и таблица перестала влезать в экран :). решила отказаться от стрелок,
а переходы делать прямо по клику на названии столбца.



<a href="<?$HTTP_SELF?>?field=name&sort=<?=$sort?>" title="Click to reverse order"><b>Name</b></a>


в запросе подставляю условие:

$users_query = mysql_query("select * from ".$db_prefix."users order by $field $sort limit $lpos,$on_page") or die(mysql_error());


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

if(!isSet($sort)) $sort = " ASC";
if (!isset($field)) $field = "id"; 


после клика на линке надо тут же поменять порядок на обратный (чтобы при следующем клике на этом же линке что-то поменялось, а то так и будет одно и то же значение)


if ($sort == " ASC") $sort = " DESC"; else $sort = " ASC";


самое противное обнаружилось при листании (у меня там постраничный вывод). но и это
решилось. :)

   
 
 автор: Ученик   (23.02.2006 в 15:55)
 
   для: Ученик   (23.02.2006 в 15:30)
 

Спасибо за скорые ответы ;-), но вы меня немного неправильно поняли. Мне нужно чтобы эти 4 значения выводились не просто, по порядку и в обратном порядке. Мне интересно как реализовываеться сортировка одной строки по отношению ко всем остальным. Например если пользователь нажмет на эту ссылку
Описание чего-то там 3 вверх
то только эта строка поднимится вверх и порядок их отображения и хранения в БД будет таким

 Описание чего-то там 1 вверх
Описание чего-то там 1 вниз

Описание чего-то там 3 вверх
Описание чего-то там 3 вниз

Описание чего-то там 2 вверх
Описание чего-то там 2 вниз

4 вверх
4 вниз

Если еще раз нажать на
Описание чего-то там 3 вверх
то она подниметься на самый верх. Порядок же остальных строк не должен меняться.

   
 
 автор: Ученик   (23.02.2006 в 16:03)   письмо автору
 
   для: Ученик   (23.02.2006 в 15:55)
 

З.Ы. Там в скрипте малехо ошибся
echo $r[text]." <A href=some.php?up=1&id=".$r[id].">вниз</A><br>";

поменять на
echo $r[text]." <A href=some.php?up=0&id=".$r[id].">вниз</A><br>";

З.З.Ы. Тему я не дублировал чесслово. Только зарегистрировался а тут и она выскочила...

   
 
 автор: elenaki   (23.02.2006 в 16:03)   письмо автору
 
   для: Ученик   (23.02.2006 в 15:55)
 

тогда надо делать GROUP BY "выделенная строка"

   
 
 автор: Ученик   (23.02.2006 в 16:14)   письмо автору
 
   для: elenaki   (23.02.2006 в 16:03)
 

Хммм.... Сейчас напишу так как это вижу я. Вы меня немного не верно понимаете

   
 
 автор: Ученик   (23.02.2006 в 16:21)   письмо автору
 
   для: elenaki   (23.02.2006 в 16:03)
 

Дамп таблицы

CREATE TABLE 'test' (
  'id' int(11) NOT NULL auto_increment,
  'text' text NOT NULL,
  'data' datetime NOT NULL default '0000-00-00 00:00:00',
  'sorting' int(11) NOT NULL default '0',
  PRIMARY KEY  ('id')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;


INSERT INTO 'test' VALUES (1, 'Описание чего-то там 1', '2006-02-23 14:13:54', 100);
INSERT INTO 'test' VALUES (2, 'Описание чего-то там 2', '2006-02-23 14:14:21', 200);
INSERT INTO 'test' VALUES (3, 'Описание чего-то там 3', '2006-02-23 14:14:30', 300);
INSERT INTO 'test' VALUES (4, '4', '2006-02-23 14:14:37', 400);


Файл index.php

<?
require_once "config.php";

$sql="SELECT * FROM $table ORDER BY sorting";
$result=mysql_query($sql);
if(!
$result) {
echo 
"Ошибка выполнения запроса<BR>".mysql_error();
echo 
"<br>".$sql;
exit();
}

while(++
$i<=mysql_num_rows($result))
{
    
$r=mysql_fetch_array($result);
          echo 
$r[text]." <A href=some.php?up=1&id=".$r[id].">вверх</A><br>";
          echo 
$r[text]." <A href=some.php?up=0&id=".$r[id].">вниз</A><br>";
          echo 
"<br><br>";
}
?>

Файл some.php

<?
require_once "config.php";

if(
$_GET[up]==1){

$sql="UPDATE $table SET sorting =sorting-101 WHERE id =$_GET[id]";
mysql_query($sql);
?>
<HTML><HEAD> 
<META HTTP-EQUIV='Refresh' CONTENT='0; URL="index.php"'> 
</HEAD></HTML>
<?
}

elseif(
$_GET[up]==0){

$sql="UPDATE $table SET sorting =sorting+101 WHERE id =$_GET[id]";
mysql_query($sql);
?>
<HTML><HEAD> 
<META HTTP-EQUIV='Refresh' CONTENT='0; URL="index.php"'> 
</HEAD></HTML>
<?
}
?>


Все работает, но немного криво и через одно место :) Вот мне и интересно как это вообще реализуеться.

   
 
 автор: elenaki   (23.02.2006 в 20:11)   письмо автору
 
   для: Ученик   (23.02.2006 в 16:21)
 

мне не очень понятно, почему работает. после нескольких кликов поле sorting принимает нулевое значение и потом можно добиться, чтобы строка поднялась наверх, только опуская все остальные.

значит так, я всю дорогу думала. придумала сделать 2 запроса. один выбирает ОДНУ строку по id, второй - все остальные, КРОМЕ этого id. как выводить остальные строки - вам решать, сортировать их по их id, или по полю sorting. только тогда надо оставить один линк - наверх. по клику на нем выбирать строку с выбранным id, выбирать ее из базы, выводить первой. потом делать запрос на выборку всех остальных строк.

   
 
 автор: Ученик   (24.02.2006 в 11:43)   письмо автору
 
   для: elenaki   (23.02.2006 в 20:11)
 

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

В книге "Практика создания web-сайтов на PHP5" есть похожая схема. Возьмем ту же фотогалерею. В ней можно задать порядок сортировки изображений путем принудительной установки порядкового номера. Например мне нужно чтобы эта фотка была 3-я по счету при выводе на экран, ставишь ей 3 и все ок. Мне хотелось бы слегка упростить эту процедуру, без ввода порядкового номера, а просто нажимая несколько раз ссылку "поднять" или "опустить" мы меняем положение отой строки по отношению к остальным. И самое главное чтобы все изменения сохранились в бд, и при следующем заходе на сайт сортировка была как при последнем посещении.

Хеопс может быть вы мне поможете разобраться?


>мне не очень понятно, почему работает. после нескольких
>кликов поле sorting принимает нулевое значение и потом можно
>добиться, чтобы строка поднялась наверх, только опуская все
>остальные.
Поле "сортинг" может принимать отрицательное значение при этом это все учитываеться при выборке из БД запросом

SELECT * FROM $table ORDER BY sorting

;-)

   
 
 автор: cheops   (24.02.2006 в 13:08)   письмо автору
 
   для: Ученик   (24.02.2006 в 11:43)
 

> Мне хотелось бы слегка упростить эту процедуру, без ввода порядкового номера, а просто
>нажимая несколько раз ссылку "поднять" или "опустить" мы меняем положение отой строки по
>отношению к остальным.
Хм... помоему уже перешли к обсуждению другого вопроса. Посмотрите 293 страницу, начиная с неё обсуждается реализация такого алгоритма.

   
 
 автор: Ученик   (24.02.2006 в 13:20)   письмо автору
 
   для: cheops   (24.02.2006 в 13:08)
 

Спасибо сейчас почитаю. Хеопс, а в фотогалерее можно было задать один и тот же порядковый номер разным изображениям. Это так и должно быть?


P.S. Пришлось немонго повозиться, но все-таки сделал рабочий вариант. Еленаки если вам интересно см. аттач. Правда он тоже далеко не идеален, но сам принцип понятен, а главное работает ;-)

   
 
 автор: elenaki   (24.02.2006 в 13:33)   письмо автору
 
   для: Ученик   (24.02.2006 в 13:20)
 

Fatal error: [] operator not supported for strings in e:\www\php\tests\sorting\some.php on line 20

   
Rambler's Top100
вверх

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