PHP-пропускну змінну для включення


84

Я намагаюся передати змінну у файл include . Мій хост змінив версію PHP, і тепер будь-яке рішення, яке я намагаюся, не працює.

Думаю, я перепробував усі варіанти, які міг знайти. Я впевнений, що це найпростіше!

Змінна повинна бути встановлена ​​та оцінена з першого файлу, що викликається (це насправді $_SERVER['PHP_SELF'], і вона повинна повертати шлях до цього файлу, не включений second.php).

ВАРІАНТ ПЕРШИЙ

У першому файлі:

global $variable;
$variable = "apple";
include('second.php');

У другому файлі:

echo $variable;

ВАРІАНТ ДРУГИЙ

У першому файлі:

function passvariable(){
    $variable = "apple";
    return $variable;
}
passvariable();

ВАРІАНТ ТРИ

$variable = "apple";
include "myfile.php?var=$variable"; // and I tried with http: and full site address too.


$variable = $_GET["var"]
echo $variable

Жодне з цього не працює для мене. Версія PHP - 5.2.16.

Чого мені не вистачає?

Дякую!


2
Ви намагалися заперечувати константу?
Oussama Jilal

7
Вам не потрібно передавати змінні, щоб включити файли. Ваш веб-сервер просто завантажить код ваших файлів, коли ви їх включите, як якщо б ви написали цей код із файлу включення в інший файл.
Леон Крамер

Не могли б ви пояснити "Жоден з цих творів"? Повідомлення про помилки теж будуть корисними ... І, AFAIK, включений код виконується в тому ж контексті, тому globalне є необхідним; ваш перший варіант повинен працювати нормально.
raina77ow

Як сказали інші, include () подібно до вставки коду туди, він продовжує виконання коду так само, як перебування в одному файлі. Вам не потрібно знаходити спосіб включити змінну у файл include, ви можете просто написати її перед include () (якщо потрібно).
adrianTNT

Відповіді:


49

Ви можете використовувати функцію extract ()
Drupal використовувати її у функції theme ().

Тут це функція візуалізації з $variablesаргументом.

function includeWithVariables($filePath, $variables = array(), $print = true)
{
    $output = NULL;
    if(file_exists($filePath)){
        // Extract the variables to a local namespace
        extract($variables);

        // Start output buffering
        ob_start();

        // Include the template file
        include $filePath;

        // End buffering and return its contents
        $output = ob_get_clean();
    }
    if ($print) {
        print $output;
    }
    return $output;

}


./index.php:

includeWithVariables('header.php', array('title' => 'Header Title'));

./header.php:

<h1><?php echo $title; ?></h1>

Ви також можете використовувати цей метод, додавши прапор EXTR_REFS до функції вилучення (див. Php.net/manual/en/function.extract.php ), щоб при передачі змінної з посиланням: array( 'title' => &$title )заголовок $ можна було змінити всередині включеного файлу .
Mauro

Я не думаю, що це працює в пізніших версіях PHP, скажімо 7.3
Роберт Москаль,

46

Варіант 3 неможливий - ви отримаєте виведений результат .php-файлу, точно так само, як якщо б натиснули цю URL-адресу у своєму браузері. Якщо натомість ви отримали необроблений PHP-код (як хотіли б), тоді ВСІ вихідні коди вашого сайту будуть відкриті, що, як правило, погано.

Варіант 2 не має великого сенсу - ви ховали б змінну у функції і підпорядковувались діапазону змінних PHP. Вам також потрібно буде $var = passvariable()десь дістати цю змінну 'inside' до 'outside', і ви знову повернетеся до квадрата.

варіант 1 є найбільш практичним. include()в основному буде шльопати у вказаному файлі і виконувати його тут же, ніби код у файлі був буквально частиною батьківської сторінки. Це дійсно виглядає як глобальна змінна, на яку більшість людей тут ненавидять, але, за допомогою семантики розбору PHP, ці дві ідентичні:

$x = 'foo';
include('bar.php');

і

$x = 'foo';
// contents of bar.php pasted here

11

Беручи до уваги, що включений у php файл на найпростішому рівні бере код із файлу та вставляє його туди, куди ви його викликали, і той факт, що в посібнику з включення зазначено таке:

Коли файл включений, код, який він містить, успадковує область змінної рядка, у якому відбувається включення. Будь-які змінні, доступні в цьому рядку у файлі, що викликає, будуть доступні у файлі, що викликається, з цього моменту вперед.

Ці речі змушують мене думати, що існує різна проблема взагалі. Крім того, варіант 3 ніколи не буде працювати, оскільки ви не перенаправляєте на second.phpнього, а просто включаєте його, а варіант номер 2 - це просто дивна робота. Найбільш основним прикладом включення статименту в php є:

vars.php
<?php

$color = 'green';
$fruit = 'apple';

?>

test.php
<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

Враховуючи, що варіант номер один є найближчим до цього прикладу (хоча він і складніший, ніж повинен бути), і він не працює, це змушує мене думати, що ви допустили помилку в операторі include (неправильний шлях відносно кореня або подібного проблема).


Можливо, я переплутав порядок речей? Насправді структура така: main.php $ variable = $ _SERVER ['PHP_SELF']; включити = ' side.com/footer.php ; footer.php: echo $ змінної; Весь включений файл не містить змінної, він просто щось з нею робить. У всіх параметрах, які я спробував, вихідні дані або порожні, або включають $ _SERVER ['PHP_SELF'] footer.php, а не main.php. Це інше?
user1590646

5

Що стосується питання OP, зокрема, "Змінна повинна бути встановлена ​​та оцінена з першого файлу, що викликається (це насправді '$ _SERVER [' PHP_SELF ']', і йому потрібно повернути шлях до цього файлу, а не включений другий. php). "

Це покаже вам, який файл включав цей файл. Помістіть це у включений файл.

$includer = debug_backtrace();
echo $includer[0]['file'];

На основі коментарів ОП у його питанні "Змінна повинна бути встановлена ​​та оцінена з першого файлу, що викликається (насправді це '$ _SERVER [' PHP_SELF ']', і йому потрібно повернути шлях до цього файлу, а не включений другий. php). " Йому потрібно з'ясувати, яким є шлях до файлу, який виконував включення second.php.
Джеремі1026

Відзначено. (з вашої відповіді не зрозуміло, будь ласка, поясніть його ["оскільки ОР хоче отримати оригінальну назву файлу бла-бла-бла")).
Привид

5

У мене така сама проблема тут, ви можете використовувати масив $ GLOBALS.

$GLOBALS["variable"] = "123";
include ("my.php");

Він також повинен запустити, роблячи це:

$myvar = "123";
include ("my.php");

....

echo $GLOBALS["myvar"];

Гарного дня.


4

ВАРІАНТ 1 працював у мене, в PHP 7, і, звичайно, працює і в PHP 5. І декларація глобальної області дії не потрібна для включеного файлу для доступу до змінних, включені - або "обов'язкові" - файли є частиною сценарію, лише переконайтеся, що ви зробили "включити" ПІСЛЯ оголошення змінної. Можливо, у вас у PHP.ini є якась неправильна конфігурація із глобальною сферою дії змінних?

Спробуйте в першому файлі:

  <?php 
  $myvariable="from first file";
  include ("./mysecondfile.php"); // in same folder as first file LOLL
  ?>

mysecondfile.php

  <?php 
  echo "this is my variable ". $myvariable;
  ?>

Це повинно працювати ... якщо це не просто спроба перевстановити PHP.


3

Я зіткнувся з цією проблемою, де мав файл, який встановлює змінні на основі параметрів GET. І цей файл не вдалось оновити, оскільки він коректно працював в іншій частині великої системи управління вмістом. Тим не менше, я хотів запустити цей код через файл включення, а параметри насправді не були в рядку URL-адреси. Просте рішення - ви можете встановити змінні GET у першому файлі, як і будь-яку іншу змінну.

Замість:

include "myfile.php?var=apple";

Це було б:

$_GET['var'] = 'apple';
include "myfile.php";

1

Згідно з документами php (див. $ _SERVER ) $ _SERVER ['PHP_SELF'] - це "ім'я файлу, який виконується на даний момент".

Оператор INCLUDE "включає та обчислює вказаний" файл, а "код, який він містить, успадковує область змінної рядка, у якому відбувається включення" (див. INCLUDE ).

Я вважаю, що $ _SERVER ['PHP_SELF'] поверне ім'я файлу 1-го файлу, навіть якщо використовується кодом у 'second.php'.

Я перевірив це за допомогою наступного коду, і він працює, як очікувалося ($ phpSelf - це ім'я першого файлу).

// In the first.php file
// get the value of $_SERVER['PHP_SELF'] for the 1st file
$phpSelf = $_SERVER['PHP_SELF'];

// include the second file
// This slurps in the contents of second.php
include_once('second.php');

// execute $phpSelf = $_SERVER['PHP_SELF']; in the secod.php file
// echo the value of $_SERVER['PHP_SELF'] of fist file

echo $phpSelf;  // This echos the name of the First.php file.

0

Ви можете виконати все у "second.php", додавши змінну за допомогою jQuery

<div id="first"></div>

<script>
$("#first").load("second.php?a=<?php echo $var?>")
</scrpt>

0

Я знаю, що це давнє запитання, але зараз натрапив на нього і побачив, що про це ніхто не згадував. так писати це.

Перший варіант, якщо його налаштувати таким чином, він також повинен працювати.

Оригінальний

Варіант перший

У першому файлі:

global $variable; 
$variable = "apple"; 
include('second.php'); 

У другому файлі:

echo $variable;

ТВИК

У першому файлі:

$variable = "apple"; 
include('second.php');

У другому файлі:

global $variable;
echo $variable;

-1

Я виявив, що параметром include повинен бути весь шлях до файлу, а не відносний шлях або частковий шлях, щоб це працювало.


1
Ні, це неправильно. Відносні шляхи добре працюють у Росії include. Ви просто повинні бути впевнені, що припускаєте правильний початок "щодо чого".
Пітер Бауерс,

-3

Зробити це:

$checksum = "my value"; 
header("Location: recordupdated.php?checksum=$checksum");

2
Незважаючи на те, що це може дати відповідь на запитання, завжди є гарною ідеєю додати до своєї відповіді якийсь текст, щоб пояснити, що ви робите. Прочитайте, як правильно написати відповідь .
Jørgen R

1
Якесь пояснення було б чудовим.
aton1004

-3

Це працювало для мене: щоб обернути вміст другого файлу у функцію, наступним чином:

firstFile.php

<?php
    include("secondFile.php");

    echoFunction("message");

secondFile.php

<?php
    function echoFunction($variable)
    {
        echo $variable;
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.