Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Łączenie sie z bazą
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
pejot
Witam zostałem poproszony o pomoc w modyfikacji projektu, chodziło o to aby zrobić oddzielny plik z parametrami do bazy. Na postgresql sie nie znam manuale mi nie pomogły, proszę was o pomoc.

tak wygląda moj plik config.inc.php
  1. <?
  2. // Baza danych
  3. $host = '111.111.111.111';
  4. $port = '5432';
  5. $dbname = 'systemkontaktowy';
  6. $user = 'abc';
  7. $password = '123456789';
  8. ?>


A tak wygląda moj plik index.php
  1. <?php
  2. ?php
  3. //Config
  4. require('config.inc.php');
  5. $polaczenie = pg_connect("host=$host port=$port user=$user password=$password dbname=$dbname");
  6. //wyciąłem zbedne linijki
  7. function zaloguj($aAutor){
  8.        $db = $polaczenie
  9.        or die($this->blad("Blad polaczenia z baza danych " . pg_last_error($db))); <-- TO JEST 463 LINIJKA
  10.        $zapytanie =
  11.        sprintf("    SELECT a.id, a.idgrupa, \"login\", 123456789, a.aktywny, g.rodzaj "
  12.        . " FROM systemkontaktowy.autorzy a "
  13.        . " LEFT JOIN systemkontaktowy.grupy g "
  14.        . " ON g.id = a.idgrupa "
  15.        . "WHERE login = '%s' AND 123456789 = '%s' AND aktywny = true "
  16.        ,$aAutor->fLogin,$aAutor->f123456789);
  17.        $wynik = pg_query($db,$zapytanie);
  18.        if(!$wynik){
  19.            die("Blad polaczenia przy logowaniu. Prosze sprobowac pozniej");
  20. ?>


W rezultacie dostaje:
Warning: pg_last_error(): supplied argument is not a valid PostgreSQL link resource in /var/www/test/index.php on line 463
<h3 class="blad">BLAD: Blad polaczenia z baza danych </h3>
Proszę o pomoc.
piotrooo89
nie wiem czy tu ma to znaczenie ale zobacz czy masz poprawną kolejność podawanych argumentów.
blooregard
Używasz zmiennej $polaczenie w f-cji, czyli poza jej zakresem widoczności. Musisz ją przekazać do f-cji zaloguj() jako parametr.
  1. <?php
  2. or die($this->blad("Blad polaczenia z baza danych " . pg_last_error($db))); <-- TO JEST 463 LINIJKA
  3. ?>

No i będzie błąd, bo f-cja zaloguj() nie wie, co to jest $db.
pejot
Zrobiłem tak:

$db($polaczenie)

I dostaje to:

Fatal error
: Function name must be a string in /var/www/test/index.php on line 462
erix
A zasięg zmiennych...?
  1. <?php
  2. $db = $polaczenie
  3. ?>
blooregard
Czytaj ze zrozumieniem.

Funkcja zaloguuj() potrzebuje argumentu $polaczenie, żeby móc go używać jako swoją zmienną.
Jak przekazujemy argumenty do funkcji?

Ano tak:
funkcja($argument1, $argument1, ... , $argument_n)

Wtedy zmienne $argument1 i kolejne mogą być używane w f-cji i tylko tam (to się nazywa zasięg zmiennej - w tym przypadku zasięg dotyczy tylko funkcji).

Łączymy nową wiedzę w całość:

Skoro w f-cji zaloguj() wykorzystujesz uchwyt do połączenia $polaczenie, f-cja musi jakoś ten uhwyt dostać. Więc przekazujemy go jako argument:
  1. <?php
  2. zaloguj($polaczenie) {
  3. ...
  4. or die($this->blad("Blad polaczenia z baza danych " . pg_last_error($polaczenie))); <-- TO JEST 463 LINIJKA
  5. }
  6. ?>

I jeśli reszta jest OK, w linijce 463 błędu nie będzie.

Teraz popatrzmy, co Ty zrobiłeś i jaki to dało efekt.

Cytat
$db($polaczenie)

I dostaje to:

Fatal error: Function name must be a string in /var/www/test/index.php on line 462




$db($polaczenie) - zadziałałoby tylko wtedy, jeśli wcześniej zmiennej $db przypisałbyś nazwę jakiejś f-cj:
  1. <?php
  2. function jakas( $tekst ) {
  3.  echo $tekst;
  4. }
  5.  
  6. $polaczenie = 'alamakota';
  7. $db = 'jakas';
  8.  
  9. $db($polaczenie); -> wyswietli 'alamakota'
  10. ?>

Ale ta konstrukcja językowa nie ma teraz nic do rzeczy w temacie.

Teraz komunikat błędu:
Fatal error: Function name must be a string in /var/www/test/index.php

Jedziemy:
Fatal error: - błąd kompilacji, powodujący nie wykonanie skryptu.
Function name must be a string - bierzemy słowniczek i tłumaczymy:
nazwa funkcji musi być tekstem...

A u Ciebie jest czym ?
$db($polaczenie)

Odpowiedź: zmienną.

Podsumowanie:
- czytamy ze zrozumieniem komunikaty błędów
- czytamy dokumentację na php.net
- uczymy się podstaw, czyli: tworzenia funkcji, przekazywania do niej parametrów i korystania z nich w funkcjach
pejot
Dzięki za rady. Ale problem nie rozwiazany jest do końca:( Teraz mam tak:

  1. <?php
  2. //Config
  3. require('config.inc.php');
  4. $polaczenie = "host=$host port=$port dbname=$dbname user=$user password=$password";
  5. //wyciety tekst
  6. function zaloguj($aAutor){
  7.        $db = pg_connect($polaczenie)
  8.        or die($this->blad("Blad polaczenia z baza danych " . pg_last_error($db)));
  9.        $zapytanie =
  10.        sprintf("    SELECT a.id, a.idgrupa, \"login\", 123456789, a.aktywny, g.rodzaj "
  11.        . " FROM systemkontaktowy.autorzy a "
  12.        . " LEFT JOIN systemkontaktowy.grupy g "
  13.        . " ON g.id = a.idgrupa "
  14.        . "WHERE login = '%s' AND 123456789 = '%s' AND aktywny = true "
  15.        ,$aAutor->fLogin,$aAutor->f123456789);
  16.        $wynik = pg_query($db,$zapytanie);
  17.        if(!$wynik){
  18.            die("Blad polaczenia przy logowaniu. Prosze sprobowac pozniej");
  19. ?>


I w rezultacie dostaje:

Warning: pg_connect() [function.pg-connect]: Unable to connect to PostgreSQL server: FATAL: Ident authentication failed for user "www-data" in /var/www/test/index.php on line 462

Warning: pg_last_error(): supplied argument is not a valid PostgreSQL link resource in /var/www/test/index.php on line 463
<h3 class="blad">BLAD: Blad polaczenia z baza danych </h3>
Dlaczego loguje sie na user'a "www-data"?questionmark.gif
blooregard
Cytat
Dzięki za rady. Ale problem nie rozwiazany jest do końca:(

Dziekujesz za rady, do których sie nie stosujesz.

  1. <?php
  2. $polaczenie = "host=$host port=$port dbname=$dbname user=$user password=$password";
  3. //wyciety tekst
  4. function zaloguj($aAutor){
  5.       $db = pg_connect($polaczenie)
  6.       or die($this->blad("Blad polaczenia z baza danych " . pg_last_error($db)));
  7. ?>


nadal nie przekazujesz danych do połączenia z bazą do funkcji zaloguj(), tylko jakiegoś autora.
Powinno być tak:
  1. <?php
  2. function zaloguj($polaczenie) {
  3.   $db = pg_connect($polaczenie);
  4. ...
  5. ?>


a nie, jak u Ciebie:
  1. <?php
  2. function zaloguj($aAuthor) {
  3.   $db = pg_connect($polaczenie);  <- sk&#261;d f-cja zaloguj() ma wiedzieć, co to jest $polaczenie ?
  4. ...
  5. ?>

//EDIT $db - tu jest ok, teraz to ja juz się zamotałem

Komunikaty błędów:
Warning: pg_connect() [function.pg-connect]: Unable to connect to PostgreSQL server: FATAL: Ident authentication failed for user "www-data" in /var/www/test/index.php on line 462
Nie mogę połączyć się z serwerem PostgreSQL. Autentykacja nie powiodła się (czyli coś masz zje....ne w parametrach połączenia)

Warning: pg_last_error(): supplied argument is not a valid PostgreSQL link resource in /var/www/test/index.php on line 463
<h3 class="blad">BLAD: Blad polaczenia z baza danych </h3>
Spodziewany argument nie jest prawidłowym zasobem PostgreSQL.


1. Manual.
2. Angielski.
3. Myślenie.
pejot
Ja tego projektu nie tworzyłem to jest znajomego na uczelnie ja się troszkę lepiej od niego znam i dlatego staram sie jemu pomóc.
blooregard
Poprawiłem poprzedniego swojego posta. Przekaż $polaczenie do f-cji zaloguj() i powinno być ok.
erix
~blooregard, weź Ty się wyśpij:
  1. <?php
  2. $polaczenie = "host=$host port=$port dbname=$dbname user=$user password=$password";
  3. //wyciety tekst
  4. function zaloguj($aAutor){
  5.      $db = pg_connect($polaczenie)
  6. ?>

tongue.gif

Jak będzie funkcja widziała tę zmienną, to ja pochodzę z Chin.

Ja bym się nie męczył i zamiast:
  1. <?php
  2. $polaczenie = "host=$host port=$port dbname=$dbname user=$user password=$password";
  3. //wyciety tekst
  4. function zaloguj($aAutor){
  5.       $db = pg_connect($polaczenie)
  6.       or die($this->blad("Blad polaczenia z baza danych " . pg_last_error($db)));
  7. ?>

Zrobił tak:
  1. <?php
  2. $polaczenie = pg_connect("host=$host port=$port dbname=$dbname user=$user password=$password");
  3. //wyciety tekst
  4. function zaloguj($aAutor, $db){
  5. ?>

i wywoływał tak:
  1. <?php
  2. zaloguj('jakaszmienna', $polaczenie);
  3. ?>
cojack
Ciekawe jak Ty chcesz mieć dostęp w funkcji do zmiennej z zewnątrz...
Pawel_W
zawsze możesz przesłać zmienną w parametrze funkcji ;o
cojack
Ale tego nie robi. Więc stąd ten błąd.
erix
Jak nie robię? [;

Popatrz na drugi parametr funkcji.
cojack
Ale ja nie mówię tego erix do Ciebie ;] Ty się nie liczysz, chodzący manual ;/
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.