Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak zachowanie połączenia z bazą w sesji
Forum PHP.pl > Forum > PHP
yaroo_s
Tak jat w temacie, znam sie juz troche na php, jednak narazie tego nie dałem rady ustalić.
Chciałem napisać funkcje, która będzie odplana zaraz po wejście (np. w panel administracyjny).

Następuje połaczenia z bazą:
  1. function polaczenie()
  2. {
  3. <?php
  4.  
  5. $db = mysql_connect('localhost','******','********');
  6.   if (!$db)
  7.    {
  8.    echo &#092;"Błąd połączenia z bazą, spróbuj ponownie\";
  9.    exit;
  10.    }
  11. mysql_select_db('goleniow',$db);
  12.   if (!$db)
  13.    {
  14.    echo &#092;"Błędny wybór bazy\";
  15.    exit;
  16.    }
  17.  
  18. $_SESSION['db']=$db;
  19. $db=$_SESSION['db'];
  20. ?>
  21. }


Przepuszczam ze powinienem teraz zwrócić jakoś tę wartość z funkcji tylko jak?
Sabistik
Cytat
Przepuszczam ze powinienem teraz zwrócić jakoś tę wartość z funkcji tylko jak?


return $db;

hmm..
crash
A co to za dziwne wyjęcie function polaczenie() poza kod php? Chyba tak nie masz w swoim skrypcie?
yaroo_s
Bład przy kopiowaniu, oczywiscie cały skrypt miesci się w znacznikach php,
Włączyłem do składni funkcji:
return $db;

Jednak nadal wyskakuje bład, że nie ma połączenia z bazą danych...
NuLL
Dopisz zamiast mysql_connect mysql_pconnect" title="Zobacz w manualu PHP" target="_manual
Przecież połączenie jest zrywane bo zakonczeniu wykonywania danego skryptu - czytajmy manual
yaroo_s
Hmm.. nadal cos nie tak...Przedstawie może co robie po koleji:

Najpierw następuje wgranie pliku index.php (tylko część kodu)
  1. <?php
  2.  
  3. require_once('funkcje_pp.php');
  4.  
  5. echo '
  6.      <html>
  7.      <head>
  8.      <link rel=\"stylesheet\" type=\"text/css\" href=\"s1.css\">
  9.      <meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-2\" />
  10.      </head>
  11.      <body>
  12.      ';
  13.  
  14.  
  15.  
  16. if (isset($HTTP_POST_VARS['uzytkownik']) && isset($HTTP_POST_VARS['haslo']))
  17. {
  18.        //tu sa jakies inne zadania, w każdym razie w pewnym momecie następuje wywołanie t
  19. j funkcji
  20.  
  21.  
  22.  
  23.        polaczenie();
  24.        
  25.  
  26.        //dlasze jakies zadania
  27. }
  28. else
  29.   {
  30.    echo'
  31.      <h1>Zaloguj się</h1>
  32.      Ta strona jest dostępna tylko dla administratora lub moderatorów<br>
  33.      <form method=\"post\" action=\"index.php\">
  34.      <table border=\"1\" cal cellpadding=\"5\">
  35.      <tr>
  36.          <td>Użytkownik:</td>
  37.          <td><input type=\"text\" name=\"uzytkownik\"></td>
  38.      </tr>
  39.      <tr>
  40.          <td>Hasło</td>
  41.          <td><input type=\"password\" name=\"haslo\"></td>
  42.      </tr>
  43.      <tr>
  44.          <td colspan=\"2\">
  45.          <input type=\"submit\" value=\"Zaloguj się\">
  46.          </td>
  47.      </tr>
  48.      </table>
  49.      </form>
  50.      </body>
  51.      </html>
  52. ';
  53.   }
  54.  
  55. ?>


Na początku było wywołanie pliku z funkcjami, funkcja połacznei wygląda tak:
  1. <?php
  2.  
  3. function polaczenie()
  4. {
  5. $db = mysql_pconnect('localhost','goleniow','********);
  6.   if (!$db)
  7.    {
  8.    echo \"Błąd połączenia z bazą, spróbuj ponownie\";
  9.    exit;
  10.    }
  11. mysql_select_db('goleniow',$db);
  12.   if (!$db)
  13.    {
  14.    echo \"Błędny wybór bazy\";
  15.    exit;
  16.    }
  17.    
  18.    $_SESSION['db']=$db;
  19.    $db=$_SESSION['db];
  20.  
  21. return $db;
  22. }
  23.  
  24. ?>


Potem następuje odwoąłnie do bazy np. takie

  1. <?php
  2.  
  3.   echo &#092;"<table border=\"1\" cellpadding=\"5\">\";
  4.   echo &#092;"<tr><td>Nr/nowy wpis</td><td>Tytuł</td><td>Treść</td><td>Właściciel</td><td>Podpis</td><td>Data</td><td>Akcja</td></tr>\";
  5.   
  6.   $zapytanie=&#092;"SELECT * FROM informacje\";
  7.   
  8.   $wynik=mysql_query($zapytanie,$db);
  9.  
  10.  
  11. ?>


I wyskakuje taki bład

  1. <?php
  2.  
  3. Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource
  4.  
  5. ?>


Linia wskazuje ze jest bład w tej lini
  1. <?php
  2.  
  3. $wynik=mysql_query($zapytanie,$db);
  4.  
  5. ?>
AndyPSV
Jeśli dajesz mysql_pconnect()" title="Zobacz w manualu PHP" target="_manual to nie musisz podawac identifykatora połaczenia:

  1. <?php
  2. $wynik=mysql_query($zapytanie,$db);
  3. ?>


tylko po prostu:

  1. <?php
  2. $wynik=mysql_query($zapytanie);
  3. ?>
yaroo_s
No w sumie to jednak musze podać tą zmienną...raczej, teraz wyskoczyło jeszcze więcej błędów....

Warning: mysql_query(): Access denied for user: 'ODBC@localhost' (Using password: NIE) in..........
Warning: mysql_query(): A link to the server could not be established in ...............

Blad zapytania
Warning: Wrong parameter count for mysql_num_rows() in .......................


czy ktoś ma jakieś inne rozwiązanie, ewentualnie wie co zle robie...

Dodatkowo prowadziłem skrypt który odwołuje sie do bazy danych zaraz po funkcji wywołania połączenia. i również wyskakuje błąd. co mzoe wskazywąc ze następuje błędny zwrot z funckji. Czy może tego typu zmiene trzeba zwracać w inny sposób...questionmark.gif
DeyV
Daruj sobie przechowywanie identyfikatora połaczenia w sessji - wogóle skąd ten pomysł?
zamiast tego - łącz się z bazą przy każdy wywołaniu skrytpu, potrzebującego współpracy z bazą.
yaroo_s
Cytat
Daruj sobie przechowywanie identyfikatora połaczenia w sessji - wogóle skąd ten pomysł?
zamiast tego - łącz się z bazą przy każdy wywołaniu skrytpu, potrzebującego współpracy z bazą.


Skad? stąd że jest to część panelu administracujnego, każdy skrypt łaczy sie z bazą, łaczenie i rozłaczanie za każdym razem to obciążenie na serwera, założenie stałego połączenia oddciąża serwer MySQL-a oraz przyśpiesz przetwarzanie wyników zapytań......
popbart
@DeyV , a jak rozwiązujesz transakcję obejmującą kilka plików ?
DeyV
popbart - nie rozumiem pytania.

yaroo_s - niestety - ale takie są założenia pracy z MySQL w php, że każde wywołanie skryptu z założenia osobno łączy się z MySQL
Oczywiście - każde wywołanie strony, a nie każde zapytanie na jego poziomie.

W takim przypadku okazuje się, że 1 połączenie z bazą danych na potrzeby jednej odsłony nie jest aż tak bardzo obciążające. Większy problem potrafi pojawić sie natomaist włąsnie z pconect.
yaroo_s
popbart - czy umiesz zachowywać takie połaczenia... jak zrozumiałem robiłęs tak przy pracu z plikami....

Czy ktos wogóle próbował czegoś tekiego.... jest to chyba rzecz dosc istotna, zwłaszcza przy panelach zarządzania stroną...
popbart
Cytat
popbart - nie rozumiem pytania.

Np. Mamy kilka formularzy wprowadzających do bazy rekordy i
chcemy się zabezpieczyć transakcją.
NuLL
@yaroo_s a -a czytałeś mysql_pconnect" title="Zobacz w manualu PHP" target="_manualquestionmark.gif Chyba nie.
yaroo_s
Jasne ze czytałem, co nie zmienia faktu że nie mogę sobie poradzić z tym problemem.

Zmieniłe teraz coś takiego (o ile rozumiem to tak powinno być) jeste to plink index.php - wszystkie podstrony wywołują sie poprzez zminną GET:


  1. <?php
  2. .
  3. .
  4. .
  5. .
  6. if (isset($HTTP_POST_VARS['uzytkownik']) && isset($HTTP_POST_VARS['haslo']))
  7. {
  8.  
  9.  
  10.  $uzytkownik=$HTTP_POST_VARS['uzytkownik'];
  11.  $haslo=$HTTP_POST_VARS['haslo'];
  12.  $haslo=md5($haslo);
  13.  
  14.  $db = mysql_connect('localhost','************','*******');
  15.  if (!$db)
  16. {
  17. echo &#092;"Błąd połączenia z bazą, spróbuj ponownie\";
  18. }
  19.  
  20.  mysql_select_db('********',$db);
  21.  if (!$db)
  22. {
  23. echo &#092;"Błędny wybór bazy\";
  24. }
  25.  
  26.  $zapytanie=&#092;"select * from administracja
  27.  where ad_nazwa='$uzytkownik'
  28.  and ad_haslo='$haslo' &#092;";
  29.  
  30.  $wynik=mysql_query($zapytanie, $db);
  31.  if (!$wynik)
  32. {
  33. echo &#092;"Błędne zapytanie lub nie można go wykonać\";
  34. };
  35.  
  36.  $ilosc=mysql_num_rows($wynik);
  37.  
  38.  
  39.  if ($ilosc==1)
  40.  {
  41.  // ustalenie podstawowych zmiennych
  42.  .
  43.  .
  44.  .
  45.  .
  46.  .
  47.  $db=mysql_pconnect('localhost','********','**********');
  48.  if (!$db)
  49.  {
  50.  echo &#092;"Błąd połączenia z bazą, spróbuj ponownie\";
  51.  exit;
  52.  }
  53.  
  54.  mysql_select_db('**********',$db);
  55.  
  56.  if (!$db)
  57.  {
  58.  echo &#092;"Błędny wybór bazy\";
  59.  exit;
  60. }
  61.  
  62. }
  63.  
  64. if (isset($poprawny_uzytkownik))
  65. {
  66. if (($poprawny_uzytkownik==1))
  67.  {
  68.  $page=$_GET[&#092;"page\"];
  69.  if (empty($page)) $page=&#092;"lista.php\";
  70.  $page_url=&#092;"webs_pp/$page\";
  71.  require ($page_url);
  72.  echo &#092;"</body></html>\";
  73.  }
  74.  
  75. }
  76. else
  77. {
  78.  echo'
  79.  <h1>Zaloguj się</h1>
  80.  Ta strona jest dostępna tylko dla administratora lub moderatorów<br>
  81.  <form method=\"post\" action=\"index.php\">
  82.  <table border=\"1\" cal cellpadding=\"5\">
  83.  <tr>
  84.  <td>Użytkownik:</td>
  85.  <td><input type=\"text\" name=\"uzytkownik\"></td>
  86.  </tr>
  87.  <tr>
  88.  <td>Hasło</td>
  89.  <td><input type=\"password\" name=\"haslo\"></td>
  90.  </tr>
  91.  <tr>
  92.  <td colspan=\"2\">
  93.  <input type=\"submit\" value=\"Zaloguj się\">
  94.  </td>
  95.  </tr>
  96.  </table>
  97.  </form>
  98.  </body>
  99.  </html>
  100. ';
  101. }
  102. ?>



Standardowae zapytanie wygląda taK

  1. <?php
  2.  
  3.  
  4. function wyswietl_info_o_galerie($aktywna_galeria)
  5.  {
  6. $zapytanie=&#092;"SELECT * FROM galerie where ga_id='\".$aktywna_galeria.\"'\";
  7. $wynik=mysql_query($zapytanie);
  8.  .
  9.  .
  10.  .
  11.  .
  12.  }
  13.  
  14.  
  15. ?>


Jednak nadal są błedy.... jesteś w stanie pomóc NuLL.....
popbart
Cytat
założenie stałego połączenia odciąża serwer MySQL-a oraz przyśpiesz przetwarzanie wyników zapytań

Chyba gra nie warta świeczki. Było by rozwiązanie gdyby obiekty w php nie ginęły.
Wiecie już dlaczego bankowe systemy transakcyjne oparte są o .ASP
DeyV
jasne jest, że nie można objąć 1 transakcją kilku "odsłon" strony.
Wydaje mi się to niemożliwe nie tylko w php, ale równeiż i w innych platformach, gdzia takie rozwiązanie powodowałoby zupełnie zbędne blokowanie bazy.

Zamiast transakcji w takim przypadku znacznie lepsze wydaje się przechowywanie pewnych danych w sessji, tak długo aż nie uzbieramy ich całego zestawu, i dopiero wtedy, przy pomocy serii zapytań następujących jedno po drugim, warto zapisać to do bazy. A taką serię można jak najbardziej objąć transakcją, by mieć pewność, że wszystkie dane zapisane zostały poprawnie.
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.