Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PostgreSQL][PHP] "Gubienie" połączenia z bazą danych
Forum PHP.pl > Forum > Przedszkole
Vhaeraun
Witam,
tworzę niewielki projekt z baz danych, który opiera się na bazie PostgreSQL i interfejsie webowym napisanym w języku PHP, który w założeniu ma być wirtualnym dziennikiem ocen (wiem, że nie jest to zbyt oryginalne ale wydawało mi się ciekawe na zapoznanie się z PostgreSQL'em). Natknąłem się na dziwny problem i ani w manualu ani nigdzie w googlach nie udało mi się znaleźć rozwiązania (sam problem jest trudny do sformułowania, bo nie wiem gdzie leży błąd).

Otóż, mam takie pliki (niektóre opisane bardziej w pseudokodzie, bo są dosyć długie) :

index.php :
  1. <?php include "./header.php";?>
  2.  
  3. <!-- w zaleznosci od tego kto jest zalogowany, pokazujemy rozne menu -->
  4. <?php
  5. if(!isset($_SESSION['id_osoby']))
  6. {
  7. ?>
  8. <p>Najpierw się zaloguj !</p>
  9. <?php
  10. }else{
  11. switch($_SESSION['uprawnienia'])
  12. {
  13. case 1:
  14. //uczen
  15. include('./menu_uczen.inc.php');
  16. break;
  17. case 2:
  18. //rodzic
  19. include('./menu_rodzic.inc.php');
  20. break;
  21. default:
  22. echo "<li><a href=\"./index.php?id=menu\">Wersje menu</a></li>";
  23. include('./blad.inc.html');
  24. break;
  25. }
  26. }
  27. ?>
  28. </div>
  29.  
  30. <!-- prawa kolumna zawierająca treść strony-->
  31. <div id="tresc">
  32. <?php
  33.  
  34. if(!isset($_SESSION['id_osoby']))
  35. {
  36. include("./login.inc.html");
  37. }else
  38. {
  39. if(isset($_GET['id'])){
  40. switch($_SESSION['uprawnienia'])
  41. {
  42. case 1 :
  43. switch($_GET['id']){
  44. case 'przeglad_oceny':
  45. if(isset($_GET['przedmiot']))
  46. {
  47. echo "To twoje oceny :<br />";
  48. wypisz_oceny($_SESSION['id_osoby'], $_SESSION['uprawnienia'], $_GET['przedmiot']);
  49. }
  50. else
  51. {
  52. wypisz_oceny($_SESSION['id_osoby'], $_SESSION['uprawnienia']);
  53. }
  54. break;
  55.  
  56. case 'przeglad_nieobecnosci':
  57. echo "Oto Twoje nieobecności:<br />";
  58. wypisz_nieobecnosci($_SESSION['id_osoby'], $_SESSION['uprawnienia']);
  59. break;
  60. default:
  61. echo "Wybierz opcję z menu po lewej";
  62. break;
  63. }
  64. break;
  65. case 2 :
  66. {
  67. switch($_GET['id']){
  68. case 'przeglad_oceny':
  69. wypisz_oceny_dziecka($_SESSION['id'], $_SESSION['uprawnienia']);
  70. break;
  71. case 'przeglad_nieobecnosci':
  72. echo "Oto nieobecności Twojej pociechy:<br />";
  73. wypisz_nieobecnosci_dziecka($_SESSION['id_osoby'], $_SESSION['uprawnienia']);
  74. break;
  75. default:
  76. echo "Wybierz opcję z menu po lewej ";
  77. break;
  78. }
  79. break;
  80.  
  81. }
  82. default:
  83. {
  84.  
  85. echo "Brak uprawnień";
  86.  
  87. }
  88. }
  89.  
  90. }else{
  91. echo "Dziękujemy za zalogowanie się.<br \>".$_SESSION['imie']." witamy na stronie !<br \>";
  92. echo "Wybierz opcję z menu po lewej stronie<br \>";
  93. }
  94. }
  95. ?>
  96. </div>
  97. <?php include "./footer.php";?>


plik header.php załączany na początku pliku index.php:
  1. <?php session_start();
  2. ?>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  5. .... i inne rzeczy, które powinny znaleźć się na początku strony oraz dołączenie jednego pliku :
  6. <?php
  7. include_once 'funkcje.php';
  8. ?>


plik polaczenie.php załączany w pliku header.php :
  1. <?php
  2. $polaczenie = pg_connect("host=localhost port=5432 dbname=wirtualny_dziennik user=postgres password=haslo") or die("Nie udało się połączyć z bazą danych!");
  3. ?>


plik footer.php załączany pod koniec to sama stopka i zamykanie tagów :

oraz plik funkcje, w którym znajdują się różne funkcje wywoływane przez index.php :
  1. <?php
  2. function wypisz_oceny($id, $uprawnienia, $przedmiot="all")
  3. {
  4. require 'polaczenie.php';
  5. if($przedmiot=="all")
  6. {
  7. $query="SELECT nazwa_przedmiotu FROM przedmioty WHERE id_przedmioty IN".
  8. "(SELECT id_przedmioty FROM lekcje WHERE lekcje.id_klasy_w_szkole=".
  9. "(SELECT id_klasy_w_szkole FROM klasy WHERE id_osoby=$id))".
  10. "ORDER BY nazwa_przedmiotu";
  11.  
  12. $result = pg_query($polaczenie,$query);
  13.  
  14. echo "Wybierz przedmiot :";
  15. echo "<ul id=\"przedmioty\">";
  16. while($i=pg_fetch_row($result))
  17. {
  18. echo "<li><a href=\"./index.php?id=przeglad_oceny&przedmiot=".htmlentities($i[0],ENT_QUOTES,"UTF-8") ."\">$i[0]</a></li>";
  19. }
  20. echo "</ul>";
  21. }
  22. else
  23. {
  24. $przedmiot=html_entity_decode($przedmiot);
  25. $query="SELECT r.opis_oceny, o.ocena FROM rodzaje_ocen r JOIN oceny o ".
  26. "ON(r.id_rodzaje_ocen=o.id_rodzaje_ocen) WHERE (o.id_osoby=$id) AND r.id_lekcje IN ".
  27. "(SELECT id_lekcje FROM lekcje WHERE id_przedmioty= ".
  28. "(SELECT id_przedmioty FROM przedmioty WHERE nazwa_przedmiotu='$przedmiot'));";
  29. $result = pg_query($polaczenie,$query);
  30. echo "<table id=\"oceny\">";
  31. echo "<tr><td colspan=\"2\">$przedmiot - oceny :</td></tr>";
  32. if(pg_num_rows($result)==0){
  33. echo "<tr><td colspan=\"2\">brak</td></tr>";
  34. }else
  35. {
  36. while($i=pg_fetch_row($result))
  37. {
  38. echo "<tr>";
  39. echo "<td>$i[0]</td><td>$i[1]</td>";
  40. echo "</tr>";
  41. }
  42. }
  43. echo "</table>";
  44. }
  45. }
  46.  
  47.  
  48. function wypisz_oceny_dziecka($id, $uprawnienia)
  49. {
  50. require 'polaczenie.php';
  51. if(!isset($_GET['przedmiot']))
  52. {
  53. if(!isset($_GET['dziecko']))
  54. {
  55. $query="SELECT id_osoby_dziecko, imie FROM rodzice_i_dzieci JOIN osoby ON(rodzice_i_dzieci.id_osoby_dziecko=osoby.id_osoby) WHERE rodzice_i_dzieci.id_osoby_rodzic=".$_SESSION['id_osoby'];
  56. $result=pg_query($polaczenie, $query) or die(pg_last_error($polaczenie));
  57. if(pg_num_rows($result)>1)
  58. {
  59. echo "Wybierz dziecko: <br />";
  60. while($i=pg_fetch_row($result))
  61. {
  62. echo "<li><a href=\"./index.php?id=przeglad_oceny&dziecko=".$i[0]."\">$i[1]</a></li>";
  63. }
  64. }elseif(pg_num_rows($result)==1)
  65. {
  66. $i=pg_fetch_row($result); // w i mamy numer dziecka
  67.  
  68. $query="SELECT nazwa_przedmiotu FROM przedmioty WHERE id_przedmioty IN".
  69. "(SELECT id_przedmioty FROM lekcje WHERE lekcje.id_klasy_w_szkole=".
  70. "(SELECT id_klasy_w_szkole FROM klasy WHERE id_osoby=$i[0]))".
  71. "ORDER BY nazwa_przedmiotu";
  72.  
  73. $result = pg_query($polaczenie,$query);
  74.  
  75. echo "Wybierz przedmiot: <br />";
  76. echo "<ul id=\"przedmioty\">";
  77. while($j=pg_fetch_row($result))
  78. {
  79. echo "<li><a href=\"./index.php?id=przeglad_oceny&dziecko=".$i[0]."&przedmiot=".htmlentities($j[0],ENT_QUOTES,"UTF-8") ."\">$j[0]</a></li>";
  80. }
  81. echo "</ul>";
  82. }
  83. else
  84. {
  85. echo "Nie masz dziecka w tej szkole !";
  86. }
  87. }else{
  88. $query="SELECT nazwa_przedmiotu FROM przedmioty WHERE id_przedmioty IN".
  89. "(SELECT id_przedmioty FROM lekcje WHERE lekcje.id_klasy_w_szkole=".
  90. "(SELECT id_klasy_w_szkole FROM klasy WHERE id_osoby=".$_GET['dziecko']."))".
  91. "ORDER BY nazwa_przedmiotu";
  92.  
  93. $result = pg_query($polaczenie,$query);
  94.  
  95. echo "Wybierz przedmiot: <br />";
  96. echo "<ul id=\"przedmioty\">";
  97. while($j=pg_fetch_row($result))
  98. {
  99. echo "<li><a href=\"./index.php?id=przeglad_oceny&dziecko=".$_GET['dziecko']."&przedmiot=".htmlentities($j[0],ENT_QUOTES,"UTF-8") ."\">$j[0]</a></li>";
  100. }
  101. echo "</ul>";
  102. }
  103.  
  104. }else{
  105. wypisz_oceny($_GET['dziecko'], $_SESSION['uprawnienia'],$_GET['przedmiot']);
  106. }
  107.  
  108. }
  109.  
  110. ?>


oraz plik menu_uczen.inc.php (menu_rodzic wyglada identycznie)
  1. <?php
  2. echo "<ul id=\"menu\">";
  3.  
  4. echo "<li><a href=\"./index.php?id=przeglad_oceny\">Przeglądaj oceny</a></li>";
  5. echo "<li><a href=\"./index.php?id=przeglad_nieobecnosci\">Przeglądaj nieobecności</a></li>";
  6. echo "<li><a href=\"./index.php?id=wyslij_mail\">Wyślij maila</a></li>";
  7. echo "<li><a href=\"./index.php?id=edytuj_konto\">Edytuj konto</a></li>";
  8. echo "<li><a href=\"./wyloguj.php\">Wyloguj</a></li>";
  9.  
  10. echo "</ul>";
  11. ?>


Jak można zauważyć, w pliku funkcje w każdej funkcji na początku używam :
  1. require 'polaczenie.php';
co chyba nie jest zbyt dobrym rozwiązaniem (nie podoba mi się to ciągłe otwieranie połączenia z bazą danych).
Próbowałem w pliku header zamieścić require 'polaczenie.php'; jednak okazywało się, że podczas wywoływania funkcji wypisz_oceny_dziecka "zrywało się" połączenie z bazą danych. Używając funkcji pg_connection_status mogłem zauważyć, że połączenie z bazą danych nie istnieje, chociaż nigdzie go nie zamykałem.
Co więcej, gdy w funkcjach używam require_once zamiast require, to też mam taki sam błąd.
Używanie pg_pconnect albo ustawianie connect_timeout też nie pomaga. Nie mam pojęcia w którym momencie jest wyłączane połączenie z bazą danych (myślałem, że podczas ciągłego odświeżania strony index.php z różnymi parametrami, ale przecież require umieszczone na początku tej strony powinno rozwiązać problem ? ).
Jeżeli ktoś ma jakiś pomysł, skąd bierze się ten problem to byłbym bardzo wdzięczny za pomoc (chodzi mi o to, żebym w jednym miejscu nawiązał połączenie z bazą i żeby ono już zostało, zamiast łączyć się w każdej funkcji).
CuteOne
Możesz użyć global smile.gif

index.php
  1.  
  2. require 'polaczenie.php';
  3.  
  4. require 'funkcje.php';
  5.  
  6. wypisz_oceny(1, 'bbb', 'aa');


funkcje.php
  1. function wypisz_oceny($id, $uprawnienia, $przedmiot="all")
  2. {
  3. global $polaczenie;
  4.  
  5. if($przedmiot=="all")
  6. {

lub przesłanie handlera jako argument funkcji:
  1. function wypisz_oceny($id, $uprawnienia, $przedmiot="all", $polaczenie)
  2. {
  3. if($przedmiot=="all")
  4. {



ps. na końcu index.php dodaj pg_close
Vhaeraun
Dzięki za pomoc, zastosowanie global pomogło smile.gif
Jeszcze jakbym mógł prosić o wyjaśnienie, dlaczego mimo, że tworzę tą zmienną przy każdorazowym wczytaniu strony (bo plik polaczenie.php jest dołączany na początku strony index.php) to jednak w funkcji program jej nie widzi ? Wydawało mi się, że wszystkie zmienne są globalne, a tu się okazuje, że muszę dodatkowo używać atrybutu global ?
CuteOne
A kto ci powiedział, że zmienne są globalne? od tego jest właśnie jak by to nazwać.. hermetyzacja funkcji aby żadne badziewie przez naszą omyłkę się do nie nie dostało np.

  1. $x = 10;
  2.  
  3. function echoX($x) {
  4.  
  5. echo $x;
  6. }
  7.  
  8. echoX(2);
Hoku
Cytat(CuteOne @ 10.01.2011, 06:42:00 ) *
Możesz użyć global smile.gif

index.php
[php]

[php]
function wypisz_oceny($id, $uprawnienia, $przedmiot="all")
{
global $polaczenie;

if($przedmiot=="all")
{


nie powinieneś mu pisać o globals, to zły nawyk

A Globals jest złem najlepiej przesyłać jako parametr funkcji, bo niezły burdel potem może powstać
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.