2010-09-01 31 views
7

Je suis un débutant php (mais développeur de longue date dans d'autres langues) et j'essaie quelques exemples de connexions db dans "PHP, MySQL, & JavaScript". Il montre un exemple de fichier pour inclure des variables de connexion db (nom de serveur, nom d'utilisateur, mot de passe, base de données, etc.). J'ai un fichier php qui a une poignée de fonctions que j'ai écrites et l'un d'entre eux a quelques requêtes SQL. Pour une raison quelconque, l'appel de require_once dans ce fichier ne génère aucune erreur (j'ai E_ALL config'd) mais ces variables dans mon fichier php de base de données sont null.Utilisez Require_once() pour inclure correctement les variables de connexion à la base de données

J'ai appelé un écho avec toutes les variables de cette fonction pour voir ce qui se passe et, bien sûr, il imprime une ligne vide. Qu'est-ce qui est hors de portée dans le monde? Je dois manquer quelque chose de simple.

Voici un exemple de ce que je fais

db_login.php

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

functions.php

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

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

Appelez-moi fou, mais ne devrait pas être assez simple pour travailler?

Répondre

5

Les variables que vous racontons dans db_login.php sont globals. Pour y accéder dans votre fonction, vous devez utiliser la variable $GLOBALS, par ex. $GLOBALS['db_server'] ou les déclarer comme globaux dans votre fonction en utilisant le mot-clé global, par ex. global $db_server.

7

PHP n'a pas de function scope comme Javascript, donc vous ne pas avoir accès aux variables db_login.php à l'intérieur des fonctions de functions.php.

Il existe plusieurs façons de gérer cela. En raison de votre utilisation probable du nom de serveur global constants serait probablement une bonne solution, puisque rien ne peut les changer.

Dans votre cas, vous pouvez faire:

<?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"; 
     // ... 
    } 
?> 

Dans votre cas ayant le nom du serveur comme est probablement approprié constant. Si vous avez affaire à quelque chose que vous voulez traiter comme une vraie variable, vous pouvez passer la variable dans la fonction par valeur ou par référence:

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; 
    // ... 
} 

Comme une note, dans votre cas, en utilisant le global Le mot-clé ou le tableau $GLOBALS à l'intérieur d'une fonction est essentially the same as passing by reference., mais si vous ne passez pas de la portée globale, ils peuvent être très différents (dans une classe ou d'une autre fonction par exemple).