PDA

Zobacz pełną wersję : Wyrzucany błąd w pętli.



Finarfin
22-09-2008, 17:04
Poniższy plugin nie działa mi tak jak należy. Otóż cały czas otrzymuję:
Warning: Invalid argument supplied for foreach() in /var/www/Joomla/plugins/search/produkty.php on line 88

Nie mam jednak bladego pojęcia dlaczego tak się dzieje. Kod dostępny tutaj:
http://pastebin.com/m4f051de9

Będę wdzieczny z uzyskanej pomocy.

Jola
23-09-2008, 03:48
Witam,
przyczyną może być błędne zapytanie do bazy danych. Jest:

$query = 'SELECT a.nazwa AS nazwa, a.opis AS opis,'
. ' a.id END as slug, '
. ' b.catid END AS catslug, '
. ' FROM #__produkty AS a'
. ' INNER JOIN #__kategorie AS b ON b.catid = a.catid'
. ' WHERE ( a.nazwa LIKE '.$text
. ' OR a.opis LIKE '.$text
. ' GROUP BY a.id'
. ' ORDER BY '. $order
;Powinno być (zakładając, że tabele z kolumnami użyte w zapytaniu istnieją w bazie danych):

$query = 'SELECT a.nazwa AS nazwa, a.opis AS opis,'
. ' a.id as slug, '
. ' b.catid AS catslug '
. ' FROM #__produkty AS a'
. ' INNER JOIN #__kategorie AS b ON b.catid = a.catid'
. ' WHERE ( a.nazwa LIKE '.$text
. ' OR a.opis LIKE '.$text
. ' GROUP BY a.id'
. ' ORDER BY '. $order
;Pozdrawiam.

Finarfin
23-09-2008, 12:51
Usunięcie tych END i "," niestety nie pomogło. Problem w dalszym ciągu występuje...

Struktura bazy jos_produkty wygląda tak:


mysql> select * from jos_produkty;
+----+-------+-----------------+-----------------------+-----------+--------+--------+
| id | catid | nazwa | opis | published | image1 | image2 |
+----+-------+-----------------+-----------------------+-----------+--------+--------+
| 20 | 2 | Testowy produkt | Produkt 2 | 1 | | |
| 19 | 2 | Zawieszka du?a | zawieszka standardowa | 1 | | |
+----+-------+-----------------+-----------------------+-----------+--------+--------+
2 rows in set (0.00 sec)

jos_kategorie:


mysql> select * from jos_kategorie;
+-------+-------------------------------------+----------+-----------+
| catid | catname | alias | published |
+-------+-------------------------------------+----------+-----------+
| 2 | luzem | luz | 1 |
| 3 | w bloczkach | blok | 1 |
| 4 | w rolkach | rolka | 1 |
| 5 | Systemy zawiesze?, listwy plakatowe | zaw_plak | 1 |
+-------+-------------------------------------+----------+-----------+
4 rows in set (0.00 sec)

hesar
23-09-2008, 12:54
sprobuj to zapytanie (oczywiscie uzupelnione o zmienne) wrzucic do phpmyadmina
ciekawe co ci zwroci i czy w ogole sie wykona

Finarfin
23-09-2008, 13:32
Dla testu:


mysql> select a.nazwa as nazwa, a.id as slug from jos_produkty as a where a.nazwa like '%testowy%' ;
+-----------------+------+
| nazwa | slug |
+-----------------+------+
| Testowy produkt | 20 |
+-----------------+------+
1 row in set (0.00 sec)
Czyli zwraca...

Albo


mysql> select a.nazwa as nazwa, a.opis as opis, a.id as slug, b.catid as catslug from jos_produkty as a inner join jos_kategorie as b on b.catid=a.catid where (a.nazwa like '%testowy%' or a.opis like '%standardowa') group by a.id ;
+-----------------+-----------------------+------+---------+
| nazwa | opis | slug | catslug |
+-----------------+-----------------------+------+---------+
| Zawieszka du?a | zawieszka standardowa | 19 | 2 |
| Testowy produkt | Produkt 2 | 20 | 2 |
+-----------------+-----------------------+------+---------+
2 rows in set (0.00 sec)

hesar
23-09-2008, 13:47
no to sprobuj zakomentowac chwilo ten foreach i wypluj sobie zmienna $rows czy aby na pewno dostajesz z zapytania tablice (foreach wymaga tablicy i wyglada na to z komunikatu ze takowej nie dostaje)

Finarfin
23-09-2008, 18:02
W sensie że mam do tego pliku przed return $rows, dać echo $rows?

Jak tak dałem to nie mam nic...w sensie nic nie otrzymałem.

vego007
23-09-2008, 19:54
Możesz dać echo na query i wtedy wyświetli Ci zapytanie na stronie. Wklej je do phpmyadmin i zobaczysz czy sypnie błędem. Jeśli tak to trzeba to naprawić. Jeśli nie to znaczy, że zapytanie zwraca pustą tablicę do foreach. Wtedy foreach można dać w


if(count($tab)>0){ tu foreach}

Finarfin
23-09-2008, 20:11
Hmm...chyba ja czegoś nie rozumiem...jak dałem echo na query(dosłownie...w sensie wpierw mam ustalone query, a potem echo $query) to na stronce wyświetla:

SELECT a.nazwa AS nazwa, a.opis AS opis, a.id as slug, b.catid AS catslug FROM #__produkty AS a INNER JOIN #__kategorie AS b ON b.catid = a.catid WHERE ( a.nazwa LIKE '%testowy produkt%' OR a.opis LIKE '%testowy produkt%' GROUP BY a.id

testowy produkt -> to co chcę wynaleźć :)

Kod najlepiej zamieszczę co zrobiłem:


$query = 'SELECT a.nazwa AS nazwa, a.opis AS opis,'
. ' a.id as slug, '
. ' b.catid AS catslug '
. ' FROM #__produkty AS a'
. ' INNER JOIN #__kategorie AS b ON b.catid = a.catid'
. ' WHERE ( a.nazwa LIKE '.$text
. ' OR a.opis LIKE '.$text
. ' GROUP BY a.id'
;
$db->setQuery( $query, 0, $limit );
$rows = $db->loadObjectList();

foreach($rows as $key => $row) {
$rows[$key]->href = 'index.php?option=com_produkty&view=kategoria&id='.$row->slug;
}
echo $query;
Jeżeli miałem to inaczej zrobić ...proszę poprawić :)

Edit.2. Imho wyrzuciło mi #__produkty, czyli w sumie nie zmieniło poprawnie przedrostków na jos_produkty...powinienem sie martwić? Reszta pluginów też ma z #__...a nie z jos_...

Jola
23-09-2008, 20:32
Szukajcie a znajdziecie, brakuje zamykającego nawiasu:
$query = 'SELECT a.nazwa AS nazwa, a.opis AS opis,'
. ' a.id as slug, '
. ' b.catid AS catslug '
. ' FROM #__produkty AS a'
. ' INNER JOIN #__kategorie AS b ON b.catid = a.catid'
. ' WHERE ( a.nazwa LIKE '.$text
. ' OR a.opis LIKE '.$text
. ' ) GROUP BY a.id'
. ' ORDER BY '. $order
;

Finarfin
23-09-2008, 20:42
Dokładnie!!! Właśnie przed chwilą nawet sam to odkryłem, bawiąc się zapytaniem z var_dump'a :)

Wielkie dzięki :)

Teraz wynajduje, jeszcze dorobić okno, które wyświetla to co znajdę :)

vego007
23-09-2008, 20:56
A co do Twojego poprzedniego pytania to nie ma co się martwić, bo query jest stringiem podanym przez Ciebie i nawet nie ma jak zmienić się z #__ do jos_. Zamiana jest później w funkcjach obsługujących bazę danych

Finarfin
24-09-2008, 00:30
Dobrze takie rzeczy wiedzieć ;) Przyda się na przyszłość.

Ten temat można uznać za rozwiązany.