Ошибка включения PHP - PullRequest
       18

Ошибка включения PHP

1 голос
/ 19 декабря 2009

После изменения моего заголовка включения на функцию добавления. Он отключил мой php echo код имени пользователя.

Так и пошло от

htp: //example.com/register.php? R = имя пользователя

до

HTP: //example.com/register.php г =

<?php

function headertop($page) {

 include('header.php');

}

headertop('members');

?>

<div id="myaccount">

<p class="reflink" align="center">To refer others, use this link: <span class="textblue">
             <?php require ("config.php"); echo $url; ?>/register.php?r=<?php echo $row["username"]; ?>
            </span></p>

Ответы [ 3 ]

2 голосов
/ 19 декабря 2009

Полагаю, это не работает, потому что $row не входит в сферу применения. Это определено в header.php, который теперь является локальным для headertop().

Почему вы так или иначе включаете header.php?

1 голос
/ 19 декабря 2009

Пожалуйста, рассмотрите этот код, чтобы понять, что происходит:

<?php // bar.php
    $one = 1;
    $two = 2;

и

<?php // foo.php
    $someVar = 'var';

    function foo()
    {
        $someOtherVar = 'otherVar';
        include 'bar.php';

        // get defined vars in current scope
        print_r(array_keys(get_defined_vars()));
    }

    foo();

    // get defined vars in current scope
    print_r(array_keys(get_defined_vars()));

выведет что-то вроде

Array
(
    [0] => someOtherVar
    [1] => one
    [2] => two
)
Array
(
    [0] => GLOBALS
    [1] => _ENV
    [2] => HTTP_ENV_VARS
    [3] => argv
    [4] => argc
    [5] => _POST
    [6] => HTTP_POST_VARS
    [7] => _GET
    [8] => HTTP_GET_VARS
    [9] => _COOKIE
    [10] => HTTP_COOKIE_VARS
    [11] => _SERVER
    [12] => HTTP_SERVER_VARS
    [13] => _FILES
    [14] => HTTP_POST_FILES
    [15] => _REQUEST
    [16] => someVar
)

Как видите, внутри области действия функции foo () у вас есть доступ к переменным, включенным в bar.php, но как только функция будет выполнена, и поток управления вернется в глобальную область, например, после вызова foo () переменные недоступны, поскольку они не были экспортированы за пределы области действия функции. Если вы включили bar.php вне области действия функции, например

include 'bar.php'; // instead of foo()
print_r(array_keys(get_defined_vars()));

вы получите

Array
( 
    ... 
    [16] => someVar
    [17] => one
    [18] => two
)

Помещение большого количества переменных в глобальную область видимости несет опасность загрязнения глобальной области действия и риска столкновения имен переменных. То есть у одного файла включения может быть переменная $ row, а у другого тоже может быть переменная, и они перезаписывают друг друга. Лучше объединить вещи, которые принадлежат вместе, в классы / объекты и / или заменить глобальную область видимости с помощью шаблона реестра .

Хотя я очень одобряю ООП-подход, вы все равно можете сделать это с вашей функцией на месте. Просто верните необходимую переменную из вызова функции.

    function foo()
    {
        $someOtherVar = 'otherVar';
        include 'bar.php';

        // this is why I do not like this approach $one pops out all of a sudden.
        // I can deduct, it has to be in bar.php, but if you do that often, your
        // code will be very hard to read.

        return $one;
    }

    $user = foo(); // will contain $one then

    // get defined vars in current scope
    print_r(array_keys(get_defined_vars()));

    // gives
    Array
    (
        ...
        [16] => someVar
        [17] => user
    )

Конечно, если вы хотите, чтобы все переменные были объявлены во время вызова foo (), вам нужно было бы поместить их в массив, поскольку одновременно может быть возвращено только одно значение. Но это в основном, когда вы замечаете, что это становится неуклюжим, и переключение на занятия кажется естественным (ну, по крайней мере, для меня).

1 голос
/ 19 декабря 2009

Если $row определено в функции в header.php, попробуйте добавить

global $row

Кроме того, это, вероятно, лучшая форма, чтобы все ваши включения были в одном месте. И вам, вероятно, не следует помещать это в функцию.

...