PDA

Zobacz pełną wersję : wlasny komponent kilka pytań o zmienne



ciubas
17-04-2010, 12:31
witam,

piszę własny komponent do obsługi pewnych informacji na stronie.

w bazie mySQL mam coś takiego:


-- Struktura tabeli dla `jos_sklepy`
--

CREATE TABLE `jos_sklepy` (
`id` int(255) NOT NULL auto_increment,
`nazwa` varchar(50) NOT NULL,
`nazwa_cd` varchar(150) NOT NULL,
`adres` varchar(200) NOT NULL,
`mapa` varchar(150) NOT NULL,
`czynne` text NOT NULL,
`nfz` varchar(5) NOT NULL,
`sprzet` varchar(50) NOT NULL,
`dowoz` varchar(5) NOT NULL,
`telefon` varchar(10) NOT NULL,
`woj` varchar(50) NOT NULL,
`pub` varchar(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Zrzut danych tabeli `jos_sklepy`
--

INSERT INTO `jos_sklepy` VALUES (1, 'apteka1', 'apteka_cd', 'adres', 'mapa', 'czynne', 'nfz', 'sprzet', 'dowoz', 'telefon', 'woj', 'pub');
INSERT INTO `jos_sklepy` VALUES (2, 'apteka2', 'apteka_cd2', 'adres2', 'mapa2', 'czynne2', 'nfz2', 'sprzet2', 'dowoz', 'telefon2', 'woj2', 'pub2');


// powyższy przykład jest uproszczony dla tego przykładu.

i kod odwołujący się do tego:



$db =& JFactory::getDBO();
$query = "SELECT * FROM #__sklepy";


$db->setQuery($query);

$row = $db->loadAssoc();
//print_r($row);

echo $row[0]['nazwa'];


jak mam pobrać zmienne aby otrzymać je w tablicy jakiej potrzebuję?



po odwołaniu się do $row[0]['nazwa'] dawał mi: apteka


czyli odwołaniu sie do tablicy oddawał mi:
[0]['nazwa'] -> apteka, [0]['nazwa_cd'] -> apteka_cd itd.
[1]['nazwa'] -> apteka2, [0]['nazwa_cd'] -> apteka_cd2 itd.


Lub gdzie tego szukać, z przykładami, bo tak najłatwiej mi się uczyć...

moje
17-04-2010, 13:28
A na docs.joomla.org kolega był? Np. taka fraza jak loadObjectList ;)

ciubas
17-04-2010, 13:42
dzięki! po chwili poszukiwań znalazłem:

http://docs.joomla.org/How_to_use_the_database_classes_in_your_script#loa dObjectList.28.29

wprawdzie są małe błędy (zmienna $result nagle znika i pojawia się $row), ale o to dokładnie mi chodziło!



$db->setQuery($query);
$result = $db->loadObjectList();
print_r($result);


and you can access the individual values by using:


$row['index']->name // e.g. $row['2']->email

czyli w moim przypadku:



$db =& JFactory::getDBO();
$query = "SELECT * FROM #__sklepy";
$db->setQuery($query);
$result = $db->loadObjectList();
//print_r($result);
echo $result[0]->nazwa;

f1xer
18-04-2010, 14:31
Jeżeli spodziewasz się tylko jednego wyniku to lepiej użyj loadObject, jeżeli używasz loadObjectList to warto skorzystać z konstrukcji foreach za pomocą której wyświetlisz wszystkie rekordy.
np:


$db = & JFactory::getDBO();
$query="SELECT * FROM #__sklepy";
$db->setQuery($query);
$wynik=$db->loadObjectList();
foreach ($wynik as $rekord){
echo $rekord->nazwa;
}

ciubas
19-04-2010, 12:35
Akurat ja to robię trochę inaczej:



$irow = $db ->getAffectedRows();

for ($i = 0; $i < $irow; $i++)
{
if ($result[$i]->miasto <> $result[$i-1]->miasto)
{
echo '<h1>'.$result[$i]->miasto.'</h1>';
}
echo '<h2>'.$result[$i]->nazwa .'</h2>';
};


Ale dzięki za tą pętle na pewno sie przyda ;]


Mam jeszcze inne pytanie, natury bezpieczeństwa - chce zrobić tak aby użytkownicy (anonimowi), mogli zgłaszać apteki. Jakiego polecenia użyć (chcę to zapisywać do jednej tabeli, po czym admin edytuje/poprawia i klika publish). Czy tak to może wyglądać, czy sugerujecie inne rozwiązanie?

moje
19-04-2010, 18:38
Ja bym zrobił "poczekalnię" w osobnej tabeli lub w pliku (np.) xml, do tego filtracja treści z tagów html i całych linków.

Odczyt z "poczekalni", po edycji i/lub zaakceptowaniu, zapis w miejsce docelowe, w przypadku odrzucenia, usuniecie z "poczekalni".

ciubas
19-04-2010, 19:15
Po co w innej tabeli tą poczekalnie? Te dane nie będą inne, tylko ograniczone ponieważ użytkownik ma wprowadzić tylko: nazwę sklepu, miasto, ulicę, województwo (rozwijana), sprzęt, numer telefonu oraz myślę coś na boty. A aptek nie będzie więcej niż 100-200 łącznie. Więc czy w takim wypadku jest sens wrzucania tego do osobnej tabeli?

I jaką funkcją Joomli to się robi (wrzuca zapytanie do bazy), bo szukam ale nie potrafię takowej znaleźć...

moje
19-04-2010, 19:26
To możesz dodać zmienną zatwierdzone, dla przykładu if $zatwierdzone==0 { nie wyświetla na stronie } else if $zatwierdzone==1 { wyświetla na stronie }.

Ja bym zrobił poczekalnię.

Zapis np tak:

$intosql = "...";
$db->setQuery($intosql);
$db->query();

ciubas
19-04-2010, 20:23
Zmienna published - ta sugerowana przez wszystkie kursy - taką chciałem umieścić. Ale to najmniejszy problem akurat.

Na razie działa to przez zapytanie do bazy:



$query = "
SELECT *
FROM #__sklepy
WHERE woj='".$woj."' AND pub=1
ORDER BY miasto;
";


Rozumiem że sugerujesz poczekalnię -> nie ma powodu żeby jej nie robić - tylko mnie ciekawi powód czemu ją zrobić - zawsze słucham starszych ;)

Kurcze coś mi to nie działało jak testowałem - dzięki!

moje
19-04-2010, 20:45
Teraz jaśniej?

$intosql = "insert into #__sklepy values( ... , ... , ... , ... , ... );
$db->setQuery($intosql);
$db->query();

Do poczekalni podchodzę tak, że jak coś rozwali poczekalnię, to rozwali poczekalnię (tabelę), jeśli jakimś sposobem będzie tam jakiś złośliwy kod, to nie ma on dostępu do strony.

Jeśli robisz katalog/zbiór firm/aptek, to nie lepiej użyć SOBI2?

ciubas
19-04-2010, 20:59
To zapytanie do bazy było dla mnie jasne, chodziło mi o pub=1 czyli if $zatwierdzone==0 - jako przykład rozwiązania tego przeze mnie :)

SOBI2 - nie będzie, bo mam szczególne plany rozwoju tego komponentu (wyszukiwanie po sprzęcie, wysyłce, mieście, okolicy, właścicielu aptek itp...) :)

moje
19-04-2010, 21:43
A w SOBI2 nie ma wyszukiwania? ;>

To $pub, to tylko kolejny z values ,0, lub ,1, ;)

ciubas
19-04-2010, 21:47
Ma wszystko i za dużo wszystkiego;) Chcę zrobić coś swojego, bo potem chcę to rozwinąć w innym kierunku. A przy okazji chcę się douczyć nowych rozwiązań:)

Co do $pub - wiem o co chodz.

moje
19-04-2010, 22:55
Pochwal się gotowym tworem ;)