Zmienna przekazywania PHP do dołączenia


84

Próbuję przekazać zmienną do pliku dołączanego . Mój host zmienił wersję PHP i teraz każde rozwiązanie, które próbuję, nie działa.

Myślę, że wypróbowałem każdą opcję, jaką mogłem znaleźć. Jestem pewien, że to najprostsza rzecz!

Zmienna musi zostać ustawiona i oceniona z wywołującego pierwszego pliku (w rzeczywistości jest $_SERVER['PHP_SELF']i musi zwrócić ścieżkę do tego pliku, a nie dołączonego second.php).

OPCJA PIERWSZA

W pierwszym pliku:

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

W drugim pliku:

echo $variable;

OPCJA DRUGA

W pierwszym pliku:

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

OPCJA TRZECIA

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


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

Żadne z nich nie działa dla mnie. Wersja PHP to 5.2.16.

czego mi brakuje?

Dzięki!


2
Czy próbowałeś wyznaczyć stałą?
Oussama Jilal

7
nie musisz przekazywać zmiennych, aby dołączyć pliki. Twój serwer sieciowy po prostu załaduje kod twoich plików, gdy je dołączysz, tak jakbyś napisał ten kod z pliku dołączanego do innego pliku.
Leon Kramer

Czy mógłbyś wyjaśnić „Żadna z tych prac”? Pomocne będą też komunikaty o błędach ... AFAIK, dołączony kod jest wykonywany w tym samym kontekście, więc globalnie jest konieczny; Twoja pierwsza opcja powinna działać dobrze.
raina77ow

Jak powiedzieli inni, funkcja include () przypomina wklejenie tam kodu, kontynuuje wykonywanie kodu, tak jak w tym samym pliku. Nie musisz szukać sposobu na umieszczenie zmiennej w pliku dołączanym, możesz po prostu napisać ją przed funkcją include () (w razie potrzeby).
adrianTNT

Odpowiedzi:


48

Możesz użyć funkcji extract (), której
Drupal używa w swojej funkcji theme ().

Tutaj jest to funkcja renderująca z $variablesargumentem.

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>

Możesz również użyć tej metody dodając flagę EXTR_REFS do funkcji wyodrębniania (patrz php.net/manual/en/function.extract.php ), aby po przekazaniu zmiennej z referencją: array( 'title' => &$title )tytuł $ można zmienić wewnątrz dołączonego pliku .
Mauro Mascia

Nie sądzę, żeby to działało w późniejszych wersjach PHP, powiedzmy 7.3
Robert Moskal

46

Opcja 3 jest niemożliwa - otrzymasz renderowane wyjście pliku .php, dokładnie tak, jak gdybyś trafił na ten adres URL w przeglądarce. Jeśli zamiast tego dostaniesz surowy kod PHP (jak chcesz), to cały kod źródłowy Twojej witryny zostanie ujawniony, co generalnie nie jest dobrą rzeczą.

Opcja 2 nie ma większego sensu - ukrywałbyś zmienną w funkcji i podlegałbyś zakresowi zmiennych PHP. Będziesz także musiał mieć $var = passvariable()gdzieś, aby przenieść zmienną „wewnętrzną” do „zewnętrznej” i wrócisz do punktu wyjścia.

opcja 1 jest najbardziej praktyczna. include()w zasadzie slurp w określonym pliku i wykona go właśnie tam, tak jakby kod w pliku był dosłownie częścią strony nadrzędnej. Wygląda jak zmienna globalna, na którą większość ludzi patrzy z dezaprobatą, ale dzięki semantyce analizy PHP te dwie są identyczne:

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

i

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

11

Biorąc pod uwagę, że instrukcja include w php na najbardziej podstawowym poziomie pobiera kod z pliku i wkleja go w miejsce, w którym go wywołałeś, oraz fakt, że instrukcja include stwierdza, co następuje:

Gdy plik jest dołączony, kod, który zawiera, dziedziczy zakres zmiennej wiersza, w którym występuje dołączenie. Wszelkie zmienne dostępne w tej linii w pliku wywołującym będą dostępne w wywołanym pliku, od tego momentu.

Te rzeczy sprawiają, że myślę, że istnieje w sumie inny problem. Również opcja nr 3 nigdy nie zadziała, ponieważ nie przekierowujesz do niej second.php, po prostu ją dołączasz, a opcja nr 2 jest po prostu dziwnym obejściem. Najbardziej podstawowym przykładem instrukcji include w php jest:

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

?>

Biorąc pod uwagę, że opcja numer jeden jest najbliższa temu przykładowi (chociaż bardziej skomplikowana niż powinna) i nie działa, to sprawia, że ​​myślę, że popełniłeś błąd w instrukcji include (niewłaściwa ścieżka względem katalogu głównego lub podobna kwestia).


Może pomyliłem kolejność rzeczy? Struktura jest w rzeczywistości: main.php $ zmienna = $ _SERVER ['PHP_SELF']; include = ' side.com/footer.php ; footer.php: echo $ zmienna; Cały dołączony plik nie zawiera zmiennej, po prostu coś z nią robi. We wszystkich wypróbowanych przeze mnie opcjach dane wyjściowe są albo puste, albo zawierają $ _SERVER ['PHP_SELF'] z footer.php, a nie main.php. Czy to jest inne?
user1590646

5

W odniesieniu do pytania OP, w szczególności „Zmienna musi być ustawiona i oceniona z wywołującego pierwszego pliku (w rzeczywistości jest to '$ _SERVER [' PHP_SELF ']' i musi zwrócić ścieżkę do tego pliku, a nie dołączoną drugą. php). ”

Dzięki temu dowiesz się, który plik zawierał plik. Umieść to w załączonym pliku.

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

Opierając się na komentarzach OP w jego pytaniu: „Zmienna musi być ustawiona i oceniona z wywołującego pierwszego pliku (w rzeczywistości jest to '$ _SERVER [' PHP_SELF ']' i musi zwrócić ścieżkę do tego pliku, a nie dołączoną drugą. php). ” Musi dowiedzieć się, jaka jest ścieżka do pliku, który włączył plik second.php.
Jeremy1026,

Odnotowany. (z Twojej odpowiedzi nie wynika jasno, wyjaśnij to ["ponieważ OP chce uzyskać oryginalną nazwę pliku bla bla bla"]).
Madara's Ghost

5

Mam tutaj ten sam problem, możesz użyć tablicy $ GLOBALS.

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

Powinien również działać w ten sposób:

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

....

echo $GLOBALS["myvar"];

Miłego dnia.


4

OPCJA 1 zadziałała dla mnie w PHP 7 i na pewno działa również w PHP 5. A deklaracja zasięgu globalnego nie jest konieczna dla dołączonego pliku w celu uzyskania dostępu do zmiennych, dołączone - lub „wymagane” - pliki są częścią skryptu, tylko upewnij się, że dokonałeś „uwzględnienia” PO deklaracji zmiennej. Może masz jakiś błąd w konfiguracji ze zmiennymi o zasięgu globalnym w swoim PHP.ini?

Spróbuj w pierwszym pliku:

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

mysecondfile.php

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

Powinno działać ... jeśli nie tylko spróbuje ponownie zainstalować PHP.


3

Napotkałem ten problem, w którym miałem plik, który ustawia zmienne na podstawie parametrów GET. Tego pliku nie można zaktualizować, ponieważ działał poprawnie w innej części dużego systemu zarządzania treścią. Chciałem jednak uruchomić ten kod za pośrednictwem pliku dołączanego bez parametrów znajdujących się w ciągu adresu URL. Prostym rozwiązaniem jest to, że możesz ustawić zmienne GET w pierwszym pliku, tak jak każdą inną zmienną.

Zamiast:

include "myfile.php?var=apple";

To byłby:

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

1

Zgodnie z dokumentacją php (zobacz $ _SERVER ) $ _SERVER ['PHP_SELF'] jest "nazwą pliku aktualnie wykonywanego skryptu".

Instrukcja INCLUDE „zawiera i ocenia określony„ plik ”, a„ kod, który zawiera, dziedziczy zakres zmiennej wiersza, w którym występuje uwzględnienie ”(zobacz INCLUDE ).

Uważam, że $ _SERVER ['PHP_SELF'] zwróci nazwę pierwszego pliku, nawet jeśli jest używany przez kod w 'second.php'.

Przetestowałem to z następującym kodem i działa zgodnie z oczekiwaniami ($ phpSelf to nazwa pierwszego pliku).

// 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

Możesz wykonać wszystko w "second.php" dodając zmienną za pomocą jQuery

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

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

0

Wiem, że to stare pytanie, ale natknąłem się na nie teraz i nie widziałem, żeby nikt o tym nie mówił. więc pisząc to.

Opcja pierwsza, jeśli zostanie tak zmodyfikowana, powinna również działać.

Oryginalny

Opcja pierwsza

W pierwszym pliku:

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

W drugim pliku:

echo $variable;

DOSTRAJAĆ

W pierwszym pliku:

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

W drugim pliku:

global $variable;
echo $variable;

-1

Zauważyłem, że parametr include musi być pełną ścieżką pliku, a nie ścieżką względną lub częściową, aby to zadziałało.


1
Nie, to nieprawda. Względne ścieżki działają dobrze w include's. Musisz tylko być pewien, że zakładasz właściwy początek „w stosunku do czego”.
Peter Bowers

-3

Zrób to:

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

2
Chociaż może to odpowiedzieć na pytanie, zawsze dobrze jest umieścić w odpowiedzi jakiś tekst, aby wyjaśnić, co robisz. Przeczytaj, jak napisać dobrą odpowiedź .
Jørgen R

1
Jakieś wyjaśnienie byłoby świetne.
aton1004

-3

To zadziałało dla mnie: aby zawinąć zawartość drugiego pliku w funkcję, w następujący sposób:

firstFile.php

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

    echoFunction("message");

secondFile.php

<?php
    function echoFunction($variable)
    {
        echo $variable;
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.