2010-09-01 18 views
7

Jestem początkującym php (ale długoletnim programistą w innych językach) i próbuję przykładowych połączeń db w "PHP, MySQL, & JavaScript". Pokazuje przykładowy plik zawierający zmienne połączenia db (nazwa serwera, nazwa użytkownika, hasło, baza danych itp.). Mam plik php, który ma kilka funkcji, które napisałem, a jeden z nich ma kilka zapytań SQL. Z jakiegoś powodu wywołanie require_once w tym pliku nie powoduje żadnych błędów (mam E_ALL config'd), ale te zmienne w moim pliku php bazy danych mają wartość null.Użyj Require_once(), aby poprawnie uwzględnić zmienne połączenia z bazą danych

Zadzwoniłem do echa ze wszystkimi zmiennymi w tej funkcji, aby zobaczyć, co się dzieje i oczywiście wypisuje pustą linię. Co na świecie jest poza zakresem? Muszę przegapić coś prostego.

Oto przykład tego, co robię

db_login.php

<?php 
    $db_server = 'localhost'; 
    // .... 
?> 

functions.php

<?php 
    require_once('db_login.php'); 

    function myfunction() { 
     echo "$db_server"; 
     // ... 
    } 
?> 

Call me crazy, ale nie powinno to być wystarczająco proste do pracy?

Odpowiedz

5

Zmienne zadeklarować w db_login.php są globalne. Aby uzyskać do nich dostęp w swojej funkcji, musisz użyć zmiennej $GLOBALS, np. $GLOBALS['db_server'] lub zadeklaruj je jako globalne w swojej funkcji, używając słowa kluczowego global, np. global $db_server.

7

PHP nie posiada function scope jak JavaScript, więc nie masz dostępu do zmiennych w db_login.php wewnątrz funkcji functions.php.

Istnieje wiele sposobów radzenia sobie z tym. Z powodu prawdopodobnego użycia nazwy serwera globalna constants byłaby prawdopodobnie dobrym rozwiązaniem, ponieważ nic nie może ich zmienić.

W twoim przypadku można zrobić:

<?php 
    require_once('db_login.php'); 
     // You have access to $db_server here. 
     // Create a constant. 
    define("DB_SERVER", $db_server); 

    function myfunction() { 
      // Using a constant. Note that there is no "$". 
     echo DB_SERVER ; 
      // Constants are interpreted inside double quotes too 
     echo "\nMy constant is DB_SERVER"; 
     // ... 
    } 
?> 

W twoim przypadku mającego nazwę serwera w postaci stałej jest chyba odpowiednie. Jeśli masz do czynienia z czymś, co chcesz traktować jako prawdziwy zmiennej, można przekazać zmienną do funkcji przez wartość lub przez odniesienie:

myfunction($variable); 

    // by value 
function myfunction($pass_variable_to_me_by_value) 
{ 
    echo $pass_variable_to_me_by_value; 
    // ... 
} 

function myfunction(& $pass_variable_to_me_by_reference) 
{ 
    echo $pass_variable_to_me_by_reference; 
    // ... 
} 

Jako notatkę, w przypadku, używając global słowo kluczowe lub tablica $GLOBALS wewnątrz funkcji to essentially the same as passing by reference., ale jeśli nie przechodzisz z zakresu globalnego, mogą być bardzo różne (na przykład w klasie lub innej funkcji).

Powiązane problemy