Zmiana zasięgu zmiennych lokalnych

0

Witam

Mam pewnie dość głupi problem, ale nie mogę sobie z nim poradzić.
Posiadam 2 pliki php, w jednym z nich umieściłem 3 funkcje (functions.php), a w 2 wyświetlam wartości zwracane przez jedną z tych funkcji(index.php).

Sprawa niby prosta, ale nie mogę poradzić sobie z deklaracją zmiennych w jednej z funkcji. Oto kod pliku functions.php:

<?php 
function connection() { 
    // serwer 
    $mysql_server = "localhost"; 
    // admin 
    $mysql_admin = "joomla"; 
    // hasło 
    $mysql_pass = "joomla"; 
    // nazwa baza 
    $mysql_db = "bank"; 
    // nawiązujemy połączenie z serwerem MySQL 
    @mysql_connect($mysql_server, $mysql_admin, $mysql_pass) 
    or die('Brak połączenia z serwerem MySQL.'); 
    // łączymy się z bazą danych 
    @mysql_select_db($mysql_db) 
    or die('Błąd wyboru bazy danych.'); 
} 

function dane() {
connection();
$klienci = mysql_num_rows(mysql_query("select * FROM klienci WHERE Admin = 2")); 
}

function statystyki() {
dane();
echo $klienci;
}

?>

Wywołanie w pliku index.php:

<? statystyki(); ?>

Uprościłem funkcje by łatwiej było znaleźć błąd.
Ustaliłem, że problem tkwi w deklaracji zmiennej, ponieważ jeśli umieszczę kod echo $klienci; w funkcji dane, zmienna jest prawidłowo wyświetlana w pliku index.php. Natomiast wywoływanie funkcji statystyki(); nie przynosi żadnych rezultatów.

Moje php mocno kuleje, dlatego będę wdzięczny za podpowiedź, co i jak. Próbowałem zastosować global, GET, POST ale nic z tego nie wyszło. Długa lektura o zmiennych php, też nie pozwoliła wyciągnąć mi wniosków.

0

No i prawidłowo, bo klienci jest zmienna lokalną i po wyjściu z funkcji znika.

<?php
function connection() {
    // serwer
    $mysql_server = "localhost";
    // admin
    $mysql_admin = "joomla";
    // hasło
    $mysql_pass = "joomla";
    // nazwa baza
    $mysql_db = "bank";
    // nawiązujemy połączenie z serwerem MySQL
    @mysql_connect($mysql_server, $mysql_admin, $mysql_pass)
    or die('Brak połączenia z serwerem MySQL.');
    // łączymy się z bazą danych
    @mysql_select_db($mysql_db)
    or die('Błąd wyboru bazy danych.');
}

function dane() {
connection();
return mysql_num_rows(mysql_query("select * FROM klienci WHERE Admin = 2"));
}

function statystyki() {
echo dane();
}

?>

btw kod i tak mi sie nie podoba:P

0

Ja wiem, że prawidłowo dlatego pytam jak to zmienić :D

@Cymes return mnie nie ustawia ponieważ pełny kod funkcji statystyki to:

function dane() {
connection();
$konta =mysql_num_rows(mysql_query("select * FROM konta")); 
$klienci = mysql_num_rows(mysql_query("select * FROM klienci WHERE Admin = 2")); 
$pracownicy = mysql_num_rows(mysql_query("select * FROM klienci WHERE Admin = 1")); 
$l_lokat = mysql_num_rows(mysql_query("select * FROM lokaty")); 
$logowania = mysql_num_rows(mysql_query("select * FROM logowania")); 
$logowania_d = mysql_num_rows(mysql_query("select * FROM logowania WHERE DATE(Data) = CURDATE()"));
$l_suma  = mysql_result((mysql_query("SELECT SUM( Stan_lokaty ) FROM lokaty")),0);
$k_suma  = mysql_result((mysql_query("SELECT SUM( Stan_konta ) FROM konta")),0);
$zadluzenie  = mysql_result((mysql_query("SELECT SUM( Zadluzenie ) FROM pozyczki")),0);
$operacje_sum  = mysql_result((mysql_query("SELECT SUM( Kwota ) FROM operacje ")),0);
$operacje_dzis  = mysql_result((mysql_query("SELECT SUM( Kwota ) FROM operacje WHERE DATE(Data) = CURDATE()")),0);
$oproc =  mysql_result((mysql_query("SELECT ROUND(AVG( Oprocentowanie ),2) FROM lokaty ")),0);
}

a z tego co mi wiadomo nie mogę umieścić kilku RETURN w funkcji :/

PS
Co nie tak jest z kodem? Z przyjemnością przyjmę krytykę w tym kierunku, zważywszy że dopiero się uczę i jestem podatny na sugestie :D

EDIT:
Zwracanie wielu zmiennych uzyskałem poprzez użycie tablicy w niżej opisany sposób:

function dane() {
connection();

$klienci = mysql_num_rows(mysql_query("select * FROM klienci WHERE Admin = 2")); 
return array($klienci);
 
}

function statystyki() {
$zmienna = dane();
echo $zmienna[0];
	              
}

Mimo że działa chciałbym otrzymać fachową poradę, czy jest to sposób prawidłowy.

0

Jak dla mnie, jest ok :) Ale możesz do tego zaprząc programowanie obiektowe i użyć klasy

class Baza {
   private $klienci;
   function connection() {
   // ...
   }
  
   function dane() {
     $this->connection();

     $this->klienci = mysql_num_rows(mysql_query("select * FROM klienci WHERE Admin = 2"));
     // ...
   }

   function statystyki() {
      $this->dane();
      echo $this->klienci;
   }

}

$baza = new Baza;
$baza->statystyki();

Coś w tym stylu właśnie.

0

Dzięki @guest123, tylko widzisz w moim przypadku problem polega na tym, że nie widzę sensu stosowania klas.
I nie chodzi tutaj o ten konkretny przypadek, ale w ogóle. Jakoś nie potrafię sobie wyobrazić sytuacji, w której przydadzą mi się klasy.

I nie jest to moje puste gadanie, bo naprawdę starałem się to zrozumieć (na przykładzie Delphi) i pisałem programy z wykorzystaniem klas, ale jak dla mnie było to komplikowanie prostych spraw. Pewnie są one przydatne, ale ja nie trafiłem jeszcze na program gdzie ułatwiłyby mi one sprawę (albo nie zdaję sobie po prostu z tego sprawy).

0

I jeszcze mi jeden pomysł wpadł do głowy, aczkolwiek to rozwinięcie Twojego - użyć tablic asocjacyjnych:

$klienci = mysql_num_rows(mysql_query("select * FROM klienci WHERE Admin = 2"));
$oproc = ...;
return array(
  "klienci" => $klienci,
  "oproc" => $oproc
  ...
);

I wykorzystać w taki sposób:

function statystyki() {
  $_dane = dane();
  echo $_dane["klienci"];
}

A w przykładzie jeszcze wyżej klasa była traktowana raczej jako przestrzeń nazw.

0

Dziękuję panowie, za zainteresowanie i wskazówki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1