Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите разобраться

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Andrey
Отправлено: 10 Сентября, 2007 - 23:49:04
Post Id


Новичок


Покинул форум
Сообщений всего: 58
Дата рег-ции: Май 2007  


Помог: -1 раз(а)




Задача такая: на сайте есть форма поиска. Человек вводит в поле поиска артикул или часть артикула товара и ему необходимо предоставить список товара, в артикуле которого встречается то, что он ввел в поле поиска.
Из формы методом POST забирается то, что человек ввёл ($artorname) и передаётся на обработку скрипту find.php.
find.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. @ $artorname=mysql_escape_string(stripslashes($_POST['artorname']));
  4. include('class.eshop.php');
  5. $eshop=new EshopDB();
  6. $product_array=$eshop->find($artorname);
  7. $np=$eshop->np;
  8. $eshop->display_product_find($product_array);
  9. $eshop->page_idx();
  10. ?>
  11.  


class.eshop.php
PHP:
скопировать код в буфер обмена
  1.  
  2. function find($artorname)
  3. {                              
  4. $sql="select * from product where  product_articul LIKE '%".$artorname."%'";
  5. $res=$this->conn->query($sql);
  6. $num_product=$res->num_rows;
  7. $this->np=ceil($num_product / $this->MAX_COUNT);
  8. @ $page = intval($_GET['page']);
  9. if ($page < 1 || $page > $this->np) {$page = 1; }
  10. $sql='SELECT * FROM product where product_on_off=0 AND product_articul LIKE "%'.$artorname.'%"
  11. ORDER BY product_articul LIMIT '.(($page - 1) * $this->MAX_COUNT).', '.$this->MAX_COUNT;               
  12. $res=$this->conn->query($sql);
  13. if (!$res)
  14. return false;
  15. $num_product=$res->num_rows;
  16. if ($num_product==0)
  17. return false;
  18. $res=$this->db_result_to_array($res);
  19. return $res;
  20. return $np;}
  21.  
  22. function db_result_to_array($res) {
  23. $res_array=array();
  24. for ($count=0; $row= $res->fetch_assoc(); $count++)
  25. $res_array[$count] = $row;
  26. return $res_array;
  27.                                            }
  28.  
  29. function page_idx()
  30. {
  31. @ $page = intval($_GET['page']);
  32. echo 'Страницы: ';
  33. for ($i = 1; $i <= $this->np; $i++) {
  34. if (@ $page != $i) {
  35.  print '<a href="?page='.$i.'"> ['.$i.']</a>  ';}
  36. else {  print '<b>>'.$i.'<</b> '; }
  37. }      
  38.  


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

товар 1
товар 2
.......

Страницы: [1][2][3]....

Но когда я нажимаю на 2, 3 и т. д. страницы, браузер мне сбрасывает фильтр, а высыпает весь товар из базы.
То есть, допустим, в базе 100 единиц товара, условию поиска удолетворяют 10. На странице выводим по 4 единицы товара. В итоге для начала получаем 25 страниц - всё отображается корректно: [1][2][3]....[25]. Когда щёлкаешь на каждую из страниц - всё правильно. После ввода условия отображаются [1][2][3] - это тоже всё хорошо. Но, когда щёлкаю на [2] или [3] получаю:
[1][2][3]....[25].


 
 Top
valenok Модератор
Отправлено: 11 Сентября, 2007 - 06:40:43
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




PHP:
скопировать код в буфер обмена
  1. function page_idx()
  2.  {
  3. global $artorname;
  4.  @ $page = intval($_GET['page']);
  5.  echo 'Страницы: ';
  6.  for ($i = 1; $i <= $this->np; $i++) {
  7.  if (@ $page != $i) {
  8.   print '<a href="?page='.$i.'&artorname='.$artorname.'"> ['.$i.']</a>  ';}
  9.  else {  print '<b>>'.$i.'<</b> '; }
  10.  }     
  11.  


PHP:
скопировать код в буфер обмена
  1.  
  2.  <?PHP
  3.  @ $artorname=mysql_escape_string(stripslashes($_GET['artorname']));
  4.  @ $artorname=mysql_escape_string(stripslashes($_POST['artorname']));
  5.  include('class.eshop.php');
  6.  $eshop=new EshopDB();  
  7.  $product_array=$eshop->find($artorname);
  8.  $np=$eshop->np;
  9.  $eshop->display_product_find($product_array);
  10.  $eshop->page_idx();
  11.  ?>
  12.  


Примерно так


-----
Truly yours, Sasha.
 
My status
 Top
evgenijj
Отправлено: 11 Сентября, 2007 - 09:05:24
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Все правильно. Когда ты формируешь первую страницу результатов поиска, то тебе доступны данные из формы, которую заполнил и отправил пользователь ($_POST["artorname"]). Но на остальных-то страницах результата поиска переменная $_POST["artorname"] не определена. Т.е. твое условие поиска в БД LIKE '' (undefined трактуется в данном контексте как пустая строка) - найти нечто, похоже на пустую строку.

Решение - использовать сессии $_SESSION["artorname"] = $_POST["artorname"]. Или, как предлагает valenok, передавать строку поискового запроса методом GET:
PHP:
скопировать код в буфер обмена
  1.  
  2. if ( isset( $_POST["artorname"] )  )
  3.   $artorname=mysql_escape_string(stripslashes($_POST['artorname']));
  4. else
  5.   $artorname=mysql_escape_string(stripslashes($_GET['artorname']));
  6. ....................................
  7. print '<a href="?page='.$i.'&artorname='.$artorname.'"> ['.$i.']</a>  ';
  8.  
 
 Top
Andrey
Отправлено: 11 Сентября, 2007 - 22:47:57
Post Id


Новичок


Покинул форум
Сообщений всего: 58
Дата рег-ции: Май 2007  


Помог: -1 раз(а)




Огромное спасибо! Всё работает
 
 Top
Andrey
Отправлено: 12 Сентября, 2007 - 22:44:35
Post Id


Новичок


Покинул форум
Сообщений всего: 58
Дата рег-ции: Май 2007  


Помог: -1 раз(а)





Усложняю задачу. Сначала у меня был поиск по артикулу. Теперь я к этой форме добавляю поля поиск по цене "от" ($pricefrom)и "до" ($priceto)

class.eshop.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. ....
  4. function find($artorname, $pricefrom, $priceto)
  5. {              
  6. if($artorname<>"")
  7.         {
  8.         $sql="select * from product where product_on_off=0 AND product_articul LIKE '%".$artorname."%' OR product_title LIKE '%".$artorname."%'";
  9.         $res=$this->conn->query($sql);
  10.         $num_product=$res->num_rows;
  11.         $this->np=ceil($num_product / $this->MAX_COUNT);
  12.         @ $page = intval($_GET['page']);
  13.         if ($page < 1 || $page > $this->np) {$page = 1; }
  14.         $sql='SELECT * FROM product where product_on_off=0 AND product_articul LIKE "%'.$artorname.'%" OR product_title LIKE "%'.$artorname.'%"
  15.                                                 ORDER BY product_articul LIMIT '.(($page - 1) * $this->MAX_COUNT).', '.$this->MAX_COUNT;               
  16.         $_SESSION['find_artorname']=1;
  17.                                 }
  18. elseif ($pricefrom<>"" && $priceto<>"")
  19.                                 {
  20.         $sql="select * from product where product_on_off=0 AND product_price>".$pricefrom."   AND product_price<".$priceto;
  21.         $res=$this->conn->query($sql);
  22.         $num_product=$res->num_rows;
  23.         $this->np=ceil($num_product / $this->MAX_COUNT);
  24.         @ $page = intval($_GET['page']);
  25.         if ($page < 1 || $page > $this->np) {$page = 1; }
  26.         $sql='SELECT * FROM product where product_on_off=0 AND product_price>'.$pricefrom.'   AND product_price<'.$priceto.'
  27.                                                 ORDER BY product_articul LIMIT '.(($page - 1) * $this->MAX_COUNT).', '.$this->MAX_COUNT;               
  28.            $_SESSION['find_price']=1;
  29.                                 }
  30.           $res=$this->conn->query($sql);                     <--------------- 648 строка
  31.           if (!$res)
  32.         return false;
  33.         $num_product=$res->num_rows;
  34.         if ($num_product==0)
  35.         return false;
  36.         $res=$this->db_result_to_array($res);
  37.         return $res;
  38.         return $np;
  39. }
  40.  
  41.    function page_find()  
  42.   {  
  43.  global $artorname;
  44.  
  45.   @ $page = intval($_GET['page']);  
  46.   echo 'Страницы: ';  
  47.   for ($i = 1; $i <= $this->np; $i++) {  
  48.   if (@ $page != $i) {  
  49.    print '<a href="?page='.$i.'&artorname='.$artorname.'"> ['.$i.']</a>  ';}  
  50.   else {  print '<b>>'.$i.'<</b> '; }  
  51.   }
  52.   }
  53.  
  54.     function page_find_price()
  55.         {  
  56.  global $pricefrom;
  57.  global $priceto;
  58.  
  59.   @ $page = intval($_GET['page']);  
  60.   echo 'Страницы: ';  
  61.   for ($i = 1; $i <= $this->np; $i++) {  
  62.   if (@ $page != $i) {  
  63.    print '<a href="?page='.$i.'&pricefrom='.$pricefrom.'&priceto='.$priceto.'"> ['.$i.']</a>  ';}  
  64.   else {  print '<b>>'.$i.'<</b> '; }  
  65.   }
  66.   }
  67. ....
  68. ?>
  69.  


find.php
PHP:
скопировать код в буфер обмена
  1.  
  2. include('class.eshop.php');
  3. $eshop=new EshopDB();
  4. @ $artorname=mysql_escape_string(stripslashes($_GET['artorname']));
  5. @ $agefrom=mysql_escape_string(stripslashes($_GET['agefrom']));
  6. @ $ageto=mysql_escape_string(stripslashes($_GET['ageto']));
  7. @ $pricefrom=mysql_escape_string(stripslashes($_GET['pricefrom']));
  8. @ $priceto=mysql_escape_string(stripslashes($_GET['priceto']));
  9. @ $agefrom=$agefrom*1;
  10. @ $ageto=$ageto*1;
  11. $product_array=$eshop->find($artorname, $agefrom, $ageto, $pricefrom, $priceto);
  12. $np=$eshop->np;
  13. $eshop->display_product_find($product_array);
  14. if($_SESSION['find_artorname']==1){ $eshop->page_find(); }
  15. elseif($_SESSION['find_price']==1){ $eshop->page_find_price(); }
  16. ?>
  17.  


Когда в форме поиска я ввожу цену "от" и "до", то всё нормально - выводит мне список товара, удолетворяющий данному условию и страницы [1][2]....
Но когда я нажимаю на какую-нибудь из страниц: [1], [2] и т.д. мне браузер выдает ошибку следущего содержания:

-------------------------------- -------------------------------- -----------------
Notice: Undefined variable: sql in C:Program FilesApache GroupApache2htdocsmyshop05class. eshop.php on line 648
Warning: mysqli::query() [function.mysqli-query]: Empty query in C:Program FilesApache GroupApache2htdocsmyshop05class. eshop.php on line 648
-------------------------------- -------------------------------- ---------------------------

Если же я запускаю по отдельности только форму для поиска по цене, то есть вместо
PHP:
скопировать код в буфер обмена
  1.  
  2. if($_SESSION['find_artorname']==1){ $eshop->page_find(); }
  3. elseif($_SESSION['find_price']==1){ $eshop->page_find_price(); }
  4.  

оставляю
PHP:
скопировать код в буфер обмена
  1.  
  2. if($_SESSION['find_price']==1){ $eshop->page_find_price(); }
  3.  

то всё работает корректно
 
 Top
valenok Модератор
Отправлено: 12 Сентября, 2007 - 23:27:35
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)






-----
Truly yours, Sasha.
 
My status
 Top
evgenijj
Отправлено: 12 Сентября, 2007 - 23:43:59
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Andrey пишет:

Усложняю задачу.


Ты наши знания проверяешь? Улыбка
 
 Top
Andrey
Отправлено: 13 Сентября, 2007 - 20:17:00
Post Id


Новичок


Покинул форум
Сообщений всего: 58
Дата рег-ции: Май 2007  


Помог: -1 раз(а)




evgenijj пишет:
Andrey пишет:

Усложняю задачу.


Ты наши знания проверяешь? Улыбка


Себе усложняю заданиеУлыбка Если бы я сомневался в Ваших знаниях, я бы не писал на форуме. Мне серьёзно нужна помощь. Что я делаю не так?
 
 Top
valenok Модератор
Отправлено: 13 Сентября, 2007 - 20:31:46
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




ну что ты не правильно делаешь ..
Написанно же Empty query
--
что это такое <> ? Поменяй это на !=
--
PHP:
скопировать код в буфер обмена
  1.  
  2. function find($artorname, $pricefrom, $priceto) ...
  3. $product_array=$eshop->find($artorname, $agefrom, $ageto, $pricefrom, $priceto);
  4.  

А сколько параметров find должна принимать?

PHP:
скопировать код в буфер обмена
  1.  
  2.  elseif ($pricefrom<>"" && $priceto<>"")
  3.                                 {
  4.         $sql="select * from product where product_on_off=0 AND product_price>".$pricefrom."   AND product_price<".$priceto;
  5.         $res=$this->conn->query($sql);
  6.         $num_product=$res->num_rows;
  7.         $this->np=ceil($num_product / $this->MAX_COUNT);
  8.         @ $page = intval($_GET['page']);  
  9.         if ($page < 1 || $page > $this->np) {$page = 1; }
  10.         $sql='SELECT * FROM product where product_on_off=0 AND product_price>'.$pricefrom.'   AND product_price<'.$priceto.'
  11.                                                 ORDER BY product_articul LIMIT '.(($page - 1) * $this->MAX_COUNT).', '.$this->MAX_COUNT;                 
  12.             $_SESSION['find_price']=1;
  13.                                 }
  14.  

Этот блок кода я вообще не понял.
Зачем первый запрос для подсчёта колва страниц?
Можено же и со второго посчитать. Один запрос лишний.
Тоже самое касается и первой части функции find



Empty query
Значит $sql имеет вид ""
Значит ни одно из условий выше не было удовлетворено и в переменую sql не запихали значения ..\n\n(Добавление)
А чё у тебя сё как запутанно?
У мнея чтото такое получилось

А это ещё что =)) ?
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $agefrom=$agefrom*1; // =)))))))))))))
  4. $ageto=$ageto*1; // =)))))))))))))
  5.  


-----
Truly yours, Sasha.
 
My status
 Top
evgenijj
Отправлено: 14 Сентября, 2007 - 08:30:21
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




valenok пишет:
Зачем первый запрос для подсчёта колва страниц?
Можено же и со второго посчитать. Один запрос лишний.


На самом деле он не лишний. Первый запрос нужен, чтобы посчитать кол-во строк результата запроса - он используется в блоке LIMIT второго запроса. Без этого постраничную навигацию не построишь. Кол-во строк результатов запроса используется в функциях
page_find()
page_find_price()

PHP:
скопировать код в буфер обмена
  1.  
  2. if($artorname != "")
  3. {
  4.     $sql = "...";
  5.     //................................................
  6. }
  7. elseif ($pricefrom != "" && $priceto != "")
  8. {
  9.     $sql = "...";
  10.     //................................................
  11. }
  12. else
  13. {
  14.     // условия поиска не заданы
  15.     $sql = "SELECT * FROM products WHERE 1";
  16. }
  17. $res=$this->conn->query($sql);                     <--------------- 648 строка
  18. // ..................................................
  19.  
 
 Top
valenok Модератор
Отправлено: 14 Сентября, 2007 - 10:45:30
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Я пока переписывал вразумился что со второго не посчитать..


-----
Truly yours, Sasha.
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB