2010-09-01 10 views
7

Soy un novato de php (pero desarrollador de larga duración en otros idiomas) y estoy probando algunas conexiones de ejemplo de db en "PHP, MySQL, & JavaScript". Muestra un archivo de ejemplo para incluir variables de conexión db (nombre de servidor, nombre de usuario, contraseña, base de datos, etc.). Tengo un archivo php que tiene un puñado de funciones que escribí y una de ellas tiene algunas consultas SQL. Por alguna razón, llamar require_once en ese archivo no produce ningún error (tengo E_ALL configurado) pero esas variables en mi base de datos php son nulas.Use Require_once() para incluir las variables de conexión de la base de datos correctamente

Llamé a un eco con todas las variables dentro de esa función para ver qué diablos está pasando y, por supuesto, imprime una línea en blanco. ¿Qué hay en el mundo fuera del alcance? Me falta algo simple.

He aquí un ejemplo de lo que estoy haciendo

db_login.php

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

functions.php

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

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

Llámame loco, pero no se debe este ser lo suficientemente simple para trabajar?

Respuesta

5

Las variables se declaran en db_login.php son globales. Para acceder a ellos en su función, debe usar la variable $GLOBALS, p. $GLOBALS['db_server'], o declararlos como globales dentro de su función utilizando la palabra clave global, p. Ej. global $db_server.

7

PHP no tiene function scope como Javascript, por lo que no tienen acceso a las variables en db_login.php dentro de las funciones de functions.php.

Existen varias formas de solucionar esto. Debido a su probable uso del nombre del servidor global, constants probablemente sea una buena solución, ya que nada puede cambiarlos.

En su caso, usted puede hacer:

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

En su caso tener el nombre del servidor como una constante es probablemente adecuado. Si se trata de algo que se quiere tratar como una variable real, se puede pasar la variable en la función por valor o por referencia:

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

Como nota, en su caso, utilizando el global palabra clave o la matriz $GLOBALS dentro de una función es essentially the same as passing by reference., pero si no está pasando del ámbito global, pueden ser muy diferentes (en una clase o de otra función, por ejemplo).

Cuestiones relacionadas