PDA

Zobacz pełną wersję : Problem ze zwracaniem wartości funkcji z pliku zewnętrznego



djrooman
26-05-2013, 16:34
Witam wszystkich!
Mam następujący problem.

Nie znam za bardzo Joomli, więc stworzyłem sobie swój plik PHP.
Ten plik zawiera połączenie z bazą danych (inną niż łączy się Joomla). Zawiera też fukcję, która pobiera z bazy stan licznika odwiedzin.
Jeżeli odpalam w przeglądarce bezpośrednio ten plik - wszystko śmiga jak należy.

Mój plik funkcją łączącą się z bazą danych:
<?php
// połączenie z bazą danych
$connection = mysqli_connect (host, user, pass, db_name);

function pokazLicznik () {

global $connection;


// pobieramy stan licznika
$zapytanie = "SELECT count FROM rtp_guest_counter";
$wynik = @mysqli_query ($connection, $zapytanie);


while ($rzad = mysqli_fetch_array($wynik, MYSQLI_ASSOC)) {
return $rzad["count"];
}

}
?>


Problem pojawia się, gdy do pliku index.php z szablonem Joomla, próbuję ten plik zewnętrzny zainkludować i odwołać się do zdefiniowanej w nim funkcji.

Przykład mojego pliku index.php z szablonem Joomla:
...
<?php
include_once('php/licznik.php');
echo pokazLicznik();

?>
...


Najdziwniejsze jest to, że jak stworzę w pliku, który dołączam jakąś funkcję, która nie łączy się z bazą, to jest OK.
Proszę o pomoc.
To pilne :)

KES
26-05-2013, 22:51
Nie rozumiem czemu robisz nowe połączenie z bazą jak już takowe masz :)
$db = JFactory::getDbo();
Jeżeli to jest inna baza danych to joomla nie ma z tym problemów poczytaj o:
JDatabase

oraz poczytaj jak w joomla tworzy się zapytania i zapewne pokochasz ten system jak ja :)
Ja raczej bym ten nowy plik jako helper zrobił w szablonie i jako klasę a nie jako zwykłe funkcje :)

pawelSafiStudio
27-05-2013, 07:54
Hmm w pliku, który załączyłeś zmienna $connection nie wygląda mi na globalną. Sprawdź czy zadeklarowałeś ją przed inkludowaniem jako global.
Nie mniej jednak zapoznaj się z JDatabase jak wspomniał @Bati. Jak pracujesz na Joomla! to dobrze by było z niej korzystać ;)

djrooman
27-05-2013, 08:46
@Bati
"Nie rozumiem czemu robisz nowe połączenie z bazą jak już takowe masz" - Mam w planach pisanie dużej aplikacji pod Joomla i chciałem mieć oddzielną bazę na to :)

Oczywiście poczytam sobie o JDatabase.
Nie wiesz może jednak czemu Joomla blokuje to moje połączenie, które chcę nawiązać?
Z góry dzięki za pomoc! :)

- - - Updated - - -

@pawelSafiStudio
Ta zmienna nie musi być globalna, bo jak inkludujesz jakiś plik, to tak jakbyś go dołączał. Także, jeżeli jakaś zmienna występuje w inkludowanym pliku, to możesz się do niej śmiało odwoływać.

W funkcji napisałem "global", bo nie chciałem przekazywać połączenia jako parametru funkcji.

pawelSafiStudio
27-05-2013, 08:54
A możesz włączyć błędy dla mysqli_query ? (usuń znak @). Zobacz czy pojawi Ci się błąd połączenia.

djrooman
27-05-2013, 09:12
@pawelSafiStudio
Dobry trop, zaraz sprawdzę :)

- - - Updated - - -

@pawelSafiStudio
Głucho, nie wyświetla żadnych błędów. To wygląda, jakby było tłumione przez Joomlę.
Tak jak pisałem wcześniej, w tym pliku, który łączy się z bazą danych nie ma błędów, bo sprawdzałem i on działa.
On działa jak jest odpalany samodzielnie, a jak tylko go inkluduję do szablonu Joomla - przestaje działać.
Czas chyba przeprosić się z jDatabase ;)

pawelSafiStudio
27-05-2013, 09:49
A co mówi mysqli_error ?
Jak masz ustawione register_globals ?

KES
27-05-2013, 10:34
@djroman mogę ci pomóc znaleźć błąd lecz musisz mi najpierw wyjaśnić co dokładnie chcesz zrobić.

Twoja funkcja "pokazLicznik" mówi mi (przepraszam) że sam nie wiesz co chcesz zrobić:
- jak być użył klass OOP to byś nie musiał jako globalnie przesyłać zmiennych
- a teraz przejdźmy przez Twój kod:
-- łączysz się z bazą
-- wyciągasz wszystkie rekordy z tabeli
-- używasz while aby przez elementy zwrócone przejść
-- wchodzisz do pętli zwracasz pierwszy wynik i wychodzisz z funkcji

hmm.. pomyśl czy jest to optymalne rozwiązanie, proponuję jeszcze poczytać o var_dump i print_r :)
Oczywiście pytaj jak coś możesz ulepszyć/uprościć, ale bez podstawowej wiedzy o OOP i Joomla Framework to bym się nie brał za pisanie dużej aplikacji.

PS. i czemu aplikację piszesz w szablonach a nie używasz MVC?

djrooman
27-05-2013, 20:49
@Bati
Wierzcie mi lub nie - ale mój kod działa.
Funkcja pokazLicznik łączy się z bazą i pobiera wartość tylko jednego pola - stan licznika odwiedzin (ten "while" w moim kodzie jest nie potrzebny).
No i zadaniem tej funkcji jest wypluwać wartość licznika. To wszystko.
Oczywiście połączenie z bazą danych również uprościłem ze względów bezpieczeństwa ;)

Plik, w którym jest kod tej funkcji jest zupełnie innym plikiem niż plik szablonu.
W pliku szablonu tylko odwołuję się do niego, bo chcę wyświetlać ilość odwiedzin.

W moim kodzie nie ma błędu, bo jak odpalę ten plik samodzielnie, to działa jak marzenie.
Problem polega tylko i wyłącznie na tym, że jeśli chcę wyświetlić wynik tej funkcji pokazLicznik w pliku szablonu - wtedy funkcja nie zwraca nic.

Mój problem jest łatwy do odtworzenia.
Utwórz proszę jakikolwiek plik .php. Wklej w nim kawałek kodu łączący się z jakąkolwiek bazą danych (inną niż ta Joomlowa) i spróbuj, wyświetlić wynik działania tej funkcji na stronie z szablonem.

Z góry dzięki za pomoc!
Pozdrawiam!

pawelSafiStudio
28-05-2013, 07:58
http://docs.joomla.org/Connecting_to_an_external_database <- Wykorzystaj to.

KES
28-05-2013, 08:50
#djrooman kolega @pawelSafiStudio podał Ci nawet link do dokumentacji jak to zrobić.
Ciężko komuś pomóc jeżeli podajesz zupełnie inny kod niż ten co ma użyć.

Z bazą powinien się połączyć. Czy na pewno dodajesz dobry plik ? Bo po twoim stwierdzeniu że w ramach bezpieczeństwa podajesz nam inny kod to już sam nie wiem co mam sądzić:



// jeżeli masz to w głównym katalogu
$path = JPATH_SITE;
// jeżeli masz to w katalogu szablonu
$path = dirname(__FILE__);

include_once($path . '/php/licznik.php');
echo pokazLicznik();


Jeszcze dodaj do 'licznik.php' kod:


echo 'licznik jest gotowy';

jeżeli napis się pokaże i użyjesz kodu podanego przez @pawelSafiStudio to będziemy dalej szukać.

djrooman
28-05-2013, 21:51
@Bati, @pawelSafiStudio
Już wszystko działa. Chciałem Wam bardzo podziękować za pomoc i drogowskazy.
Skończyło się na tym, że się przełamałem i użyłem tego połączenia przez JDatabase.
Do tej pory nie wiem na czym polegał problem.
Może na tym, że zrobiłem mix OOP z proceduralnym PHP, no bo nie wiem co to mogło być innego :)

djrooman
29-05-2013, 22:09
Mam jeszcze jedno pytanie, chłopaki co jest nie tak z moim kodem, że nie updatuje bazy danych:

$query = "UPDATE counter SET count='$stanLicznika'";
$db->setQuery($query);
$result = $db->query();

Widzicie gdzieś może błąd?
Z góry dzięki za pomoc!
Korzystam z Joomli 1.6.4

pawelSafiStudio
29-05-2013, 23:09
Przed wywołaniem sql'a zrób echo $query aby sprawdzić co się kryje pod $stanLicznika w zapytaniu.
Btw. dla tabeli nie korzystasz z żadnego przedrostka ?
Daj też echo $db->getErrorMsg(). Zobacz czy wyrzuci Ci jakiś błąd SQL.

KES
30-05-2013, 10:43
@djrooman pierwsze bym zaktualizował Joomla choć do 2.5 lecz jak dopiero się uczysz i masz na to dużo czasu to proponuję Joomla! 3.x.

Też się zastanawiam jaki wiersz chcesz zmienić ?
Nie posłuchałeś mojej rady i @pawelSafiStudio, zacząłeś korzystać z JDatabase ale tylko powierzchownie, aj bym to napisał:


$query = $db->getQuery(true);
$query->update( $db->quoteName( '#__counter' ) ); //mam nadzieję że używasz przedrostków tabel :)
$query->set( $db->quoteName( 'count' ) . ' = ' . $db->quote($stanLicznika) );
$query->where( ) // tego ci brakuje ponieważ nie wiemy jaki wiersz chcesz zmienić ?
$db->setQuery($query);
$db->execute();