2013-11-29 4 views
0

У меня есть require «цепочка» в 3 файлах PHP. index.php требует db_get.php, что требует db_cred.php. Все они находятся в каталоге того же каталога. Эти коды:требуется файл внутри обязательного файла не работает

index.php

<?php 
require 'db_get.php'; 
$db = getDatabase(); 
var_dump($db); 
?> 

db_get.php

<?php 
require 'db_cred.php'; 

function getDatabase() 
{ 
    $host = 'localhost'; 
    $database = $db_name; 
    $username = $db_user; 
    $password = $db_pass; 

    $connectionString = 'mysql:host=' . $host . '; dbname=' . $database . ''; 
    $attributes = array(
     \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, 
     \PDO::ATTR_PERSISTENT => false, 
     \PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8mb4' 
    ); 
    return new \PDO($connectionString, $username, $password, $attributes); 
} 
?> 

db_cred.php (этот файл автоматически генерируется другой PHP файл)

<?php $db_name="testdb"; $db_user="qNOSdZ"; $db_pass="cAHk8A"; ?> 

ошибка я получил от index.php:

Notice: Undefined variable: db_name in C:\xampp\htdocs\sipil\me\db\db_get.php on line 7 
Notice: Undefined variable: db_user in C:\xampp\htdocs\sipil\me\db\db_get.php on line 8 
Notice: Undefined variable: db_pass in C:\xampp\htdocs\sipil\me\db\db_get.php on line 9 

Почему я получаю эти ошибки? Все эти файлы находятся в одном каталоге. Я могу быть немым, эта проблема заняла меня некоторое время, пожалуйста, помогите.

+2

'$ db_name/db_user/db_pass1' не определены в вашем getDatabase() функция - они не определены вообще, или вы забыли сделать «глобальный». Если вам понадобится (db_creds.php) внутри вашей функции getDatabase, все будет работать. –

+0

, но он уже определен в 'db_cred.php'. Проблема в том, почему' db_get.php' не может получить эти переменные? – topher

+1

Ваша проблема - [переменная область действия - http://php.net/manual/en/language.variables.scope.php](http://php.net/manual/en/language.variables.scope.php). переменные, определенные вне функции, недоступны внутри функции, если вы не добавляете их в качестве функциональных параметров или не определяете их как глобальные внутри функции, или поскольку Mark B предлагает переместить ваш 'require 'db_cred.php';' внутри вашей функции. – Sean

ответ

1
function getDatabase() 
{ 

    global $db_name; 
    global $db_user; 
    global $db_pass; 

    $host = 'localhost'; 
    $database = $db_name; 
    $username = $db_user; 
    $password = $db_pass; 

    $connectionString = 'mysql:host=' . $host . '; dbname=' . $database . ''; 
    $attributes = array(
     \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, 
     \PDO::ATTR_PERSISTENT => false, 
     \PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8mb4' 
    ); 
    return new \PDO($connectionString, $username, $password, $attributes); 
} 
1

Как сказано в приведенных выше замечаний, решение должно быть:

<?php 
require 'db_cred.php'; 

function getDatabase() 
{ 
    global $db_name, $db_user, $db_pass; 
    $host = 'localhost'; 
    $database = $db_name; 
    $username = $db_user; 
    $password = $db_pass; 

    $connectionString = 'mysql:host=' . $host . '; dbname=' . $database . ''; 
    $attributes = array(
     \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, 
     \PDO::ATTR_PERSISTENT => false, 
     \PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8mb4' 
    ); 
    return new \PDO($connectionString, $username, $password, $attributes); 
} 
?> 
Смежные вопросы