2013-07-23 1 views
-1

이 코드는PHP : 함수가 필요한 파일의 변수를 사용할 수없는 이유는 무엇입니까?

#DB Informations (username/password) 
require('/path/to/db_informations.php'); 


# This function return the 'name of the $ID from the db 
function getName($ID){ 
    $link = new PDO($dsn, $user, $pwd); 

    $query = "SELECT `name` FROM `tables` WHERE `id`=$ID"; 

    $smt = $link->prepare($query); 
    $smt->execute(); 
    $name = $smt->fetch(PDO::FETCH_ASSOC); 

    return $name['name']; 
} 

# db_informations contain the credentials to connect the database. ($dsn, $user, $pwd) 

MMH require(/path/to/db_informations.php') 나는`넣어) (요구하는 경우에도 함수 내에서 작동하지 않는 경우, 데이터베이스에서 선택된 $의 ID의 이름을 반환하도록되어있다; ' 기능. 내 실수를 이해하지 못한다. 나를 설명해 주시겠습니까?

/path/to/file이 PHP에 포함되지 않은 이유는 무엇입니까? 및 방법?

+4

[가변 범위] (http://www.php.net/manual/en/language.variables.scope.php)에 대해 읽어 보시기 바랍니다. –

+0

링크 Mark에 감사드립니다! – torr

+0

변수를 함수로 구문 분석 한 다음 반환하십시오. – Vector

답변

0

이것은 variable scope입니다.

$dsn, $user, $pwd은 전역 변수이며 getName() 기능 범위 내에 정의되어 있지 않습니다.

이 문제를 가장 빨리 해결할 수있는 방법은 global입니다.

function getName($ID) { 
    global $dsn, $user, $pwd; 
    // code... 
} 

그러나, 나는 (그들이 evil입니다) global를 사용하지 않는 것이 좋습니다. 더 좋은 방법은 전역 범위에서 데이터베이스 객체 (PDO)를 정의하고 함수/클래스에 전달하는 것입니다. 이를 dependency injection이라고합니다.

+0

하지만 데이터베이스 연결을 유지해야만 전역 변수 대신 사용할 수있는 함수는 무엇입니까? – torr

+0

앞에서 말했듯이 * db_information * 스크립트와 같이 전역 범위 내에서 데이터베이스 객체를 정의하십시오. 처음에는'getName()'함수 밖에서 간단히 이동할 수 있습니다. –

1

DB 변수가 getName() 함수의 범위에 있지 않습니다. 당신은 최소한으로 필요 : 큰 그림에서

function getName(...) { 
    global $dsn, $user, $pwd; 
    ... 
} 

, 당신이해야 하지 글로벌 변수를 사용 할 수 없으며 모든 함수 호출에서 DB 연결을 작성해야합니다. db 설정 파일에 ONCE 데이터베이스에 연결 한 다음 스크립트의 나머지 DB 작업에 대해 해당 연결을 다시 사용하기 만하면됩니다.

관련 문제