HTML TABLE PHP MySQL переключает порядок сортировки MySQL ASC DESC при щелчке заголовка столбца

РЕДАКТИРОВАТЬ: добавлено решение из принятого ответа

Подсказка, о которой я здесь спрашиваю, — самый умный метод.

Нужно сказать в первую очередь: я прошу вас избегать предлагать базы данных и тому подобное.

Я отображаю содержимое таблицы MySQL в таблице HTML.

У меня есть мнение, что это showdbtable.php который использует как включить echohtmltable.php который запрашивает базу данных и повторяет строки таблицы.

Так в echohtmltable.php на данный момент в этом вопросе есть все

ПОЛУЧИТЬ проверку переменных

if(isset($_GET['sortby'])){
$sortby=$_GET['sortby'];
$_GET['sortby']=''; }
else {
$sortby="id_ord"; }

и последующий запрос

$query = "SELECT id_ord, fornitore, negozio, data_insord, data_prevcons
FROM tesord
ORDER BY ".$sortby." DESC
LIMIT :from_record_num, :records_per_page";

который затем используется для отображения строк таблицы, создавая также механизм сортировки в заголовках столбцов

echo "<th>".'<a href="showdbtable.php?sortby=fornitore">' . "Fornitore</th>";
echo "<th>".'<a href="showdbtable.php?sortby=negozio">' . "Negozio</th>";
echo "<th>".'<a href="showdbtable.php?sortby=data_insord">' . "Data_insord</th>";
echo "<th>".'<a href="showdbtable.php?sortby=data_prevcons">' . "Data_prevcons</th>";

как вы знаете, эта первая часть работает.

Когда я нажимаю одну из вышеуказанных ссылок, запрос работает, но в настоящее время это очевидно из кода, только в DESC.

Добрая просьба является предложением в целом. Но, пожалуйста, обратите внимание, что у меня есть нумерация страниц, вы видите, LIMIT :from_record_num, :records_per_page , что следует принять во внимание.

Какой самый умный и эффективный способ переключения между ASC и DESC таким образом, что после нажатия на одну ссылку, например, «Negozio», снова щелкнув «Negozio», он сортируется в ASC, и при следующем щелчке он переключает DESC, а затем — «ASC» и так далее.

Я уверен, что запрос будет видоизменяться из-за наличия переменной, которую я могу назвать $ ascdesc

$query = "SELECT id_ord, fornitore, negozio, data_insord, data_prevcons
FROM tesord
ORDER BY " . $sortby . " " . $ascdesc . "LIMIT :from_record_num, :records_per_page";

нужно управлять, если в данный момент есть ASC или DESC и переключаться.

Спасибо за намеки на эффективный и умный метод для достижения цели.


Решение: спасибо Руди

Ради того, чтобы помочь другим новичкам, таким как я, вот как я применил решение

// function used in the links
function invdir($dir){ return ($dir == "DESC")? "ASC" : "DESC"; }
// self explaining, it does invert the sort string in the link

// collect, sanitize and default $_GET variables.
// $ordinaper is the Italian of $sortby
$ordinaper = (isset($_GET['ordinaper']))? (filter_var($_GET["ordinaper"], FILTER_SANITIZE_STRING)) : "id_ord";
$ascdesc = (isset($_GET['ascdesc']))? (filter_var($_GET["ascdesc"], FILTER_SANITIZE_STRING)) : "DESC";
// $filtraforn is a filter/search to show only one provider, see the query, it is assigned with a ìn AJAX live search
$filtraforn = (isset($_GET['filtraforn']))? (filter_var($_GET["filtraforn"], FILTER_SANITIZE_STRING)) : "";

// build the common URL GET part
$getlinks = "&filtraforn=".$filtraforn."&page=".$page."&ascdesc=";
// the variable $page comes from the pagination which is out of the scope. Here I was dealing with the correct management of sorting the HTML table columns

// the query is built accordingly, later is used in a PDO statement
$query = "SELECT id_ord, fornitore, negozio, data_insord, data_prevcons FROM tesord ";
$filtro = (strlen($filtraforn))? "WHERE fornitore = '" . $filtraforn . "' " : "";
$query = $query . $filtro . "ORDER BY ". $ordinaper ." ". $ascdesc ." LIMIT :from_record_num, :records_per_page";
// LIMIT :from_record_num, :records_per_page are bound later with variables coming from the pagination which is out of the scope. Here I was dealing with the correct management of sorting the HTML table columns

// and here it is the final table heading
// the ternary operator (($ordinaper!=="id_ord")? "DESC" : invdir($ascdesc)) is used because when clicking a different column, I want to default the sorting in DESC
echo "<tr>";
echo "<th></th>";
echo "<th>". '<a href="read.php?ordinaper=id_ord' .$getlinks. (($ordinaper!=="id_ord")? "DESC" : invdir($ascdesc)) .'">' . "id_ord</th>";
echo "<th>". '<a href="read.php?ordinaper=ord_evaso' .$getlinks. (($ordinaper!=="ord_evaso")? "DESC" : invdir($ascdesc)) .'">' . "Stato</th>";
echo "<th>". '<a href="read.php?ordinaper=fornitore' .$getlinks. (($ordinaper!=="fornitore")? "DESC" : invdir($ascdesc)) .'">' . "Fornitore</th>";
echo "<th>". '<a href="read.php?ordinaper=negozio' .$getlinks. (($ordinaper!=="negozio")? "DESC" : invdir($ascdesc)) .'">' . "Negozio</th>";
echo "<th>". '<a href="read.php?ordinaper=data_insord' .$getlinks. (($ordinaper!=="data_insord")? "DESC" : invdir($ascdesc)) .'">' . "Data_insord</th>";
echo "<th>". '<a href="read.php?ordinaper=data_prevcons' .$getlinks. (($ordinaper!=="data_prevcons")? "DESC" : invdir($ascdesc)) .'">' . "Data_prevcons</th>";
echo "<th>Paia Inev.</th>";
echo "<th>Azione</th>";
echo "</tr>";

0

Решение

Если вы уже отправляете
Сортировать по
через GET, почему бы вам не отправить
ASC, DESC
Опция тоже, я имею в виду, вы могли бы использовать 1 и 0 вместо фактического ASC / DESC и переключать его внутри вашего кода, например:

$ascdesc = ($_GET['ad'])? '0' : '1';

И просто добавьте переменную к ссылке

echo "<th>".'<a href="showdbtable.php?sortby=negozio&ad='.$ascdesc.'">' . "Negozio</th>";

И в вашем запросе, что-то вроде

 $ascdesc = ($_GET['ad'])? 'asc' : 'desc';

Здесь очень важно то, что если вы принимаете пользовательский ввод через GET, вам нужно санировать переменную, чтобы избежать SQL-инъекций, не забывайте об этом.

ОБНОВИТЬ:

Возможная реализация с вашим собственным кодом:

$sortby = (isset($_GET['sortby']))? $_GET['sortby'] : "id_ord";
$ascdesc = ($_GET['ad']=='asc')? 'ASC' : 'DESC';

Запрос:

$query = "SELECT id_ord, fornitore, negozio, data_insord, data_prevcons
FROM tesord
ORDER BY ".$sortby." ".$ascdesc."LIMIT :from_record_num, :records_per_page";

Ссылка:

echo "<th>".'<a href="showdbtable.php?sortby=fornitore&ad=<?=(($_GET['ad']=='asc')? 'desc' : 'asc';)?>">' . "Fornitore</th>";

И если вам нужно добавить страницу, просто добавьте текущую страницу и измените сортировку, вы можете добавить переменную также к ссылке

echo "<th>".'<a href="showdbtable.php?sortby=fornitore&ad=<?php echo (($_GET['ad']=='asc')? 'desc' : 'asc';)?>&page=<?php echo $_GET['page]?>">' . "Fornitore</th>";

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

Вы также можете оставить все для javascript / jQuery, реализовав что-то вроде этот

Надеюсь, что это может дать вам лучшее понимание, счастливое кодирование.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector