2010-09-01 25 views
7

Tôi là một newbie php (nhưng nhà phát triển thời gian dài bằng các ngôn ngữ khác) và tôi đang thử một số kết nối db ví dụ trong "PHP, MySQL, & JavaScript". Nó cho thấy một tệp ví dụ để bao gồm các biến kết nối db (tên máy chủ, tên người dùng, mật khẩu, cơ sở dữ liệu, v.v.). Tôi có một tập tin php mà có một số ít các chức năng tôi đã viết và một trong số họ có một vài truy vấn SQL. Vì lý do gì, gọi require_once trong tập tin đó không xuất ra bất kỳ lỗi nào (tôi có cấu hình E_ALL) nhưng các biến trong tệp php cơ sở dữ liệu của tôi là null.Sử dụng Require_once() để bao gồm các biến kết nối cơ sở dữ liệu chính xác

Tôi gọi là một tiếng vọng với tất cả các biến trong hàm đó để xem những gì heck đang xảy ra và tất nhiên nó in một dòng trống. Điều gì trên thế giới nằm ngoài phạm vi? Tôi phải thiếu một cái gì đó đơn giản.

Dưới đây là một ví dụ về những gì tôi đang làm

db_login.php

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

functions.php

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

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

Hãy gọi cho tôi điên, nhưng không nên này đủ đơn giản để làm việc?

Trả lời

5

Các biến bạn khai báo trong db_login.php là globals. Để truy cập chúng trong chức năng của bạn, bạn cần sử dụng biến số $GLOBALS, ví dụ: $GLOBALS['db_server'] hoặc tuyên bố chúng là toàn cục bên trong hàm của bạn bằng cách sử dụng từ khóa global, ví dụ: global $db_server.

7

PHP không có function scope như Javascript, vì vậy bạn không có quyền truy cập vào các biến trong db_login.php bên trong các chức năng của functions.php.

Có nhiều cách để giải quyết vấn đề này. Do khả năng sử dụng tên máy chủ toàn cầu constants của bạn có thể là một giải pháp tốt, vì không có gì có thể thay đổi chúng.

Trong trường hợp của bạn, bạn có thể làm:

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

Trong trường hợp của bạn có tên máy chủ như một hằng số có lẽ là thích hợp. Nếu bạn đang đối phó với một cái gì đó mà bạn muốn để điều trị như là một biến thành sự thật, bạn có thể vượt qua các biến vào chức năng theo giá trị hoặc bằng cách tham khảo:

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

Là một lưu ý, trong trường hợp của bạn, sử dụng global từ khóa hoặc mảng $GLOBALS bên trong một hàm là essentially the same as passing by reference., nhưng nếu bạn không chuyển từ phạm vi toàn cục, chúng có thể rất khác nhau (trong một Lớp hoặc từ một hàm khác chẳng hạn).

Các vấn đề liên quan