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

EDIT : добавлено решение из принятого ответа

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

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

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

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

Итак, в echohtmltable.php настоящее время есть все, что связано с этим вопросом

Проверка переменной GET

 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>";