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
Форумы портала PHP.SU :: Версия для печати :: Хлебные крошки или массив не массив
Форумы портала PHP.SU » PHP » Программирование на PHP » Хлебные крошки или массив не массив

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

1. Virtual1387 - 27 Августа, 2010 - 17:40:31 - перейти к сообщению
Друзья,

вы мне очень помогли в прошлый раз, помогите и в этот Улыбка

Пишу "хлебные крошки" в выводе каталога. Заранее прошу прощения за страшные названия переменных.
PHP:
скопировать код в буфер обмена
  1.  
  2. //Рисуем хлебные крошки
  3. echo "<div id=\"kroshki\"><a href=\"".$GLOBALS['home']."\">Каталог</a> >\n";
  4.  
  5.        
  6.         $k_id=$_GET['cat_id'];
  7.  
  8.        
  9.         $parent_category=mysql_query("SELECT * FROM catalog WHERE id LIKE $k_id");
  10.         $par_category=mysql_fetch_array($parent_category, MYSQL_ASSOC);
  11.         $k_id=$par_category['parent_id'];      
  12.        
  13.         while ($k_id > -1) {
  14.         $k_temp=mysql_query("SELECT * FROM catalog WHERE id LIKE $k_id");
  15.         $k_temp_catdata=mysql_fetch_array($k_temp, MYSQL_ASSOC);
  16.         $catidd=$k_temp_catdata['id'];
  17.         $catname=$k_temp_catdata['name'];
  18.         $k_kategorii=array('id'=>$catidd,'name'=>$catname);
  19.         $k_id=$k_temp_catdata['parent_id'];
  20.  
  21.         }
  22.        
  23.         if ($cat_id > -1){
  24.         $k_kategorii=array_reverse($k_kategorii);
  25.         foreach ($k_kategorii as $key => $k_val) {
  26.         echo "<a href=\"".$GLOBALS['name']."index.php?cat_id=".$k_val['id']."\">".$k_val['name']."</a> >\n";
  27.         }
  28. }
  29.  
  30.  
  31. //Пишем название текущей категории
  32.         $catn=mysql_query("SELECT * FROM catalog WHERE id LIKE $cat_id");
  33.         $catname=mysql_fetch_array($catn, MYSQL_ASSOC);
  34.         echo $catname["name"]."\n";    
  35.        
  36. echo "</div>\n";               
  37. //Написали название текущей категории
  38. //Нарисовали хлебные крошки
  39.  


В логе после выполнения три ошибки:
1) PHP Notice: Undefined variable: k_kategorii in catalog.php on line 24
2) PHP Warning: array_reverse() [<a href='function.array-reverse'>function.array-reverse</a>]: The argument should be an array in catalog.php on line 24
3) PHP Warning: Invalid argument supplied for foreach() in /Applications/MAMP/htdocs/hp.ant ex.ru2/catalog.php on line 25

Объясните, что не так?
Может кто-либо знает как оптимизировать скрипт?
2. alexspb - 27 Августа, 2010 - 18:27:46 - перейти к сообщению
Undefined variable
в начале скрипта стоит добавить:
PHP:
скопировать код в буфер обмена
  1. if( $_SERVER['REMOTE_ADDR'] == '127.0.0.1' ){
  2.         Error_Reporting( E_ALL & ~E_NOTICE );
  3. }else{
  4.         Error_Reporting( 0 );
  5. }

второе и третье, смотрите что передаете, ведь пишет по русски
The argument should be an array - должен быть массивом
Invalid argument supplied for foreach() - тоже не массив, цикл и выдает ошибку

смотрите как массивы формируются
3. JustUserR - 27 Августа, 2010 - 18:34:06 - перейти к сообщению
Virtual1387 По приведенным сообщениям об ошибках и предупреждения можно судить о том что в вашем PHP-скрипте функция array_reverse не может осуществить свои дейтсвия по той причине что ей предоставлен неправилный аргумент - как правило при работе с чистыми ассоцитативными массивами этой фукнции можно передать второй агрумент true для сохранения ключей
Кроме того причина может быть в ошибке в самом SQL-запросе - в частности передаваемый оператору LIKE операнд с правой стороны должен быть строкой в правильном виде - относительно уровня экранирования по символьным подстановкам
4. Virtual1387 - 27 Августа, 2010 - 18:36:18 - перейти к сообщению
alexspb пишет:
Undefined variable
в начале скрипта стоит добавить:
PHP:
скопировать код в буфер обмена
  1. if( $_SERVER['REMOTE_ADDR'] == '127.0.0.1' ){
  2.         Error_Reporting( E_ALL & ~E_NOTICE );
  3. }else{
  4.         Error_Reporting( 0 );
  5. }

второе и третье, смотрите что передаете, ведь пишет по русски
The argument should be an array - должен быть массивом
Invalid argument supplied for foreach() - тоже не массив, цикл и выдает ошибку

смотрите как массивы формируются


в том то и дело,
я уверен в том, что передаю фукциям в качестве аргумента именно массив.
вот где он формируется

PHP:
скопировать код в буфер обмена
  1. $k_kategorii=array('id'=>$catidd,'name'=>$catname);


а вот кде вызывается в качестве аргумента
PHP:
скопировать код в буфер обмена
  1. $k_kategorii=array_reverse($k_kategorii);


и

PHP:
скопировать код в буфер обмена
  1. #
  2. foreach ($k_kategorii as $key => $k_val) {
  3. #
  4.        echo "<a href=\"".$GLOBALS['name']."index.php?cat_id=".$k_val['id']."\">".$k_val['name']."</a> >\n";
  5. #
  6.        }



Где же ошибка?
5. JustUserR - 27 Августа, 2010 - 18:49:07 - перейти к сообщению
Virtual1387
JustUserR пишет:
Как правило при работе с чистыми ассоцитативными массивами этой фукнции <array_reverse> можно передать второй агрумент true для сохранения ключей
Можете посмотреть более подробное описание здесь http://www.php.su/functions/?array_reverse
6. Virtual1387 - 27 Августа, 2010 - 18:54:41 - перейти к сообщению
JustUserR пишет:
Virtual1387 По приведенным сообщениям об ошибках и предупреждения можно судить о том что в вашем PHP-скрипте функция array_reverse не может осуществить свои дейтсвия по той причине что ей предоставлен неправилный аргумент - как правило при работе с чистыми ассоцитативными массивами этой фукнции можно передать второй агрумент true для сохранения ключей
Кроме того причина может быть в ошибке в самом SQL-запросе - в частности передаваемый оператору LIKE операнд с правой стороны должен быть строкой в правильном виде - относительно уровня экранирования по символьным подстановкам


Предаваемый операнд справа от LIKE - число. Целое, неотрицательное число, без каких либо спецсимволов. Экранировать там нечего Улыбка
Аргумент true сечас попробую поставить... хм, в логи чисто. только вот почему-то выглядить мои "хлебные крошки" стали странно (см. прикрепленный файл, выделено красным).
7. alexspb - 27 Августа, 2010 - 21:04:59 - перейти к сообщению
Virtual1387 пишет:
в том то и дело,
я уверен в том, что передаю фукциям в качестве аргумента именно массив.

чтобы быть действительно уверенным, дебажте:
print_r($k_kategorii);

 

Powered by ExBB FM 1.0 RC1