Bartman
Новичок
Прошу оценить функцию
Приветствую всех!
Передо мной стояла задача: есть страница с выводом заголовков статей. Нужно было сделать возможность упорядочивать эти статьи в таблице и соот-но при выводе. Т.е. чтобы порядок сортировки можно было изменить и он бы не зависел от ID записи. Для реализации поставленой задачи я написал функцию, которая отвечает непосредствнно за это. Я хотел бы обратиться к посетителям форума с просьбой проревьювить мою ф-ю на предмет универсальности и оптимальности кода. В текущем представлении ф-я отлажена и полностью работоспособна. Принимаются любые замечания и предложения. Полный код ф-ии привожу ниже.
Заранее благорарю!
Приветствую всех!
Передо мной стояла задача: есть страница с выводом заголовков статей. Нужно было сделать возможность упорядочивать эти статьи в таблице и соот-но при выводе. Т.е. чтобы порядок сортировки можно было изменить и он бы не зависел от 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"]." позиция: ".$row["position"]."";
if ($row["position"] == 0) echo " наверх |"; else echo " <a href=".$PHP_SELF."?id=".$row["id"]."&pos=up>наверх</a> |";
if ($row["position"] >= $max_pos) echo " вниз<br>"; else echo " <a href=".$PHP_SELF."?id=".$row["id"]."&pos=down>вниз</a><br>";
echo "==============================<br>";
} // end while
} else die(mysql_error());
?>