web-dev-qa-db-fra.com

PHP Pass variable à inclure

J'essaie de passer une variable dans un fichier include . Mon hôte a changé PHP version et maintenant quelle que soit la solution que j'essaie ne fonctionne pas.

Je pense avoir essayé toutes les options possibles. Je suis sûr que c'est la chose la plus simple!

La variable doit être définie et évaluée à partir du premier fichier appelant (il s’agit en fait de $_SERVER['PHP_SELF'] Et doit renvoyer le chemin de ce fichier, pas le second.php Inclus).

OPTION ONE

Dans le premier fichier:

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

Dans le deuxième fichier:

echo $variable;

DEUXIÈME OPTION

Dans le premier fichier:

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

OPTION TROIS

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


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

Aucun de ceux-ci ne fonctionne pour moi. PHP la version est 5.2.16.

Qu'est-ce que je rate?

Merci!

69
user1590646

L'option 3 est impossible - vous obtiendrez la sortie rendue du fichier .php, exactement comme si vous rencontriez cette URL dans votre navigateur. Si vous obtenez le code brut PHP à la place (comme vous le souhaitez)], TOUT le code source de votre site sera exposé, ce qui n'est généralement pas une bonne chose.

L'option 2 n'a pas beaucoup de sens - vous cacheriez la variable dans une fonction et seriez soumis à la portée de la variable PHP. Vous devez également disposer de $var = passvariable() pour obtenir cette variable "interne" en "externe", et vous revenez à la case départ.

l'option 1 est la plus pratique. include() va fondamentalement slurp dans le fichier spécifié et l'exécuter là, comme si le code dans le fichier faisait littéralement partie de la page parent. Cela ressemble à une variable globale, que la plupart des gens désapprouvent, mais d'après la sémantique de PHP, ces deux éléments sont identiques:

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

et

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

Vous pouvez utiliser la fonction extract ()
Drupal l’utilise, dans sa fonction theme ().

Ici c'est une fonction de rendu avec un $variables argument.

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>
32
thi3rry

Considérant qu'une déclaration include en php au niveau le plus élémentaire extrait le code d'un fichier et le colle à l'endroit où vous l'avez appelé, ainsi que le fait que le manuel sur include indique ce qui suit:

Lorsqu'un fichier est inclus, le code qu'il contient hérite de la portée variable de la ligne sur laquelle l'inclusion a lieu. Toutes les variables disponibles sur cette ligne dans le fichier appelant seront disponibles dans le fichier appelé à partir de ce moment.

Ces choses me font penser qu’il existe un problème différent. De plus, l'option n ° 3 ne fonctionnera jamais car vous ne redirigez pas vers second.php vous ne faites que l’inclure et l’option numéro 2 est un travail étrange. L'exemple le plus fondamental de la déclaration include en php est:

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

?>

Considérant que l’option numéro un est la plus proche de cet exemple (même si elle est plus compliquée qu’elle devrait l’être) et que cela ne fonctionne pas, cela me fait penser que vous avez fait une erreur dans la déclaration include (le mauvais chemin par rapport à la racine ou à un mot similaire). problème).

10
Florin Stingaciu

J'ai le même problème ici, vous pouvez utiliser le tableau $ GLOBALS.

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

Il devrait également être exécuté de la manière suivante:

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

....

echo $GLOBALS["myvar"];

Bonne journée.

5
Daniel

En ce qui concerne la question de l'OP, en particulier "La variable doit être définie et évaluée à partir du premier fichier appelant (il s'agit en fait de" $ _SERVER ["PHP_SELF"] "et doit renvoyer le chemin de ce fichier, pas le second inclus. php). "

Cela vous indiquera quel fichier a inclus le fichier. Placez ceci dans le fichier inclus.

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

J'ai rencontré un problème dans lequel j'avais un fichier qui définit des variables en fonction des paramètres GET. Et ce fichier n'a pas pu être mis à jour car il fonctionnait correctement sur une autre partie d'un système de gestion de contenu volumineux. Pourtant, je voulais exécuter ce code via un fichier d'inclusion sans que les paramètres soient réellement dans la chaîne d'URL. La solution simple est de définir les variables GET dans le premier fichier comme vous le feriez avec une autre variable.

Au lieu de:

include "myfile.php?var=Apple";

Ce serait:

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

OPTION 1 a fonctionné pour moi, dans PHP 7, et il est certain que cela fonctionne = PHP 5 aussi. Et la déclaration de portée globale n'est pas nécessaire pour le fichier inclus pour l'accès aux variables, les fichiers inclus - ou "obligatoires" - font partie du script, assurez-vous seulement que vous faites le "include" APRÈS la déclaration de variable. Vous avez peut-être une mauvaise configuration avec la portée globale des variables dans votre PHP.ini?

Essayez dans le premier fichier:

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

mysecondfile.php

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

Cela devrait fonctionner ... s'il ne tente pas simplement de réinstaller PHP.

0
DrOne

Selon php docs (voir $ _ SERVER ) $ _SERVER ['PHP_SELF'] est le "nom du fichier du script en cours d'exécution".

L'instruction INCLUDE "inclut et évalue le" fichier et le fichier spécifié "et le code qu'il contient hérite de la portée variable de la ligne sur laquelle l'inclusion se produit" (voir INCLUDE ).

Je pense que $ _SERVER ['PHP_SELF'] retournera le nom du fichier du 1er fichier, même s'il est utilisé par le code dans le 'second.php'.

J'ai testé cela avec le code suivant et cela fonctionne comme prévu ($ phpSelf est le nom du premier fichier).

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