PHP ORDER BY, DESC, LIMIT

Я надеюсь на некоторую помощь: я пытаюсь вывести таблицу данных mysql, которую пользователи могут просматривать и упорядочивать по различным полям выбора. Я хочу, чтобы данные автоматически упорядочивались по дате (сначала самые новые) и ограничивались 10 результатами на страницу.

У меня есть следующий фрагмент сценария (я усекал его для краткости с удовольствием отправляю больше, если необходимо)...

<!-- **** THIS CODE CREATES THE FORM ****-->
<form id="form1" name="form1" method="post" action="deals.php"><code>&lt;!-- **** THIS CODE IS FOR THE "FROM" DATE ****--&gt;
&lt;label for="from"&gt;From&lt;/label&gt;
" /&gt;
Results will only show offers that have been listed since this date. Leave blank for all offers.

&lt;!-- **** THIS CODE IS FOR THE "TO" DATE ****--&gt;

&lt;label for="to"&gt;To&lt;/label&gt;
"/&gt;
Results will only show offers that run until this date. Leave blank for all offers.

&lt;label&gt;Country&lt;/label&gt;
&lt;select name="country"&gt;
&lt;option value=""&gt;--Any--&lt;/option&gt;
&lt;!--?php
 $sql = "SELECT * FROM ".$SETTINGS["data_table"]." GROUP BY country ORDER BY country";
 $sql_result = mysql_query ($sql, $connection ) or die ('request "Could not execute SQL query" '.$sql);
 while ($row = mysql_fetch_assoc($sql_result)) {
 echo "&lt;option value='".$row["country"]."'".($row["country"]==$_REQUEST["country"] ? " selected" : "")."--&gt;".$row["country"]."";
 }
?&gt;
&lt;/select&gt;
Only shows offers from the selected country.</code> <p>//*****************************************//***** ** ПОВТОРЯТЬСЯ ДЛЯ КАЖДОЙ ПЕРЕМЕННОЙ (Я ДОЛЖЕН СДЕЛАТЬ ЭТО, ЧТО ТАКОЕ ЧЕРЕЗ ЧЕРЕЗ *******************************//*****************************************</p> <pre class="prettyprint linenums">if ($_REQUEST["from"]<>'' and $_REQUEST["to"]<>'') 
{
$sql = "SELECT * FROM ".$SETTINGS["data_table"]." WHERE from_date >= ' ORDER BY from_date DESC LIMIT 0, 10 ".mysql_real_escape_string($_REQUEST["from"])."' AND to_date <= '".mysql_real_escape_string($_REQUEST["to"])."'".$search_Seller.$search_country.$search_id.$search_Offer.$search_Item.$search_Description.$search_Brand.$search_Was.$search_Now;
}


else if ($_REQUEST["from"]<>'') 
{$sql = "SELECT * FROM ".$SETTINGS["data_table"]." WHERE from_date >= ' ORDER BY from_date DESC LIMIT 0, 10".mysql_real_escape_string($_REQUEST["from"])."'".$search_Seller.$search_country.$search_id.$search_Offer.$search_Item.$search_Description.$search_Brand;
}


else if ($_REQUEST["to"]<>'') 
{$sql = "SELECT * FROM ".$SETTINGS["data_table"]." WHERE to_date <= ' ORDER BY date_time DESC LIMIT 0, 10".mysql_real_escape_string($_REQUEST["to"])."'".$search_Seller.$search_country.$search_id.$search_Offer.$search_Item.$search_Description.$search_Brand.$search_Was.$search_Now;}

else {$sql = "SELECT * FROM ".$SETTINGS["data_table"]." ORDER BY from_date DESC LIMIT 0, 10 ".$search_Seller.$search_country.$search_id.$search_Offer.$search_Item.$search_Description.$search_Brand.$search_Was.$search_Now;
}

Это отлично работает при выводе исходной таблицы, однако, как только пользователи вводят какие-либо данные, я получаю ошибку

"request "Could not execute SQL query" SELECT * FROM newoffers ORDER BY from_date DESC LIMIT 0, 10 AND country='UK'"

Так что я предполагаю, что есть проблема с синтаксисом? Я попытался переустановить финальную часть, чтобы она читала:

else {$sql = "SELECT * FROM ".$SETTINGS["data_table"]. .$search_Seller.$search_country.$search_id.$search_Offer.$search_Item.$search_Description.$search_Brand.$search_Was.$search_Now; "ORDER BY from_date DESC LIMIT 0, 10";
}

РЕЗУЛЬТАТ: Ошибка анализа: синтаксическая ошибка, неожиданное значение '"ORDER BY from_date DESC LIMIT' (T_CONSTANT_ENCAPSED_STRING) in/home/iratebjj/public_html/dealstest.php on line 267

Пожалуйста, ознакомьтесь с http://www.iratebjj.com/dealstest.php, чтобы увидеть скрипт в действии. Если у кого-то есть предложения, я действительно ценю это!

Благодарю!

Надеюсь, что этот пост в порядке. Я думаю, что я следил за всеми рекомендациями!

2 ответа

Вот ваша ошибка

$search_Now; "ORDER BY from_date DESC LIMIT 0, 10";

Вы должны конкатенировать "ORDER BY from_date DESC LIMIT 0, 10" после $search_Now и добавить пробел

$search_Now." ORDER BY from_date DESC LIMIT 0, 10"

Вам также нужно добавить условие WHERE 1 = 1 после $SETTINGS["data_table"] поскольку следующие переменные, похоже, начинаются с AND: $search_Seller, $search_country, $search_id, $search_Offer, $search_Item, $search_De‌​scription, $search_Brand, $search_Was, $search_Now.

Последний else блок должен быть следующим

else {
 $sql = "SELECT * FROM ".$SETTINGS["data_table"]." WHERE 1 = 1 ";
 $sql .= $search_Seller.$search_country.$search_id.$search_Offer.$search_Item.$search_Description.$search_Brand.$search_Was.$search_Now." ORDER BY from_date DESC LIMIT 0, 10";
}


Ваше формирование запроса неверно. Условие AND country='UK' должно идти в состоянии WHERE а не после предложения ORDER BY

SELECT * 
FROM newoffers 
WHERE country='UK'
ORDER BY from_date DESC 
LIMIT 0, 10;

licensed under cc by-sa 3.0 with attribution.