Soutenez-nous

FAQ PHPConsultez toutes les FAQ

Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 29 juillet 2013 

 
OuvrirSommaireConcepts fréquents

Il existe ces structures du langage : require, include, require_once, include_once.

Exemples :

 
Sélectionnez
require("common.php");
require($file);
require "script.php";
require 'config.php';

include et require : Insertion du code des fichiers à l'endroit de la commande. Si le fichier n'existe pas, include produit une erreur E_WARNING et continue d'exécuter le reste du code, alors que require produit une erreur E_ERROR et l'exécution du code s'arrête.

include_once et require_once : Ces commandes permettent d'inclure le fichier de la même façon que les commandes include et require mais le fichier sera inclus qu'un seule fois même si la commande est lancée plusieurs fois dans la page. Exemple d'utilisation :

 
Sélectionnez

require_once 'fichier.php'; // "fichier.php" est inclus
// ...
require_once 'fichier.php'; // cette commande est ignorée car "fichier.php" est déjà inclus
// ...
include_once 'fichier.php'; // "include_once" et "require_once" partagent
                            //  la même liste de fichiers à inclure une seule fois
                            //  donc cette commande est aussi ignorée 

Ces fonctions prennent pour argument le nom d'un script PHP (et éventuellement son chemin complet). Il n'est pas possible de passer des arguments à ces fichiers comme on peut le faire dans l'URL. Les fichiers ainsi inclus auront de toute façon accès à l'espace de mémoire du script qui procède à l'inclusion.

Exemple : script1.php

 
Sélectionnez
<?php
echo "Bonjour<br>";
$user = "toto";
require("script2.php");
echo "Au revoir...";
?>

Exemple : script2.php

 
Sélectionnez
<?php
echo "Vous êtes : $user <br>";
?>

Cet exemple affiche à l'écran :

 
Sélectionnez
Bonjour
Vous êtes toto
Au revoir...

Dans le cas où de nombreux scripts d'un site doivent inclure le ou les mêmes documents, et que ces premiers ne sont pas situés au même niveau de l'arborescence du système de fichiers, il est alors fortement conseillé de fournir le chemin absolu du fichier à inclure. Ceci permet d'éviter des erreurs lors d'inclusions croisées. Ce chemin absolu peut être défini par $_SERVER['DOCUMENT_ROOT'] qui contient la racine du site.

Exemple :

 
Sélectionnez
$file = 'common/config.php';
require($_SERVER['DOCUMENT_ROOT'].$file);

Toutes ces fonctions conviennent à l'inclusion de code PHP. C'est-à-dire que les fichiers à inclure doivent contenir du code entre <?php et ?>. Pour inclure un fichier qui ne contient pas de code PHP, utiliser plutôt readfile(), file() ou fopen().

Mis à jour le 3 août 2008  par Cyberzoide

PHP peut agir côté client sur le comportement d'un ActiveX via les balises HTML de contrôle de cet ActiveX, en lui passant des variables en argument. Ces variables peuvent résulter d'un traitement, d'une requête utilisateur, ou d'une sélection dans une base de données.

 
Sélectionnez
<?php $val1 = "toto"; ?>
<object classid="....">
    <param name="param1" value="<?php echo $val1; ?>">
</object>
Mis à jour le 3 août 2008  par Cyberzoide

Une redirection peut se faire de diverses manières :

  1. En PHP avec la fonction header() : c'est la meilleure solution
  2. En HTML avec une balise meta
  3. En Javascript avec l'objet window.location et sa méthode replace()
  4. À l'aide d'un .htaccess, plus efficace qu'en PHP mais moins explicite et il faut avoir Apache
  5. Avec l'URL Rewriting en utilisant le code HTTP

En PHP
La fonction header() envoie au client l'ordre de changer de page. Aucun contenu n'est envoyé (du moins, aucun contenu n'est nécessaire). Sachant que les headers (en-têtes) HTTP sont envoyés quoi qu'il en soit, et systématiquement avant le corps de la ressource demandée (qui est habituellement une page Web), cette solution est très logique. Attention, il est préférable d'accompagner ce header d'un autre header afin d'indiquer au client (qui est généralement le navigateur Web) la raison de la redirection : c'est fondamental si l'on prend garde au référencement des pages de son site.

Exemple :

 
Sélectionnez
header('HTTP/1.1 404 Not Found');
header('Location: index.php');
exit;

Notez l'utilisation du mot clef exit afin de s'assurer que rien d'autre n'est envoyé au navigateur par la suite.

En HTML
Cette solution est à utiliser principalement pour les tâches répétitives, très gourmandes en ressources serveur qui pourraient causer l'exécution du script à dépasser le temps maximum autorisé (habituellement fixé à 30 secondes). Par exemple, une sauvegarde ou une mise à jour de la base de données, si nous n'avons pas de meilleure solution, peuvent être automatisées à l'aide de cette solution.

 
Sélectionnez
<meta http-equiv="refresh" content="nb_secondes; url=destination.php" />

Attention cependant : le W3C déconseille cette méthode. Il faut donc l'utiliser avec précaution. Le problème ici n'est pas tellement que le navigateur puisse ne pas gérer cette technique ou qu'il puisse la désactiver. C'est plutôt que cet ordre est envoyé dans le contenu de la page Web, alors que tout ce que nous souhaitons est indiquer au navigateur qu'il doit aller voir ailleurs : c'est contradictoire. Nous ne devrions pas envoyer de contenu pour indiquer au navigateur qu'il ne trouvera rien ici...

En Javascript
Cette méthode est tout autant déconseillée que la précédente. Voici comment elle s'utilise :

 
Sélectionnez
<script type="text/javascript">
window.location.replace('destination.php');
</script>

Ou :

 
Sélectionnez
<script type="text/javascript">
window.location.href = 'destination.php';
</script>

La première solution remplace l'élément actuel de l'historique du navigateur. Le problème ici n'est pas tellement que le navigateur puisse ne pas gérer Javascript ou qu'il puisse le désactiver. C'est plutôt que cet ordre est envoyé dans le contenu de la page Web, alors que tout ce que nous souhaitons est indiquer au navigateur qu'il doit aller voir ailleurs : c'est contradictoire. Nous ne devrions pas envoyer de contenu pour indiquer au navigateur qu'il ne trouvera rien ici...

Avec le .htaccess
Pour obtenir la méthode détaillée, reportez-vous au cours : Gérer les changements d'URL

Avec l'URL Rewriting
Pour obtenir la méthode détaillée, reportez-vous au cours : Tutoriel d'URL Rewriting (réécriture de liens)

Mis à jour le 3 août 2008  par Cyberzoide, Guillaume Rossolini

Lien : Recommandation du W3C
Lien : Comment inclure un script à l'intérieur d'un autre ?
Lien : Formation au protocole HTTP, par Mathieu Lemoine
Lien : Tutoriel : Comment Faire évoluer son URL Rewriting, par Guillaume Rossolini
Lien : Tutoriel .htaccess : Gérer les changements d'URL, par Cédric Chatelain
Lien : Tutoriel de réécriture de liens (URL Rewriting), par Guillaume Rossolini

Les sessions permettent tout du long de la visite d'un internaute sur le site, de conserver des informations de façon transparente.

Cela est sans ralentissement de performances car le client ne stocke sous forme de cookie que l'ID de session (généré aléatoirement), le serveur stockant sur disque le contenu des variables dans le répertoire défini par session.save_path.

Les sessions sont activées manuellement par la commande session_start() ou automatiquement si session.auto_start est à 1 ou encore implicitement par la commande session_register()(obsolète).

Le serveur attribue à chaque visiteur un identifiant unique qui est soit envoyé au client sous forme de cookie (par défaut), soit passé de façon systématique dans l'URL.

Mis à jour le 3 août 2008  par Cyberzoide
  • En stockant leurs valeurs dans une base de données.
  • En les enregistrant dans un fichier sur le serveur (mais oblige à donner des droits d'écriture aux visiteurs).
  • Utiliser des cookies (malheureusement certains navigateurs ne les acceptent pas).
  • En les envoyant dans l'URL (mais seront visibles aux visiteurs dans la barre d'adresse et cela leur impose de toujours utiliser les liens hypertextes).
  • En les passant par un formulaire (mais impose aux visiteurs de cliquer sur un bouton d'envoi).
  • En utilisant une session.
Mis à jour le 3 août 2008  par Cyberzoide

S'il est une fonctionnalité de HTML qui soit autant ultra répendue et utile que contestée par les puristes, c'est bien le système de frames (dits aussi cadres en français).

Il est vrai qu'avoir sur son écran plusieurs documents HTML sur une même page permet d'offir au visiteur un système de navigation très performant en échange d'une maintenance relativement simple et rapide.

Cependant, tous les moteurs de recherche ne sont pas capables d'indexer les sites recourant aux frames. De plus, les systèmes utilisés par les mal-voyants ont eux aussi beaucoup de mal avec les frames.

Les frames permettent donc de conserver un sommaire, un pied de page et une bannière d'en-tête en permanence. Seul le contenu central de la page change.

Ceci peut être aisément réalisé en PHP via des inclusions de fichiers, en lieu et place des frames controversées.

Par exemple, pour simuler une rubrique comportant un sommaire à gauche et un texte variable à droite : avec les frames :

 
Sélectionnez
<html>
    <frameset>
        <frameset COLS="30%,70%">
            <frame name="sommaire" src="sommaire.html">
            <frame name="article" src="article1.html">
        </frameset>
    </frameset>
</html>

avec PHP :

 
Sélectionnez
<html>
<body>
<table width="100%" height="100%">
    <tr>
        <td> <?php require('sommaire.php'); ?> </td>
        <td> <?php require($article_id.'.php'); ?> </td>
    </tr>
</table>
</body>
</html>

Il suffit donc de créer un tableau HTML et d'en remplir les cellules avec le contenu d'autres scripts PHP.

Ainsi, on peut aussi rajouter un en-tête, un pied de page et beaucoup d'autres éléments...

 
Sélectionnez
<html>
<body>
<table width="100%" height="100%">
    <tr>
        <td colspan="2"> <?php require('entete.php'); ?> </td>
    </tr>
    <tr>
        <td> <?php require('sommaire.php'); ?> </td>
        <td> <?php require($article_id.'.php'); ?> </td>
    </tr>
    <tr>
        <td colspan="2"> <?php require('pied.php'); ?> </td>
    </tr>
</table>
</body>
</html>
Mis à jour le 3 août 2008  par Cyberzoide

Le rafraichissement d'une page résulte d'un ordre provenant du client, or PHP n'agit que sur le serveur. Seul le serveur en lui-même et non les scripts PHP qu'il héberge peuvent l'empêcher.
Cette opération est donc impossible en PHP, ni en JavaScript, et encore moins en HTML.

Par contre il est possible d'enregistrer dans la session, ou dans une base de données, que le traitement a déjà été réalisé. Ainsi, quand la page est à nouveau rafraichie, il est possible de ne plus faire le traitement mais d'afficher un message d'erreur par exemple.

Mis à jour le 3 août 2008  par Cyberzoide

Il y a quatre grandes manières d'y parvenir.

Créer un fichier PHP pour chaque langue contenant la traduction d'une variable dans la langue souhaitée, du coup tu n'utilises que des variables dans ton code. Il est, par contre, déconseillé de tout mettre dans le même fichier car lorsque le site devient un peu conséquent (avec beaucoup de texte), l'ouverture, la lecture et la fermeture d'un fichier de 50Mo est largement plus longue que celle d'un fichier de 50Ko).

fr.php
Sélectionnez
<?php $welcome='Bonjour et bienvenue sur developpez.com'; ?>
en.php
Sélectionnez
<?php $welcome='Welcome to developpez.com'; ?>
index.php
Sélectionnez
<?php
include(fr.php); // inclure "fr.php" ou "en.php"
echo $welcome;
?>

La seconde solution est de créer une base de données contenant les traductions selon la langue. Cette solution est assez lourde car elle demande beaucoup d'accès à la BD et puis ça oblige à faire une insertion dans la BD à chaque fois que l'on souhaite rajouter une nouvelle phrase.

La troisième est l'extension gettext qui prévoit la traduction au moment de l'affichage, par remplacement de texte. C'est une méthode rapide et qui utilise des fichiers de langue séparés, mais qui oblige le développeur à tenir à jour la langue par défaut à plusieurs endroits.

Enfin, la dernière solution (peut-être la meilleure mais aussi la plus délicate) et de créer un fichier XML contenant la structure du site ainsi que le contenu textuel pour chaque langue. De plus, il faut créer un fichier XSL qui met les fichiers XML en page, exactement de la même manière. On se retrouve ainsi avec un fichier XML pour chaque langue et un seul fichier XSL qui met le tout en page.

Mis à jour le 3 août 2008  par trotters213, Guillaume Rossolini

Lien : Tutoriel : Utilisation de la base de données pour un site multilingueSite multilignue en PHP

De notre requête habituelle de sélection (SELECT), on ajoute deux ingrédients pour obtenir une pagination :
  • Une clause LIMIT P, N qui ne permet de récupérer que N résultats à partir de l'enregistrement situé en position P (le premier ayant pour indice 0). Il nous sera par conséquent indispensable de faire transiter cette référence lorsque l'utilisateur changera de page. C'est ce qui est couramment réalisé en propageant le numéro de la page par la méthode GET (pour retrouver la position de départ, il suffit de multiplier ce numéro par le nombre de résultats à afficher par page) ;
  • L'option SQL_CALC_FOUND_ROWS qui indiquera à MySQL de procéder au calcul du nombre total d'enregistrements, correspondants aux critères (clause WHERE, s'il y a), sans tenir compte de la clause LIMIT. Vous pourrez ensuite récupérer cette donnée, déjà calculée qui vous attend, par une nouvelle requête, en faisant usage de la fonction FOUND_ROWS().
Voici donc une implémentation basique prête à l'emploi :
Sélectionnez
// Paramètres de connexion
define('MYSQL_HOTE', 'localhost');
define('MYSQL_UTIL', 'julp');
define('MYSQL_MDP', 'motdepasse');
define('MYSQL_BDD', 'developpez');

// Paramètres de la pagination
// Nombre d'éléments à afficher sur une page
define('NB_PAR_PAGE', 10);
// Le modèle de la requête : ne modifiez que les champs à sélectionner et le nom
// de la table, gardez impérativement la clause LIMIT et la fonction SQL_CALC_FOUND_ROWS
define('MODELE_REQUETE', 'SELECT SQL_CALC_FOUND_ROWS * FROM ma_table LIMIT %d,%d');

// Connexion à la base
mysql_connect(MYSQL_HOTE, MYSQL_UTIL, MYSQL_MDP) or  die(mysql_error());
mysql_select_db(MYSQL_BDD) or  die(mysql_error());

// Variables liées à la pagination
$page = isset($_GET['page']) ? max(intval($_GET['page']), 1) : 1;
$debut = NB_PAR_PAGE * ($page - 1);


$res_r = mysql_query(sprintf(MODELE_REQUETE, $debut, NB_PAR_PAGE)) or die(mysql_error());
$res_n = mysql_query('SELECT FOUND_ROWS()') or die(mysql_error());
$NumRows = mysql_result($res_n, 0, 0);

$derniere_page = ceil($NumRows / NB_PAR_PAGE);

// Parcours/affichage des résultats
echo '<table>';
while($row = mysql_fetch_assoc($res_r)) {
    echo '<tr>';
    foreach ($row as $v) {
        echo '<td>' . $v . '</td>';
    }
    echo '</tr>';
}
echo '</table>';

// L'affichage de la barre de navigation
if ($NumRows > NB_PAR_PAGE) {
    echo '<ul class="pagination">';
    if ($page > 1) {
        echo '<li><a href="' . basename(__FILE__) . '?page=' . ($page - 1) . '">Page précédente</a></li>';
    }
    for ($i = 1; $i <= $derniere_page; $i++) {
        if ($i == $page) {
            echo '<li class="page-courante">' . $i . '</li>';
        } else {
            echo '<li><a href="' . basename(__FILE__) . '?page=' . $i . '">' . $i . '</a></li>';
        }
    }
    if ($page < $derniere_page) {
        echo '<li><a href="' . basename(__FILE__) . '?page=' . ($page + 1) . '">Page suivante</a></li>';
    }
    echo '</ul>';
}

mysql_close();
Et le code CSS pour mettre un minimum en forme la barre de navigation :
Sélectionnez
ul.pagination {
    text-align: center;
}

ul.pagination li {
    display: inline;
    margin: 10px 5px;
    padding: 5px;
    text-align: center;
}

ul.pagination li.page-courante {
    font-weight: bold;
}
Mis à jour le 3 août 2008  par Julp

Lien : Mise en application détaillée autour d'un livre d'or

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Developpez.com Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.