Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: сортировака данных при выводе из БД
 
 автор: Slo_Nik   (27.10.2009 в 00:32)   письмо автору
 
 

Добрый вечер.
возникла проблема с выводом даннх из БД.
есть каталог продукции, при выводе всех позиций всё работает нормально.
надо сделать сортировку по двум параметрам, цена и производитель.
сделал простенькую, два выпадающих списка и кнопка сортировать.
но проблема в том, что по цене сортирует отлично, а когда надо сортировать по производителю или ни чего не сортирует или вообще ни чего не выводит.
я так понимаю, что ошибка в запросе, но где не могу найти.

<?php 
/* диапазон цен*/
echo "<form >
            <select name='price'>"
;
$arr2 = array("AND `price`<=1000"=>"до 1000",
"AND `price` BETWEEN 1000 AND 5000"=>"от 1000 до 5000",
"AND `price` BETWEEN 5000 AND 10000"=>"от 5000 до 10000",
"AND `price` >10000"=>"от 10000");
echo 
"<option></option>";
foreach(
$arr2 as $k=>$v)
echo 
"<option value='".$k."'>$v</option>";
echo 
"</select>";

/*список производителей*/
echo "<select name='producer'>";
$query1 "SELECT DISTINCT `name_wares` FROM `wares`'";
 
$prod mysql_query($query1);
  if(!
$prod) echo "<p class='error'>Ошибка при выводе названий производителя<br>".mysql_error()."</p>";
   if(
mysql_num_rows($prod) > 0){
   echo 
"<option></option>";
    while(
$producer mysql_fetch_assoc($prod)){
    
/*$a = $producer['name_wares'];*/
    
echo "<option value='AND `name_wares` = ".$producer['name_wares']."'>".$producer['name_wares']."</option>";
    }
   }
echo 
"</select>
          </form>"
;
/*данные о цене и производителе заносятся в переменные*/
$price /* цена */
$producer /* производитель*/
/* подставляются в запрос*/
/* переменная $where = "WHERE `id_section` = '$id_section'";*/
 
$obj = new pager_mysql("*","`wares`","".$where.$price.$producer."","",15,3,"");
?>

так вот, если оставить только переменные $where и $price, всё работает нормально, выводятся все позиции, а при выборе цены, выводятся позиции попадающие под заданный диапазо цен.
но как только подставляю $producer всё перестаёт работать, если убираю $price, то позиции товара выводятся, но не сортируются по производителю.
подскажите, пожалуйста, в чём моя ошибка

  Ответить  
 
 автор: Trianon   (27.10.2009 в 01:28)   письмо автору
 
   для: Slo_Nik   (27.10.2009 в 00:32)
 

какая замечательная иллюстрация к SQL-injection.
Скрипт исполняет инъекции. Прямым эффектом. Ничем другим не занимается.

Послушайте, как можно такое писать?
Ну неужели не сообразить, что если куски SQL-запроса берутся из формы, из запроса браузера, то кто угодно сможет своих собственных запросов понатолкать за милую душу!

  Ответить  
 
 автор: Slo_Nik   (27.10.2009 в 01:46)   письмо автору
 
   для: Trianon   (27.10.2009 в 01:28)
 

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

  Ответить  
 
 автор: Trianon   (27.10.2009 в 02:23)   письмо автору
 
   для: Slo_Nik   (27.10.2009 в 01:46)
 

полагаю, что ошибка где-то здесь:
/*данные о цене и производителе заносятся в переменные*/
$price /* цена */
$producer /* производитель*/
/* подставляются в запрос*/
/* переменная $where = "WHERE `id_section` = '$id_section'";*/


Я не нашел ни одного оператора, который бы чего-то заносил в переменные.
А для того чтобы нащупать её, имеет смысл сборную солянку, перед тем как в функцию передавать, напечатать сперва.

  Ответить  
 
 автор: Slo_Nik   (27.10.2009 в 02:54)   письмо автору
 
   для: Trianon   (27.10.2009 в 02:23)
 

так как данные передаются методом $_POST я присваивал значение переменным так

<?php
if(isset($_POST['sub'])){
  
/* цена */
 
if(!empty($_POST['price'])){
 
$price $_POST['price'];
 }
 else{
$price "";}
/* производитель */
  
if(!empty($_POST['producer'])){
  
$producer $_POST['producer'];
  }
  else {
$producer "";}
}
?>
/* перед подстановкой в запрос вывожу переменные, что бы видеть что им присвоено */
echo $where."<br>";// вижу WHERE `id_section` = '1'
echo $price."<br>";// вижу AND `price`<=1000
echo $producer; // вижу  AND `name_wares` = Sorolamp
/* если переменным $price и $producer ни чего не присвоено, то ни чего не выводится, как и положено.
если выбрана одна из переменных, то выводится её значение, другая переменная пустая.
переменная $where всегда имеет значение. */

  Ответить  
 
 автор: Slo_Nik   (27.10.2009 в 02:55)   письмо автору
 
   для: Trianon   (27.10.2009 в 02:23)
 

так как данные передаются методом $_POST я присваивал значение переменным так

<?php
if(isset($_POST['sub'])){
  
/* цена */
 
if(!empty($_POST['price'])){
 
$price $_POST['price'];
 }
 else{
$price "";}
/* производитель */
  
if(!empty($_POST['producer'])){
  
$producer $_POST['producer'];
  }
  else {
$producer "";}
}

/* перед подстановкой в запрос вывожу переменные, что бы видеть что им присвоено */
echo $where."<br>";// вижу WHERE `id_section` = '1'
echo $price."<br>";// вижу AND `price`<=1000
echo $producer// вижу  AND `name_wares` = Sorolamp
/* если переменным $price и $producer ни чего не присвоено, то ни чего не выводится, как и положено.
если выбрана одна из переменных, то выводится её значение, другая переменная пустая.
переменная $where всегда имеет значение. */
?>

  Ответить  
 
 автор: Trianon   (27.10.2009 в 03:06)   письмо автору
 
   для: Slo_Nik   (27.10.2009 в 02:55)
 

Весь запрос надо выводить.
Вот теперь выведите $where.$price.$producer
И увидите
WHERE `id_section` = '1'AND `price`<=1000AND `name_wares` = Sorolamp

И по-Вашему это можно выполнить?

  Ответить  
 
 автор: Slo_Nik   (27.10.2009 в 03:23)   письмо автору
 
   для: Trianon   (27.10.2009 в 03:06)
 

переписал с

<?php 
 $obj 
= new pager_mysql("*","`wares`","".$where.$price.$producer."","",15,3,"");
?>

на

<?php 
$obj 
= new pager_mysql("*","`wares`","".$where." ".$price." ".$producer."","",15,3,"");
?>

ни помогло

  Ответить  
 
 автор: Trianon   (27.10.2009 в 03:45)   письмо автору
 
   для: Slo_Nik   (27.10.2009 в 03:23)
 

Весь запрос надо выводить!

  Ответить  
 
 автор: Trianon   (27.10.2009 в 03:08)   письмо автору
 
   для: Slo_Nik   (27.10.2009 в 02:55)
 

>так как данные передаются методом $_POST я присваивал значение переменным так
>$producer = $_POST['producer'];

Где именно Вы их присваивали?

У Вас там переменная $producer применяется всяко не с той целью. И не с тем значением.

  Ответить  
 
 автор: Slo_Nik   (27.10.2009 в 03:26)   письмо автору
 
   для: Trianon   (27.10.2009 в 03:08)
 

>У Вас там переменная $producer применяется всяко не с той целью. И не с тем значением.

а с какой?

$producer присваивается значение $_POST['producer']

или что то я упустил?

  Ответить  
 
 автор: Trianon   (27.10.2009 в 03:44)   письмо автору
 
   для: Slo_Nik   (27.10.2009 в 03:26)
 

здесь:
while($producer = mysql_fetch_assoc($prod)){

  Ответить  
 
 автор: Slo_Nik   (27.10.2009 в 04:07)   письмо автору
2.8 Кб
 
   для: Trianon   (27.10.2009 в 03:44)
 

поменял имя переменной, просмотрел всё в который раз, но так и не добился результата....
с сортировкой по цене ни каких проблем, а вот с сортировкой по производителю.... ни как не могу заставить работать,а веренее не знаю как.
может опять что то упустил.
прикрепил файл.

  Ответить  
 
 автор: Slo_Nik   (27.10.2009 в 05:40)   письмо автору
 
   для: Trianon   (27.10.2009 в 03:44)
 

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

<?php 
// БЫЛО 
echo "<option value=' AND `name_wares` = ".$producer['name_wares']." '>".$producer['name_wares']."</option>";
// ПЕРЕПИСАЛ
echo "<option value=' AND `name_wares` = \"".$producer['name_wares']."\" '>".$producer['name_wares']."</option>";
?>

когда подставлял в запрос, пришлось применить к переменной $prodr stripslashes() после этого заработало, хотя, как я понимаю это не правильно.
но пока, самое главное, что работает, теперь надо довести всё до ума...

  Ответить  
 
 автор: Trianon   (27.10.2009 в 12:42)   письмо автору
 
   для: Slo_Nik   (27.10.2009 в 05:40)
 

У Вас тема называется "сортировка" , в чуть ли не каждом сообщении сортировку упоминаете...
Где сортировка-то?

  Ответить  
 
 автор: Slo_Nik   (27.10.2009 в 13:26)   письмо автору
 
   для: Trianon   (27.10.2009 в 12:42)
 

ну а как бы Вы назвали то, что мне нужно?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования