Прошу оценить функцию

Bartman

Новичок
Прошу оценить функцию

Приветствую всех!
Передо мной стояла задача: есть страница с выводом заголовков статей. Нужно было сделать возможность упорядочивать эти статьи в таблице и соот-но при выводе. Т.е. чтобы порядок сортировки можно было изменить и он бы не зависел от ID записи. Для реализации поставленой задачи я написал функцию, которая отвечает непосредствнно за это. Я хотел бы обратиться к посетителям форума с просьбой проревьювить мою ф-ю на предмет универсальности и оптимальности кода. В текущем представлении ф-я отлажена и полностью работоспособна. Принимаются любые замечания и предложения. Полный код ф-ии привожу ниже.
Заранее благорарю!

PHP:
<?

/*

// структура тестовой таблицы и её заполение

CREATE TABLE test (
  id smallint unsigned NOT NULL auto_increment PRIMARY KEY,
  name varchar(255) NOT NULL,
  position smallint unsigned NOT NULL
) 

INSERT INTO test VALUES ('', 'один, 0);
INSERT INTO test VALUES ('', 'два', 1);
INSERT INTO test VALUES ('', 'три', 2);
INSERT INTO test VALUES ('', 'четыре', 3);
INSERT INTO test VALUES ('', 'пять', 4);
INSERT INTO test VALUES ('', 'шесть', 5);
*/


function change_position ($id, $pos) {

	// делаем запрос к БД и выдергиваем запись с переданным ID
	$query = "SELECT * FROM test where id = $id";
  if($result = mysql_query($query)) {
      	while($row = mysql_fetch_array($result)) {

	switch ($_GET['pos']) {
	   case "up":
	// уменьшаем позицию выбраной записи на 1
	$query = "UPDATE test SET position = ". ($row["position"] - 1) ." WHERE id = ". $row["id"].""; 
	$result = mysql_query($query) or die(mysql_error());
	// а для записи перед ней сохраняем текущую позицию				
	$query = "UPDATE test SET position = ". $row["position"] ." WHERE id != ". $row["id"]." AND position = ". ($row["position"] - 1) ."";
	$result = mysql_query($query) or die(mysql_error());
                break;
   case "down":
          // увеличиваем позицию выбраной записи на 1 
         $query = "UPDATE test SET position = ". ($row["position"] + 1) ." WHERE id = ". $row["id"].""; 
        $result = mysql_query($query) or die(mysql_error());
// а для записи перед ней сохраняем текущую позицию   
        $query = "UPDATE test SET position = ". $row["position"] ." WHERE id != ". $row["id"]." AND position = ". ($row["position"] + 1) ."";
        $result = mysql_query($query) or die(mysql_error());
        break;
	} // end switch 
        } // end while
   } else die(mysql_error());

header("Location: ".$_SERVER['SCRIPT_NAME']);
exit;
}

if ($_GET['pos']) change_position($id, $pos);

// отображение текущих записей

// определяем максимальную позицию
$query = "SELECT MAX(position) as max_pos FROM test";
if ($result = mysql_query($query)) {
		while ($row_max = mysql_fetch_array($result)) {
			$max_pos = $row_max["max_pos"];
		}
} else die(mysql_error());

// делаем выборку из таблицы и выводим результат запроса
$query = "SELECT * FROM test ORDER BY position";
if ($result = mysql_query($query)) {
		while ($row = mysql_fetch_array($result)) {
				echo "ID записи: ".$row["id"]."&nbsp;&nbsp;&nbsp;позиция: ".$row["position"]."";
				if ($row["position"] == 0) echo "&nbsp;&nbsp;наверх |"; else echo "&nbsp;&nbsp;<a href=".$PHP_SELF."?id=".$row["id"]."&pos=up>наверх</a> |";
				if ($row["position"] >= $max_pos) echo "&nbsp;&nbsp;вниз<br>"; else	echo "&nbsp;&nbsp;<a href=".$PHP_SELF."?id=".$row["id"]."&pos=down>вниз</a><br>";
				echo "==============================<br>";
		} // end while
} else die(mysql_error());

?>
 

Krisha

pain in the neck
ээ, Серега, 2 вопроса, в чем общая идея, зачем тебе это нужно ?
 

Screjet

Новичок
1. Попробуй E_ALL, register_globals = off
2. серьезная ошибка. Попытайся сам разобраться.
 

vladax

Новичок
Ни х** ж себе простыня! Не-е-е-е, вникать, мягко говоря, в падлу!

ээ, Серега, 1 только пожелание... ты подсократил бы функцию свою до тех размеров, которые смогли бы передать саму идею...

ЗЫ: Хотя есть на форуме энтузиасты, может кто и поможет...
 

nagash

Guest
чего то уж больно большая функция для сортировки получилась...
 

ONK

Пассивист PHPСluba
Bartman, твоя функция упрощается до трёх запросов к бд. Реально для изменения порядка сортирваки по приведённой тобой стркутуре таблици нужно всего 2 запроса. Читай ман и изучай работу подобного запроса:

[SQL]
UPDATE test SET position = position + 1 WHERE position < 3
[/SQL]
 

Leonid_P

Guest
а нафига для того чтобы взять одну запись писать такую конструкцию:
$query = "SELECT * FROM test where id = \$id";
if($result = mysql_query($query)) {
while($row = mysql_fetch_array($result)) {
....
}
зачем тут while?
а так нельзя
$row = mysq_fetch_array(mysql_query($query));
?
 

Bartman

Новичок
Идея в следующем: допустим, есть ряд статей. В БД для каждой из них есть, допустим, время создания записи, в кот. содержится статья. Можно пользователю выдать список этих статей отсортированных, ну, например, по дате создания или, скажем, по ID. Но у меня стоит задача: назначить для каждой статьи свою позицию, свой приоритет. Т.е., говоря другоими словами, я смогу какие-то, определенные статьи выносить наверх, чтобы пользователь смог обратить на них внимание в первую очередь, какие-то - переместить в конец (если они например не представляют боьшого интереса)... всё, в сущности, просто.
Выводя список статей (например) справа от каждой статьи я вывожу ссылки "Наверх" и "Вниз", нажимая на которые можно переместить статью соот-но вверх на одну запись при выводе или вниз.
Я попытался реализовать подобную задачу в первый раз, да, возможно, всё не так, криво или не оптимально. И я, именно по этой причине, написав и отладив ф-ю, решил показать её вам, как говорится на ваш суд.
Если у кого-то возникнет желание высказать своё мнение по этому вопросу, поделится мыслями - я буду рад.
Заранее спасибо.
 

Screjet

Новичок
Когда будет подобная задача в сотый раз, заходи, поделимся опытом :)
 

Eugene Bond

sudo rm - rf /
Есть желание высказать мнение!

Если у тебя будет полторы сотни статей, то ты замахаешься одну статью тягать вверх-вниз. И когда это будет работать не на локалке - замахаешься ждать.

Меняться порядок может только в админском интерфейсе? Если да - то вместо ссылок вверх/вниз сделай текстовое поле для изменения номера позиции и будет тебе счастье!


ХИНТ: лучше нумеруй не 1,2,3..., а 10,20,30
 
Сверху