PHP - сортировка списка с помощью выпадающего меню - PullRequest
2 голосов
/ 22 февраля 2012

Я застрял с этим, я всю неделю проходил ускоренный курс по PHP, создавая фальшивый амазоноподобный сайт!Я хочу заказать столик с помощью выпадающего меню, но не могу понять, как!Я знаю, что это легко, но способ, которым я пытался это сделать, следующий:

Настройка переменных, например

$query = "SELECT bookname, bookauthor, bookpub, bookisbn
                FROM booktable
                ORDER BY bookname ASC";

$query2 = "SELECT bookname, bookauthor, bookpub, bookisbn
            FROM booktable
            ORDER BY bookauthor ASC";

Тогда у меня есть форма =

<form name="sort" action="products.php" method="post">
<select name="order">
   <option value="choose">Make A Selection</option>
   <option value="title">Title</option>
   <option value="author">Author</option>
   <option value="publisher">Publisher</option>
   <option value="isbn">Book ISBN-10</option>
</select>
<input type="submit" value=" - Sort - " />
</form>

Теперь для бита, который я не могу сделать,

Я установил переменную:

$sort = $_POST['order']; 

, чтобы любое значение раскрывающегося меню присваивалосьпеременная $ sort ..... (это верно?)

тогда я хочу сказать, ЕСЛИ значение $ sort такое же, как, скажем, 'author', чем $ query = $ query2, но я не знаюкак сказать это без огромных ошибок, любезно предоставлено XAMPP!

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

Спасибо

Ответы [ 3 ]

5 голосов
/ 22 февраля 2012

Для сортировки я бы сделал следующее:

Измените значения параметров, чтобы они соответствовали именам столбцов из вашей таблицы. Установите опцию сортировки, включая значение по умолчанию, если они ничего не выбрали:

$sort=$_POST["order"]!="choose"?$_POST["order"]:"bookname";

, затем просто установите ваш запрос на использование:

ORDER BY ".mysql_real_escape_string($sort)." ASC

Таким образом, вам нужен только один запрос, а не запрос для каждого случая.

2 голосов
/ 22 февраля 2012

для этого типа сортировки вам не нужно 2 или 3 запроса, вы можете просто сделать это с помощью

<?php
 $sort = @$_POST['order']; 
if (!empty($sort)) { // If you Sort it with value of your  select options
echo $query = "SELECT bookname, bookauthor, bookpub, bookisbn
                FROM booktable
                ORDER BY '".$sort."' ASC";

} else { // else if you do not pass any value from select option will return this
echo    $query = "SELECT bookname, bookauthor, bookpub, bookisbn
                FROM booktable
                ORDER BY bookname ASC";
}
?>


<form name="sort" action="" method="post">
<select name="order">
   <option value="choose">Make A Selection</option>
   <option value="title">Title</option>
   <option value="author">Author</option>
   <option value="publisher">Publisher</option>
   <option value="isbn">Book ISBN-10</option>
</select>
<input type="submit" value=" - Sort - " />
</form>
1 голос
/ 22 февраля 2012

Есть несколько способов сделать это, но давайте придерживаться вашего базового подхода - используя предложение ORDER BY вашего SQL, чтобы выполнить сортировку за вас.Что вам нужно сделать, это изменить ваш запрос (или использовать другой запрос) в зависимости от того, какой выбор сделал пользователь с помощью раскрывающегося списка.Вот что я хотел бы сделать:

$query = 'SELECT bookname, bookauthor, bookpub, bookisbn FROM booktable';
switch( $_POST['order'] ){
    case 'title':
        $query .= ' ORDER BY bookname ASC';
        break;
    case 'publisher':
        $query .= ' ORDER BY bookpub ASC';
        break;
    case 'author':
        $query .= ' ORDER BY bookauthor ASC';
        break;
    case 'isbn':
        $query .= ' ORDER BY bookisbn ASC';
        break;
}
$results = mysql_query( $query ); // or however you are processing the query

Теперь это правильно, но лично я считаю, что операторы переключения этого типа излишни.Если вы просто используете блок переключателей для изменения одного конкретного значения на основе другого значения, использование массива PHP для сопоставления одного значения другому может быть намного проще для чтения, поэтому вот еще одна версия, которую я считаю более упорядоченной:

$fieldNameMapping = array( 'title'     => 'bookname',
                           'publisher' => 'bookpub',
                           'author'    => 'bookauthor',
                           'isbn'      => 'bookisbn',    );

$query = 'SELECT bookname, bookauthor, bookpub, bookisbn
             FROM booktable ORDER BY ' . $fieldNameMapping[ $_POST['order'] ] . ' ASC';

$results = mysql_query( $query ); // or however you are processing the query

Используя любой из этих методов, обязательно выполните базовую проверку работоспособности $_POST['order'] перед ее использованием.Я исключил из своих примеров какие-либо проверки или дезинфекцию входных данных, но вы всегда должны быть очень осторожны, когда берете пользовательские данные и используете их для построения SQL-запроса.

...