php не видит глобальных переменных

Discussion in 'PHP' started by barnaki, 18 Mar 2011.

  1. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    140
    Reputations:
    4
    вот конфиг
    PHP:
    $GLOBALS["user"] = "root";
    $GLOBALS["password"] = "root";
    $GLOBALS["server"] = "localhost";
    $GLOBALS["database"] = "mazazin";
    вот файл в котором использую
    PHP:
    include_once $_SERVER["DOCUMENT_ROOT"].("/config/config.php");

        
             
    $db ADONewConnection("mysql");
         
    $db->Connect($server$user$password$database);
    пивет indefined variable $server. я и глобальными пробывал делать и просто перемменными все = indefined.
    ошибки что файл не найден не выводит. стало быть оно его инклюдит. что это может быть. пишет что и другие переменные indefined. тоже :(
    даже если сделать так то не видит
    PHP:
     static $instance;
      static   
    $server;
      static  
    $user;
      static 
    $password;
      static   
    $database;


    PHP:
    include_once $_SERVER["DOCUMENT_ROOT"].("/config/config.php");
         
    self :: $server $GLOBALS["server"];
          
    self::  $user $GLOBALS["user"];
          
    self ::  $password $GLOBALS["password"];
          
    self ::  $database $GLOBALS["database"];
     
    #1 barnaki, 18 Mar 2011
    Last edited: 18 Mar 2011
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    barnaki вы уверены что путь разрешается правильно (то что ошибок не выдается - не повод делать предположение, что все нормально)? Попробуйте во втором скрипте:
    PHP:
    var_dump($_SERVER["DOCUMENT_ROOT"].("/config/config.php"));
    var_dump(realpath($_SERVER["DOCUMENT_ROOT"].("/config/config.php")));
    В первом - пропишите какой нибудь вывод текста
     
    _________________________
  3. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    140
    Reputations:
    4
    вывело string(26) "C:\adodb\config\config.php" это точный путь до конфига
     
  4. Чакэ

    Чакэ Elder - Старейшина

    Joined:
    15 Aug 2010
    Messages:
    260
    Likes Received:
    66
    Reputations:
    62
    Gifts, где связь с неправильным инклудом и неопределенными переменными? вам не кажется что были бы ругательства в сторону include в случае неверного пути, или я не правильно понял суть вашего поста? Аффтар, вам советую юзать обычные переменные а не массивы глобалс. это всё от лукавого.
     
  5. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    140
    Reputations:
    4
    так оно и с обычными переменными не работает. globals попробывал уже из отчаяния
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Чакэ при вычурных настройках error_reporting - нотайсы выводятся, а варнинги - нет. Например error_reporting(E_NOTICE);

    barnaki все таки сделайте вывод текста в первом скрипте. Плюс в обоих - error_reporting(E_ALL); перед инклудом и перед заданием переменных
     
    _________________________
  7. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    140
    Reputations:
    4
    текст если вписать в подключаемый файл выводится.
    error_reporting только что проверил стоит E_ALL
    дописал
    PHP:
    var_dump(realpath($_SERVER["DOCUMENT_ROOT"].("/config/config.php")));
            
    error_reporting(E_ALL);
            
    $db ADONewConnection("mysql");
         
    $db->Connect($server$user$password$database);
    и в подключаемом файле тоже самое. и нечего не выводит.кроме того что переменные не объявлены
     
    #7 barnaki, 18 Mar 2011
    Last edited: 18 Mar 2011
  8. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    140
    Reputations:
    4
    я сделал var_dump($GLOBALS["user"]);
    на строку ниже чем объявляю ее и оно все нормально вывело string 4 "root" но там по прежнему не видит :(
     
  9. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    140
    Reputations:
    4
    блин я уже вообще нечего не понимаю.
    я делаю
    PHP:
    var_dump(realpath($_SERVER["DOCUMENT_ROOT"].("/config/config.php")));
            echo 
    "<br>";
            
    var_dump($GLOBALS["user"]);
            echo 
    "<br>";
             
    self :: $server $GLOBALS["server"];
            echo 
    "$server"."hello";
            
    error_reporting(E_ALL);




            
    $db ADONewConnection("mysql");
         
    $db->Connect($server$user$password$database);
    и тут оно видит глобальную переменную. но как я ни пытался но переменной
    public static $user; я значение глобальной переменной присвоить не смог. почему оно не присваивает ? можно конечно в функцию conecta впихнуть прямо глобальные переменные но вопрос все = остается открытым
     
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    barnaki подождите, вы случайно не пытаетесь проинклудить файл внутри функции? Если да, то не стоит использовать массив GLOBALS для установки локальных переменных внутри функции - простите за путанную фразу...

    2) Вы уверены, что вы не инклудите файл с конфигом в каком либо другом месте? Т.е. попробуйте вместо include_once использовать просто include
     
    _________________________
  11. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    140
    Reputations:
    4
    я инклюжу этот файл внутри конструктора. а переменные вызываю внутри метода. глобальные видит но не приравнивет даже простым переменным значение этих глобальных если в connect впихнуть сразу глабольные переменные то все работает. это из за того что я это в функции делаю ?
     
  12. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    barnaki тяжело читается ваш последний пост. Суть - при инклуде файла внутри функции, все переменные из файла импортируются в локальную область видимости этой функции. При этом массив $GLOBALS являясь суперглобальным нормально принимает в себя ваши переменные.

    Но вот тут то начинается ПХПшная магия - Функции в ПХП не имеют доступа к глобальным переменным, если их об этом не предупредить. Хоть вы и импортировали в глобальную область видимости свои переменные (те которые начинаются на $GLOBALS), внутри метода вы не объявляете с помощью ключевого слова global - что эти переменные следует искать в глобальной области видимости. В общем вот пример

    bar1.php:
    PHP:
    $GLOBALS["user"] = "root";
    $user2 'root2';
    bar2.php:
    PHP:
    error_reporting(E_ALL);

    class 
    test_include
    {
        function 
    __construct()
        {
            include 
    "dev".("/bar1.php");
            echo 
    "\r\n_construct>User:".$user."\r\n"// Вызовет ошибку, ПХП пытается обратиться к ЛОКАЛЬНОЙ переменной, а переменная $user после инклуда находится в глобальной области видимости
            
    echo "\r\n_construct>User2:".$user2."\r\n"// Нормально выведется, так как $user2 - локальная переменная, т.к. инклуд произошел внутри функции
            
    echo "\r\n_construct>Globals_User:".$GLOBALS['user']."\r\n"// Выведется нормально, так как мы обращаемся к суперглобальному массиву $GLOBALS, в который после инклуда попала наша переменная
            
    global $user$user2// Объявляем интерпретатору, что переменные $user, $user2 следует искать в глобально области видимости
            
    echo "\r\n_construct>keyword_User:".$user."\r\n"// Выведет наше значение, т.к. переменная уже глобальна
            
    echo "\r\n_construct>keyword_User2:".$user2."\r\n"// Не выведет ничего (это кстати говоря странно, должна быть ошибка)
        
    }
        function 
    test()
        {
            echo 
    "\r\n======FUNCTION======\r\n";
            echo 
    "\r\n_method>User:".$user."\r\n"// Ошибка, по той же причине, что и в конструкторе
            
    echo "\r\n_method>User2:".$user2."\r\n"// Ошибка, переменная была проинклужена в другой функции, здесь она уже не будет видима
            
    echo "\r\n_method>Globals_User:".$GLOBALS['user']."\r\n"// Опять таки все выведется, мы обращаемся к глобальной переменной
            
    global $user$user2// уже было
            
    echo "\r\n_method>keyword_User:".$user."\r\n"// Будет выведено наше значение из глобальной области видимости
            
    echo "\r\n_method>keyword_User2:".$user2."\r\n"// Пусто, в глобальной области видимости такой переменной не существует
        
    }
    }

    $test_obj = new test_include();
    $test_obj->test();
    Какой выход из этого?

    1) Не инклудить никогда файлы внутри функций, если вы не имеете абсолютной уверенности, что вам это нужно и вы знаете как это работает
    2) Внутри функций объявлять переменные глобальными, с помощью ключевого слова global (естественно, вам нужно помнить, что они действительно глобальные, и действительно вам нужны)
    3) Либо вы можете использовать внутри функций массив $GLOBALS для доступа к глобальным переменным
    4) Вы _можете_ инклудить файл внутри конструктора, но потрудитесь "забрать" переменные из локальной области видимости и прописать их в аттрибуты класса, далее стандартно с ними работайте. (ключевые слова self и $this внутри файла, который инклудите - работать не будут. Просто не будут..)
    5) Используйте наследование
    6) Не используйте уличную магию

    З.Ы., я чуть было в чудеса из за вас не поверил. В след раз пишите ВЕСЬ код, а не огрызки из разных частей...
     
    _________________________
  13. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    140
    Reputations:
    4
    ясно спасибо +1