РЕДАКТИРОВАТЬ: добавлено решение из принятого ответа
Подсказка, о которой я здесь спрашиваю, — самый умный метод.
Нужно сказать в первую очередь: я прошу вас избегать предлагать базы данных и тому подобное.
Я отображаю содержимое таблицы 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>";
Если вы уже отправляете
Сортировать по
через 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, реализовав что-то вроде этот
Надеюсь, что это может дать вам лучшее понимание, счастливое кодирование.
Других решений пока нет …