web-dev-qa-db-fra.com

Comment passer des arguments à un fichier inclus?

J'essaye de faire le tout <head> section son propre fichier include. Un inconvénient est que le titre et la description et le mot-clé seront les mêmes; Je ne peux pas comprendre comment passer des arguments au fichier include.

Voici donc le code:

index.php

<?php include("header.php?header=aaaaaaaaaaaaaaaaaaaaa"); ?>

<body>
.....
..
.

header.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<link rel="shortcut icon" href="favicon.ico">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="Keywords" content=" <?php $_GET["header"]?> " >
<meta name="Description" content=" <?php $_GET["header"]?> " >
<title> <?php $_GET["header"]?> </title>
<link rel="stylesheet" type="text/css" href="reset.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
</head>

Évidemment, cela ne fonctionne pas; comment passer des arguments à un fichier inclus?

38
menardmam

index.php:

<?php
$my_header = 'aaaaaaaaaaaaaaaaaaaa';
include 'header.php';
?>

et header.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="shortcut icon" href="favicon.ico" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="Keywords" content=" <?php echo $my_header ?> " />
<meta name="Description" content=" <?php echo $my_header ?> " />
<title> <?php echo $my_header ?> </title>
<link rel="stylesheet" type="text/css" href="reset.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
</head>

Ce n'est pas une solution idéale, mais je comprends que ce sont vos premiers pas en php.

PS. Votre Doctype ne correspond pas au code. J'ai ajusté votre en-tête html pour qu'il soit XHTML.

46
Michal M

Include a la portée de la ligne à partir de laquelle il est appelé.

Si vous ne voulez pas créer de nouvelles variables globales, vous pouvez encapsuler include() avec une fonction:

function includeHeader($title) {
    include("inc/header.php");
}

$title Sera défini dans le code inclus chaque fois que vous appelez includeHeader avec une valeur, par exemple includeHeader('My Fancy Title').

Si vous souhaitez transmettre plusieurs variables, vous pouvez toujours transmettre un tableau au lieu d'une chaîne.

Créons une fonction générique:

function includeFile($file, $variables) {
    include($file);
}

Voila!

Utiliser extraire le rend encore plus net:

function includeFileWithVariables($fileName, $variables) {
   extract($variables);
   include($fileName);
}

Vous pouvez maintenant faire:

includeFileWithVariables("header.php", array(
    'keywords'=> "Potato, Tomato, Toothpaste",
    'title'=> "Hello World"
));

Sachant que cela entraînera la définition des variables $keywords Et $title Dans le cadre du code inclus.

94
Rolf

Vous ne pouvez pas passer d'arguments à include, mais il a accès à toutes les variables que vous avez déjà définies. Depuis la documentation include :

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

Donc:

index.php

<?php
$header = 'aaaaaaaaaaaaaaaaaaaaa';
include("header.php");
?>

header.php

<title> <?php echo $header; ?> </title>
12
Michael Mrozek

Eh bien marc, lorsque vous utilisez include, vous pouvez simplement configurer une variable à utiliser:

<?php
  $var = "Testing";
  include("header.php");
?>

Dans votre fichier d'en-tête:

<?php
  echo $var;
?>

Autorisez vos variables précédemment définies à être utilisées dans toutes les inclusions dont vous disposez.

3
Richard Key

définir une variable comme pseudo-argument/solution de contournement avant une include() - comme recommandé par beaucoup - est une mauvaise idée. il introduit une variable dans la portée globale. définissez une fonction dans le fichier inclus à la place pour attraper les arguments que vous voulez passer.

2
bcosca

vous en pensez plus

<?php 
$header = "aaaaaaaaaaaaaaaaa";
include("header.php"); 
?>

::ÉDITER::

J'ai décidé d'ajouter de la valeur

Le fichier inclus gagnera la portée de l'endroit où vous l'avez inclus. Donc, si vous incluez un fichier à l'intérieur d'une fonction:

<?php
$get_me = "yes";
function haha()
{
include("file.php");
}
haha();

// And file.php looks like

echo $get_me; // notice + blank

?>

De plus, vous incluez le même fichier plus d'une fois pour un effet optimal.

<?php

$output = "this";
include("cool_box.php");

$output = "will";
include("cool_box.php");

$output = "work";
include("cool_box.php");

?>

Et même l'utiliser pour charger des modèles qui font partie d'une méthode dans une classe. Vous pouvez donc faire quelque chose comme:

<?php

class template
{

    private $name;

    function __construct($name)
    {
        $this->name = preg_replace("/[^a-zA-Z0-9]/", "", $name);
    }

    function output(array $vars)
    {
        include($this->name.".php"); // Where $vars is an expected array of possible data
    }

}

$head = new template("header");
$body = new template("body");
$head->output();
$head->output(array("content" => "this is a cool page"));

?>
2
DampeS8N

C'est une bonne approche. Je le ferais cependant un peu à l'envers. Définissez une mise en page, un wrapper pour votre page Web et incluez-y votre fichier de contenu:

layout.phtml

<html>
    <head>
      ... your headers go here
    </head>
    <body>
      <? include $content ?>
    </body>
</html>

Votre fichier de modèle de contenu peut ressembler à ceci, par exemple.

content.phtml

<h1>hello world</h1>

<p>My name is <?= $name ?></p>

Ensuite, vous auriez votre script principal (index) qui gérera la logique, se connectera à la base de données, etc.

index.php

$content = 'content.phtml';
$name = 'Marc'; //Can be pulled from database

include 'layout.phtml';

De cette façon, vous pouvez bien séparer la logique métier et la présentation. Et cela peut vous aider à couper le code répétitif pour des parties de page comme le logo ou la navigation qui sont répétées sur l'ensemble du site.

1
Josef Sábl

Si vous incluez un fichier, c'est comme insérer ce code dans le fichier parent. Vous pouvez simplement faire ceci:

<?php
$parameter = "Hello World";
include("header.php");
?>

puis dans le header.php

<?php
$parameter = isset($parameter) ? $parameter : "Default Text";
// Use accordingly
?>

J'ai utilisé la méthode isset() pour vérifier qu'elle a déjà une valeur et qu'elle est instanciée.

0
Aaron Hathaway

J'ai remarqué que personne n'a suggéré d'utiliser un moteur de modèle . Je suis venu chercher ici parce que pour le projet avec lequel je travaille, un moteur de modèle n'est pas possible et cela pourrait être votre situation aussi, mais j'ai pensé qu'il valait la peine de le mentionner: Twig (mon préféré moteur) et Smarty les deux permettent de passer des variables spécifiques aux inclusions.

I hautement recommande l'utilisation d'un moteur de modèle chaque fois que possible, car il simplifie votre code frontal, ajoute une couche d'abstraction entre votre frontal et votre backend, et les deux Twig et Smarty nettoient automatiquement les variables que vous leur transmettez, ce qui permet d'atténuer les attaques XSS.

Exemple de brindille

header.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<link rel="shortcut icon" href="favicon.ico">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="Keywords" content="{{ header }}" >
<meta name="Description" content="{{ header }}" >
<title> {{ header }} </title>
<link rel="stylesheet" type="text/css" href="reset.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
</head>

index.html

{% include 'header.html' with { 'header' : '<script>alert("this shouldnt work")</script>'} only %}
Body Text
{% include 'footer.html' %}

Exemple Smarty

header.tpl

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<link rel="shortcut icon" href="favicon.ico">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="Keywords" content="{$header}" >
<meta name="Description" content="{$header}" >
<title> {$header} </title>
<link rel="stylesheet" type="text/css" href="reset.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
</head>

index.tpl

{include 'header.tpl' header='<script>alert("this shouldnt work")</script>'}
Body Text
{include 'footer.tpl'}
0
DanielM