Zu enthaltende PHP-Passvariable

81

Ich versuche, eine Variable in eine Include- Datei zu übergeben. Mein Host hat die PHP-Version geändert und jetzt funktioniert jede Lösung, die ich versuche, nicht mehr.

Ich glaube, ich habe jede Option ausprobiert, die ich finden konnte. Ich bin sicher, es ist das Einfachste!

Die Variable muss aus der aufrufenden ersten Datei festgelegt und ausgewertet werden (tatsächlich $_SERVER['PHP_SELF']und muss den Pfad dieser Datei zurückgeben, nicht den enthaltenen second.php).

OPTION EINS

In der ersten Datei:

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

In der zweiten Datei:

echo $variable;

OPTION ZWEI

In der ersten Datei:

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

OPTION DREI

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


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

Nichts davon funktioniert für mich. PHP-Version ist 5.2.16.

Was vermisse ich?

Vielen Dank!

user1590646
quelle
2
Haben Sie versucht, eine Konstante zu leugnen?
Oussama Jilal
6
Sie müssen keine Variablen übergeben, um Dateien einzuschließen. Ihr Webserver lädt nur den Code Ihrer Dateien, wenn Sie sie einfügen, so als hätten Sie diesen Code aus der Include-Datei in Ihre andere Datei geschrieben.
Leon Kramer
Könnten Sie "Keine dieser Arbeiten" klarstellen? Auch Fehlermeldungen sind hilfreich ... Und AFAIK, enthaltener Code wird im selben Kontext ausgeführt und globalist daher nicht erforderlich. Ihre erste Option sollte einwandfrei funktionieren.
raina77ow
Wie andere sagten, ist include () genau so, als würde man den Code dort einfügen. Es setzt die Ausführung des Codes fort, als wäre es in derselben Datei. Sie müssen keine Möglichkeit finden, die Variable in die Include-Datei aufzunehmen. Sie können sie einfach vor include () schreiben (falls erforderlich).
AdrianTNT

Antworten:

47

Sie können die Funktion extract () verwenden.
Drupal verwendet sie in der Funktion theme ().

Hier ist es eine Renderfunktion mit einem $variablesArgument.

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>
thi3rry
quelle
Sie können diese Methode auch verwenden, indem Sie der Extraktionsfunktion das EXTR_REFS- Flag hinzufügen (siehe php.net/manual/en/function.extract.php ), damit beim Übergeben einer Variablen mit Referenz array( 'title' => &$title )der $ title in der enthaltenen Datei geändert werden kann .
Mauro Mascia
Ich glaube nicht, dass dies in späteren Versionen von PHP funktioniert, sagen wir 7.3
Robert Moskal
45

Option 3 ist nicht möglich - Sie erhalten die gerenderte Ausgabe der .php-Datei genau so, als würden Sie diese URL in Ihrem Browser drücken. Wenn Sie stattdessen rohen PHP-Code erhalten (wie Sie möchten), wird der gesamte Quellcode Ihrer Site angezeigt, was im Allgemeinen keine gute Sache ist.

Option 2 macht nicht viel Sinn - Sie würden die Variable in einer Funktion verstecken und dem Variablenbereich von PHP unterliegen. Sie müssen auch $var = passvariable()irgendwo sein, um diese ' Innen' -Variable nach' Außen 'zu bringen, und Sie sind wieder auf dem ersten Platz.

Option 1 ist am praktischsten. include()schlürft im Grunde genommen in der angegebenen Datei und führt sie genau dort aus, als ob der Code in der Datei buchstäblich Teil der übergeordneten Seite wäre. Es sieht aus wie eine globale Variable, die die meisten Leute hier missbilligen, aber nach der Parsing-Semantik von PHP sind diese beiden identisch:

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

und

$x = 'foo';
// contents of bar.php pasted here
Marc B.
quelle
11

In Anbetracht der Tatsache, dass eine Include-Anweisung in PHP auf der grundlegendsten Ebene den Code aus einer Datei entnimmt und dort einfügt, wo Sie ihn aufgerufen haben, und dass das Handbuch zu Include Folgendes enthält:

Wenn eine Datei enthalten ist, erbt der darin enthaltene Code den variablen Bereich der Zeile, in der das Einschließen erfolgt. Alle Variablen, die in dieser Zeile in der aufrufenden Datei verfügbar sind, sind ab diesem Zeitpunkt in der aufgerufenen Datei verfügbar.

Diese Dinge lassen mich denken, dass es insgesamt ein anderes Problem gibt. Auch Option 3 wird niemals funktionieren, da Sie nicht umleiten, sondern second.phpnur einschließen, und Option 2 ist nur eine seltsame Lösung. Das grundlegendste Beispiel für die Include-Anweisung in PHP ist:

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

?>

Wenn man bedenkt, dass Option Nummer eins diesem Beispiel am nächsten kommt (obwohl es komplizierter ist als es sein sollte) und es nicht funktioniert, denke ich, dass Sie einen Fehler in der include-Anweisung gemacht haben (der falsche Pfad relativ zur Wurzel oder ähnlichem) Problem).

Florin Stingaciu
quelle
Vielleicht habe ich die Reihenfolge der Dinge verwirrt? Die Struktur ist in der Tat: main.php $ variable = $ _SERVER ['PHP_SELF']; include = ' side.com/footer.php ; footer.php: echo $ variable; Die gesamte enthaltene Datei enthält nicht die Variable, sondern nur etwas. In allen Optionen, die ich ausprobiert habe, ist die Ausgabe entweder leer oder enthält $ _SERVER ['PHP_SELF'] der Datei footer.php und nicht der Datei main.php. Ist das anders?
user1590646
5

In Bezug auf die Frage des OP, insbesondere "Die Variable muss aus der aufrufenden ersten Datei festgelegt und ausgewertet werden (es ist tatsächlich '$ _SERVER [' PHP_SELF ']'" und muss den Pfad dieser Datei zurückgeben, nicht die eingeschlossene zweite. php). "

Hier erfahren Sie, welche Datei die Datei enthält. Platzieren Sie dies in der enthaltenen Datei.

$includer = debug_backtrace();
echo $includer[0]['file'];
Jeremy1026
quelle
Basierend auf den Kommentaren des OP in seiner Frage "Die Variable muss aus der aufrufenden ersten Datei festgelegt und ausgewertet werden (es ist tatsächlich '$ _SERVER [' PHP_SELF ']' 'und muss den Pfad dieser Datei zurückgeben, nicht die eingeschlossene zweite." php). " Er muss herausfinden, wie der Pfad der Datei lautet, in der second.php enthalten ist.
Jeremy1026
Notiert. (Aus Ihrer Antwort geht nicht hervor, bitte klären Sie es ["da OP den ursprünglichen Dateinamen bla bla bla erhalten möchte"]).
Madaras Geist
5

Ich habe hier das gleiche Problem, Sie können das Array $ GLOBALS verwenden.

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

Es sollte auch so laufen:

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

....

echo $GLOBALS["myvar"];

Einen schönen Tag noch.

Daniel
quelle
4

OPTION 1 hat für mich in PHP 7 funktioniert, und sicher auch in PHP 5. Und die globale Bereichsdeklaration ist für die enthaltene Datei für den Variablenzugriff nicht erforderlich. Die enthaltenen oder "erforderlichen" Dateien sind Teil des Skripts. Stellen Sie nur sicher, dass Sie das "Einschließen" NACH der Variablendeklaration vornehmen. Möglicherweise haben Sie eine Fehlkonfiguration mit Variablen im globalen Bereich in Ihrer PHP.ini?

Versuchen Sie es in der ersten Datei:

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

mysecondfile.php

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

Es sollte funktionieren ... wenn es nicht nur versucht, PHP neu zu installieren.

Drohne
quelle
3

Ich bin auf dieses Problem gestoßen, bei dem ich eine Datei hatte, die Variablen basierend auf den GET-Parametern festlegt. Und diese Datei konnte nicht aktualisiert werden, da sie auf einem anderen Teil eines großen Content-Management-Systems ordnungsgemäß funktionierte. Ich wollte diesen Code jedoch über eine Include-Datei ausführen, ohne dass sich die Parameter tatsächlich in der URL-Zeichenfolge befinden. Die einfache Lösung besteht darin, dass Sie die GET-Variablen in der ersten Datei wie jede andere Variable festlegen können.

Anstatt:

include "myfile.php?var=apple";

Es wäre:

$_GET['var'] = 'apple';
include "myfile.php";
Brian Kosnoff
quelle
1

Laut PHP-Dokumenten (siehe $ _SERVER ) ist $ _SERVER ['PHP_SELF'] der "Dateiname des aktuell ausgeführten Skripts".

Die INCLUDE-Anweisung "enthält und wertet die angegebene" Datei aus und "der darin enthaltene Code erbt den variablen Bereich der Zeile, in der das Include auftritt" (siehe INCLUDE ).

Ich glaube, $ _SERVER ['PHP_SELF'] gibt den Dateinamen der 1. Datei zurück, selbst wenn er vom Code in der 'second.php' verwendet wird.

Ich habe dies mit dem folgenden Code getestet und es funktioniert wie erwartet ($ phpSelf ist der Name der ersten Datei).

// 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.
Jim
quelle
0

Sie können alles in "second.php" ausführen und mit jQuery eine Variable hinzufügen

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

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

Ich habe festgestellt, dass der include-Parameter der gesamte Dateipfad sein muss, kein relativer Pfad oder Teilpfad, damit dies funktioniert.

Leonardo Borsten
quelle
1
Nein, das ist falsch. Relative Pfade funktionieren in include's einwandfrei. Sie müssen nur sicher sein, dass Sie einen korrekten "relativ zu was" -Anfang annehmen.
Peter Bowers
-2

Das hat bei mir funktioniert: Um den Inhalt der zweiten Datei wie folgt in eine Funktion zu verpacken:

firstFile.php

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

    echoFunction("message");

secondFile.php

<?php
    function echoFunction($variable)
    {
        echo $variable;
    }
Nicolas
quelle
-3

Mach das:

$checksum = "my value"; 
header("Location: recordupdated.php?checksum=$checksum");
Bro Ben
quelle
Während dies die Frage beantworten kann, ist es immer eine gute Idee, einen Text in Ihre Antwort einzufügen, um zu erklären, was Sie tun. Lesen Sie, wie Sie eine gute Antwort schreiben .
Jørgen R
Eine Erklärung wäre großartig.
aton1004