2009-12-10 4 views
0

Мой url - это что-то вроде: «inventory.php? Sorting = 1» и т. Д. Страница загружается отлично, но не отображает информацию правильно.Оператор PHP if-then-else не работает

mysql_connect("localhost","user","pass"); 
mysql_select_db("database"); 

if ($sorting == 1){ 
$result = mysql_query("select * from vehicles ORDER BY year DSC"); 
} 
elseif ($sorting == 2){ 
$result = mysql_query("select * from vehicles ORDER BY make DSC"); 
} 
elseif ($sorting == 3){ 
$result = mysql_query("select * from vehicles ORDER BY miles DSC"); 
} 
elseif ($sorting == 4){ 
$result = mysql_query("select * from vehicles ORDER BY downpay DSC"); 
} 
elseif ($sorting == 5){ 
$result = mysql_query("select * from vehicles ORDER BY pricepay DSC"); 
} 
elseif ($sorting == 6){ 
$result = mysql_query("select * from vehicles ORDER BY pricecash DSC"); 
} 
else { 
$result = mysql_query("select * from vehicles"); 
} 

while($r=mysql_fetch_array($result)) 
+0

В ваших SQL-утверждениях вместо «DSC» должно быть «DESC». – halfdan

+4

** Не хочет работать ** это не описание проблемы! – SilentGhost

+0

** Вы должны отключить суперглобалы! ** –

ответ

5

Вам нужно заменить $sorting с $_GET["sorting"]

но, также:

не было бы лучшей идеей использовать switch заявление?

switch($_GET["sorting"]{ 
    case 1: 
    $result = mysql_query("select * from vehicles ORDER BY year DSC"); 
    break; 
case 2: 

т.д.

+0

+1, переключатель сделает это soooo намного проще :-) –

+0

Другие решения объясняют потенциал использования '$ sorting = $ _GET [" sorting "];' - но вы можете сохранить кодовое пространство, просто включив '$ _GET ["sorting"]; '- не нужно тратить другое имя var на то, что является неизменным. –

+0

+1 для поиска проблемы и предлагающего переключателя (@Daniel - yep, имена переменных - очень ограниченный ресурс. Сохраните эти переменные!)) –

4

Короткий ответ: Заменить $sorting с $_GET["sorting"], или добавить $sorting = $_GET['sorting']; в верхней части вашего кода.

Длинный ответ: Да, register_globals давно использовался для автоматического внесения параметров URL в качестве переменных. Это приводит к множеству проблем безопасности (приведенная выше ссылка содержит пример), поэтому по умолчанию она была отключена (PHP 4.2.0). В PHP 6 эта опция больше не существует. Таким образом, вам необходимо явно обращаться к параметрам GET URL через $_GET или $_REQUEST.

В качестве альтернативы вы можете явно импортировать свои параметры URL в локальные переменные с помощью команды import_request_variables.

2

Есть некоторые

$sorting = $_GET['sorting']; 

где-то в вашем коде? Он не получит значение автоматически.

2

Добавить эту строку в начале вашего кода.

$sorting = $_REQUEST['sorting']; 
2

Почему бы не использовать switch:

switch ($sorting) { 
    case 1: 
     $result = mysql_query("select * from vehicles ORDER BY year DSC"); 
     break; 
    case 2: 
     $result = mysql_query("select * from vehicles ORDER BY make DSC"); 
     break; 
    // ... 
    default: 
     $result = mysql_query("select * from vehicles"); 
     break; 
} 

Кроме того, убедись, что $sorting назначаются:

$sorting = $_GET['sorting']; // Place somewhere before the switch 
2

Вы должен получить переменные в $ сортировки из массива $ _GET. Я также хотел бы переписать его в качестве переключателя заявление, как это:

switch($_GET['sorting']) 
{ 
    case 1: 
    $result = mysql_query("select * from vehicles ORDER BY year DSC"); 
    brek; 

    case 2: 
    $result = mysql_query("select * from vehicles ORDER BY make DSC"); 
    break; 

    ... 

    default: 
    $result = mysql_query("select * from vehicles"); 
    break; 
} 
8

Почему бы не просто использовать имя поля в качестве переменной GET?

$sortField = $_GET['sorting']; 
// Ensure we don't get any SQL injection: 
$validFields = array('year', 'make', 'miles' ... 'pricecash'); 


$sql = "select * from vehicles"; 

if(in_array($sortField, $validFields)){ 
    $sql .= ' ORDER BY ' . $sortField .' DESC'; 
} 

mysql_query($sql); 

, а затем получить доступ к странице с помощью inventory.php? Сортировка = год и т.д.

Это делает более удобным для чтения URL, predicatable и означает, что вы можете поддерживать новые поля, просто добавив их в массив без необходимости для записи новых корпусов коммутаторов.

+0

Хотя это был не вопрос, +1 для действительно полезного ответа. – Heinzi

+0

+1 для аккуратного решения (и для нахождения проблемы, которая заключается в том, что ОП использовал '$ sorting' вместо' $ _GET ["sorting"] '). –

+0

-1 для SQL-инъекции типа "inventory.php? Sorting = year; drop database;" См., Например, 'mysql_real_escape_string' по адресу http://php.net/manual/en/function.mysql-real-escape-string.php – Arjan

3

И сделать это лучше, вы можете сделать это:

$sortBy = ''; 
switch($_GET["sorting"]{ 
    case 1: 
    $sortBy = 'year'; 
    break; 
    case 2: 
    $sortBy = 'make'; 
    break; 
    //... 
} 

if(!empty($sortBy)) { 
    $result = mysql_query('select * from vehicles ORDER BY ' . $sortBy . ' DSC'); 
} 
else { 
    $result = mysql_query('select * from vehicles'); 
} 

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

2

вы можете использовать $_GET['sorting'] или $_REQUEST['sorting'] если он может прийти в любой из get или post, но почему бы не сделать это?

$query = "SELECT * FROM `vehicles`"; 

$sort_values = array(1 => 'year', 'make', 'miles', 'downpay', 'pricepay', 'pricecash'); 
$sort_number = $_GET['sorting']; 
if($sort_number <= count($sort_values)) { 
    $query .= " ORDER BY `{$sort_values[ $sort_number ]}` DESC"; 
} 

$result = mysql_query($query); 

отмечают, что 1 => часть массива потому, что вы 1 индексированные список запросов.
Причина для причины <= по этой причине тоже - если вы проиндексировали ее 0, вы просто используете <.

Возможно, это пока не похоже, но вы быстро узнаете, что стоит попробовать и найти способы писать меньше кода. Использование массива означает, что вам не нужно копировать/вставлять какой-либо код (многократно записывая $result = mysql_query(...); и т. Д.), И практически невозможно добавить новые столбцы в таблицу, если вам когда-либо понадобится отобразить больше информации.

Можно даже получить имена столбцов непосредственно из базы данных и не трогать этот код еще раз.

Смежные вопросы