Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Odwołanie do nieistniejącej funkcji... WTF?
Forum PHP.pl > Forum > Przedszkole
Drav
Witam,
Ostatnio (dzisiaj) postanowiłem zacząć OOP. Zacząłem od przerobienia mojego bardzo prostego kodu na dwie funkcje.
Otóż postanowiłem w zrobić funkcje odpowiadająca za połączenie się z baza danych i odpowiednie zakodowanie znaków, oraz funkcje odpowiadającą za wyświetlenie newsa.
Wszystko pięknie jeśli te dwa zadania sa w jednej funkcji, lub kod do połaczenia sie z bazą wklejam bezposrednio do plików news.php/newsy.php, ale kiedy chcę uzyć do połaczenia z baza osobnej funkcji wszystko sie sypie:
error news.php i newsy.php
Cytat
Fatal error: Call to a member function query() on a non-object in /home/diablo/domains/blizzworld.pl/public_html/test/inc/funkcje.php on line 17

Cytat
Fatal error: Call to a member function query() on a non-object in /home/diablo/domains/blizzworld.pl/public_html/test/inc/newsy.php on line 4

linia 17 i 4 wyglądają tak
  1. $wynik = $db->query($zapytanie);

Nie mam pojęcia czemu nagle obiekt przestaje istniec, mam nadzieję, ze którys z obeznanych w OOP programistów powie mi co zrobiłem źle smile.gif
Ponizej zawartości plików:

index.php
  1. <?php
  2. include_once('inc/funkcje.php');
  3. switch($_GET['s'])
  4. {
  5. case 'news':
  6. include_once('inc/news.php');
  7. break;
  8. default:
  9. include_once('inc/newsy.php');
  10. break;
  11. }
  12. ?>

inc/funkcje.php
  1. <?php
  2. function lacz_bd()
  3. {
  4. @ $db = new mysqli('localhost', 'xxxx', 'xxxx', 'xxxx');
  5. if (mysqli_connect_error())
  6. {
  7. echo 'Nie można połaczyć się z baza MySql. Jeśli błąd będzie się powtarzał skontaktuj się z administratorem serwisu.';
  8. }
  9. $db->set_charset("utf8");
  10. };
  11.  
  12. function show($typ)
  13. {
  14. $i = $_GET['id'] + 1;
  15. $zapytanie = "select * from ".$typ." where ".$typ."id=".$i;
  16. $wynik = $db->query($zapytanie);
  17. $wiersz = $wynik->fetch_assoc();
  18.  
  19. echo '<div class="tekst"><h1><a href="#">'.stripslashes($wiersz["tytul"]).'</a><u>['.stripslashes($wiersz["kategoria"]).', '.stripslashes($wiersz["data"]).']</u></h1>
  20. <div class="txt">
  21. <p>
  22. '.stripslashes($wiersz["tresc"]).'
  23. </p>
  24. </div>';
  25. $wynik->free();
  26. $db->close();
  27. }
  28. ?>

inc/newsy.php
  1. <?php
  2. lacz_bd();
  3. $zapytanie = "select * from news";
  4. $wynik = $db->query($zapytanie);
  5. $wiersze = $wynik->num_rows;
  6. for($i = 0; $i < $wiersze; $i++)
  7. {
  8. $wiersz = $wynik->fetch_assoc();
  9. echo '<div class="tekst"><h1><a href="index.php?s=news&id='.$i.'">'.stripslashes($wiersz["tytul"]).'</a><u>['.stripslashes($wiersz["kategoria"]).', '.stripslashes($wiersz["data"]).']</u></h1>
  10. <div class="txt">
  11. <p>
  12. '.stripslashes($wiersz["tresc"]).'
  13. </p>
  14. <p class="komentarz">
  15. <a href="#">Komentarze [4]</a>
  16. </p>
  17. </div>';
  18. }
  19. $wynik->free();
  20. $db->close();
  21. ?>

i inc/news.php nad którym zaczałem pracowac i coś zaczeło się sypać smile.gif
  1. <?php
  2. lacz_bd();
  3. show(news);
  4. ?>

Misiur66
Też zaczynam z OOP, ale to chyba ma inne podłoże -> http://php.net/manual/en/language.variables.scope.php

Możesz zrobić singletonem bazę danych, żeby w każdej funkcji tworzyć odwołanie do obiektu, albo zmienną globalną, której tylko zmieniasz wartość wewnątrz funkcji (w każdej funkcji global $db).

To tylko luźne przemyślenia, ja korzystam z odwołań do istniejących obiektów

Up:

Mam na myśli np. to:

  1. <?php
  2.  
  3. $db = false;
  4. function lacz_bd()
  5. {
  6. global $db;
  7. @ $db = new mysqli('localhost', 'xxxx', 'xxxx', 'xxxx');
  8. if (mysqli_connect_error())
  9. {
  10. echo 'Nie można połaczyć się z baza MySql. Jeśli błąd będzie się powtarzał skontaktuj się z administratorem serwisu.';
  11. }
  12. $db->set_charset("utf8");
  13. };
  14.  
  15. function show($typ)
  16. {
  17. global $db;
  18. $i = $_GET['id'] + 1;
  19. $zapytanie = "select * from ".$typ." where ".$typ."id=".$i;
  20. $wynik = $db->query($zapytanie);
  21. $wiersz = $wynik->fetch_assoc();
  22.  
  23. echo '<div class="tekst"><h1><a href="#">'.stripslashes($wiersz["tytul"]).'</a><u>['.stripslashes($wiersz["kategoria"]).', '.stripslashes($wiersz["data"]).']</u></h1>
  24. <div class="txt">
  25. <p>
  26. '.stripslashes($wiersz["tresc"]).'
  27. </p>
  28. </div>';
  29. $wynik->free();
  30. $db->close();
  31. }
  32. ?>
Drav
cenna rada smile.gif
Cytat
Tutaj zmienna $a będzie dostępna także wewnątrz dołączonego funkcją include pliku b.inc w skrypcie. Jednakże wewnątrz funkcji zdefiniowanych samodzielnie zmienne mają zasięg lokalny. Każda zmienna użyta wewnątrz funkcji jest domyślnie ograniczona do zasięgu lokalnego funkcji.

Wielkie dzięki za pomoc, wszystko już ładnie śmiga, pomógł leci do Ciebie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.