Foire Aux Questions PHP

Erreurs, pages blanches, PHP pas interprété, caractères spéciaux, accents, encodage, é, �, etc.

a marqué ce sujet comme résolu.

Bonjour,

Si vous débutez dans le développement PHP, vous serez sans doute amené à vous poser des questions durant votre apprentissage. Cette Foire Aux Questions du forum Site web a été élaborée pour être à la fois un complément des tutoriels officiels (comme celui pour WAMP, qui comporte une partie troubleshooting) et pour expliquer les erreurs qui reviennent de manière récurrente sur le forum.

La gestion des erreurs en PHP

PHP

Jeux de caractères

Paramètres

Étrangetés et particularités

Astuces

MySQL avec PDO

Cette F.A.Q PHP, parue initialement sur OpenClassrooms, est le résultat de nombreux contributeurs. Un grand merci à chacun !

Contributeurs actuels : Ymox, elyppire, EtienneR

+2 -0

Comment être notifié de toutes les erreurs lors de la phase de développement ?

Il est recommandé d’afficher toutes les erreurs durant la phase de développement.

Faire s’afficher les erreurs de PHP

Globalement

Si vous utilisez une pile serveur préexistante, il y a probablement un réglage qui vous permet de modifier simplement ce paramètre. Cherchez un peu dans les options disponibles.

Par exemple pour WampServer, vous pouvez activer l’affichage des erreurs en cliquant sur l’icône dans la barre de statut > PHP > Configuration PHP puis activer "display_errors".
Pour MAMP, il n’est cependant pas possible de faire ceci facilement sans avoir une version PRO.

Si vous gérez votre propre serveur en ligne, il est possible que vous puissiez activer cela en utilisant l’interface de gestion de votre serveur (Plesk, cPanel, etc.).

Finalement, si avez accès au(x) fichier(s) php.ini, vous pouvez y rechercher et changer certaines lignes.

Il y a plusieurs fois les directives dans le fichier, notamment une fois parmi les 100 premières lignes. Celles-ci ne sont là qu’à titre indicatif, et ne doivent pas être modifiées.

Pour être sûr de modifier au bon endroit, recherchez bien les directives suivies d’une espace et d’un signe =, comme données ci-dessous.

Dans un premier temps, localisez le(s) fichier(s) php.ini à l’aide de cette entrée de la FAQ, et recherchez-y les chaînes suivantes :

  • error_reporting =
    Remplacez ce qu’il y a après le signe = — signe qui devrait être déjà présent — par E_ALL
  • display_error =
    Remplacez off par on

N’oubliez pas de redémarrer Apache pour que les modifications soient prises en compte.

Ponctuellement

Il est aussi possible de demander à ce que les erreurs ne s’affichent que pour certains scripts. Pour ce faire, insérez ces lignes au début de votre code :

<?php
ini_set( 'display_errors', 'on' );
error_reporting( E_ALL );
Activer par code l’affichage des erreurs

Pour modifier le niveau de reporting des erreurs, les constantes à utiliser sont listées ici.

Donner la parole aux APIs de connexion aux bases de données

PDO comme MySQLi sont timides de nature, donc ne parlent pas des erreurs que le moteur de bases de données rencontre. Voici comment avoir ces informations — en plus des manipulations ci-dessus si absolument aucune erreur ne s’affiche.

PDO

Passez en quatrième paramètre du constructeur un tableau comme celui-ci :

<?php
array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
Activer les messages d’erreur SQL de PDO
MySQLi

Au début de votre code, mettez cette brève instruction :

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Activer les messages d’erreur SQL de MySQLi
+0 -0

Vous avez une erreur de type Error

Les E_ERROR, alias Fatal error sont des erreurs d’exécution provoquant l’arrêt du script.

Quelques Fatal error souvent rencontrées :

Fatal error: Call to undefined function: maFonction()

Vous faites appel à une fonction qui n’existe pas, ou qui n’a peut être pas été incluse à votre script si elle se trouve sur un autre script.

Fatal error: Cannot redeclare maFonction() (previously declared in…)

Si vous avez ce genre d’erreur, c’est que vous tentez de redéclarer une fonction de votre script alors qu’elle existe déjà.
Vérifiez donc que :

  • dans le script de votre page, vous ne l’avez pas déclarée explicitement plus d’une fois. Une seule fois suffit ;)
  • la déclaration de votre fonction ne se situe pas dans une boucle. Si c’est le cas, sortez-la de cette boucle.
  • vous ne faites pas plusieurs include … d’un fichier contenant cette fonction (surtout si vous faites des inclusions "à tiroirs" ou "en cascade").
    Afin d’éviter d’inclure plusieurs fois le même fichier, utilisez la fonction include_once, qui vérifie si le fichier est déjà inclus ou non, afin d’éviter les doublons.

Fatal error: Call to a member function fetch() on boolean

La requête que vous avez effectuée n’est pas correcte et a retourné un booléen (très probablement false). Activez l’affichage des erreurs pour votre API de connexion à la BDD si vous n’arrivez pas à comprendre pourquoi.
Le principe est similaire pour les autres fonctions de récupération de jeux de résultats.

+0 -0

Vous avez une erreur de type Warning

Les E_WARNING, alias Warning sont des erreurs d'exécution qui ne provoquent pas l'arrêt du script.

Quelques Warning souvent rencontrés :

Warning: Division by zero in …

Vous tentez d'effectuer une division par 0, chose qui, vous le savez tous, est impossible :)

Warning : Cannot modify header information – headers already sent by

Vous tentez de modifier les en-têtes (headers) d'une page après avoir effectué une sortie vers le navigateur (envoi d'au moins un caractère au navigateur, même un espace). N'oubliez pas que le code HTML doit toujours être envoyé après la dernière modification sur les en-têtes. Si vous n'avez pas le choix, vous pouvez mettre en place un système de bufferisation avec ob_start() (lien) et ob_end_flush() (lien).

Warning : Invalid argument supplied for

Vous appelez une fonction en lui passant un argument incorrect.

+0 -0

Vous avez une erreur de type Notice

Les E_NOTICE, alias Notice sont des erreurs d’exécution non critiques qui ne provoquent pas, par conséquent, l’arrêt du script.

Quelques Notice souvent rencontrés :

Notice: Undefined variable: maVariable

Vous avez peut être tenté d’additionner deux variables, dont une des deux n’existe pas.

Notice: Undefined index: id

Vous récupérez peut être une variable de type GET ou POST qui n’a pas été définie.
Pour éviter cette erreur, pensez à toujours tester vos variables – et a fortiori les variables $_GET['monIndex'] ou $_POST['monIndex'] – avec la fonction php isset().

Si vous souhaitez savoir si une variable n’est pas vide, utilisez plutôt la fonction empty(). La différence entre isset() et empty() est expliquée plus bas

Notice: Uninitialized string offset

Cette erreur peut se produire lorsque vous essayez d’accéder à une case d’un tableau qui n’existe pas, ou que ce que vous croyez être un tableau est en fait une chaîne de caractères.

Notice: Use of undefined constant maVariable

Cette erreur résulte généralement de l’oubli du $ devant maVariable.

+0 -0

Vous avez une erreur de type Parse error

Les E_PARSE, alias Parse error sont souvent des erreurs d’inattention et résultent d'un problème de syntaxe dans le code

Quelques Parse error souvent rencontrées :

  • Parse error: syntax error, unexpected T_ECHO
  • Parse error: syntax error, unexpected T_VARIABLE
  • Parse error: syntax error, unexpected T_STRING
  • Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING

Un problème de syntaxe est survenu au niveau du token T_*.

La liste des tokens que l'on peut rencontrer se trouve sur cette page

Les causes les plus probables sont :

Cela peut aussi venir de l'utilisation des variables ($this->…) dans le corps même d'une classe et non dans une de ses méthodes.

Parse error: syntax error, unexpected $end

Une fin de code inattendue est survenue. Cette erreur résulte généralement :

  • d'une parenthèse fermante oubliée
  • d'une accolade fermante oubliée
  • d'un guillemet fermant oublié

Pour aider à la localisation de cette erreur, vous pouvez par exemple compter le nombre de parenthèses/accolades/guillemets ouvrants et fermants.

L'utilisation d'un éditeur de code qui met en exergue la parenthèse fermante pour une ouvrante ou l'inverse est une aide précieuse ;)

+0 -0

J'ai vu des ! dans mon code. Qu'est-ce que cela veut dire ?

Le ! correspond à l'opérateur logique NOT, c'est à dire la négation. Exemple :

1
2
3
<?php
if (!ctype_digit($nombre))
    echo "Ce nombre n'est pas un nombre entier.";

Affiche la chaîne "Ce nombre n'est pas un nombre entier" si $nombre n'en est effectivement pas un

Cela revient au même que de faire :

1
2
3
<?php
if (ctype_digit($nombre) == false)
    echo "Ce nombre n'est pas un nombre entier.";

Affiche aussi la chaîne "Ce nombre n'est pas un nombre entier" si $nombre n'en est effectivement pas un (version explicite)

+0 -0

Quelle est la différence entre isset() et empty() ?

isset() — Détermine si une variable est définie et est différente de null

Documentation officielle sur isset()

empty() — Détermine si une variable est vide

Documentation officielle sur empty()

Donc contrairement à isset(), empty() tient compte de la valeur de la variable, et renvoie false pour les valeurs suivantes :

  • "" (une chaîne vide)
  • 0 (0 en tant qu’entier)
  • 0.0 (0 en tant que nombre à virgule flottante)
  • "0" (0 en tant que chaîne de caractères)
  • null
  • false
  • array() (un tableau vide)
  • $var; (une variable déclarée, mais sans valeur assignée)
Table de vérité
Valeur isset($a) empty($a) !empty($a)
$a = '' true true false
$a = 1 true false true
$a = 0 true true false
unset($a) false true false
$a = ' ' true false true
$a = 'a' true false true
$a = null false true false
$a = false true true false
$a = true true false true
Table de vérité

Par défaut, tout ce que reçoit PHP quand on lui envoie les valeurs d’un champ de formulaire, que ce soit en GET ou en POST, est considéré d’abord comme une chaîne de caractères.
Par conséquent, un champ de formulaire vide retourne une chaîne de caractères vide

Ce qui signifie que isset($_POST['monChamp']) retournera true même si le champ n’a pas été rempli.

Les cases à cocher et boutons radio n’envoient aucune donnée quand ils ne sont pas sélectionnés

En conséquence de tout ça, vous pouvez n’utiliser que !empty($_POST['monChamp']) pour vérifier si l’utilisateur a bien mis une valeur dans un champ, tant qu’une des valeurs acceptables n’est pas 0.

+0 -0

Que signifient le ? et le : dans $b = isset($a) ? $a : 0 ?

Il s’agit d’une manière d’écrire une condition sous une forme qu’on nomme couramment ternaire.

La forme ternaire s’utilise ainsi : condition ? valeur_si_vrai : valeur_si_faux;
Un équivalent du code ci-dessus serait :

if (isset($a)) {
    $b = $a;
} else {
    $b = 0;
}
Equivalent de la syntaxe ternaire avec if

C’est quoi ce ?: que je vois parfois ?

En PHP 5.3, une syntaxe raccourcie de l’opérateur ci-dessus a été ajoutée. Plutôt que d’utiliser $d = $c ? $c : 0, on peut désormais écrire $d = $c ?: 0. Si $c est assimilable à true, alors $c ?: 0 retournera la valeur de $c, et 0 dans le cas inverse.

Ces deux points d’interrogation ?? que je vois depuis quelques temps dans le code, ils servent à quoi ?

Pour simplifier, disons que c’est un opérateur de PHP 7.0 qui permet de raccourcir la forme ternaire dans certains cas.

Si vous voulez tester qu’une variable existe, mettons un index de tableau, avant de manipuler une valeur, avec la forme ternaire présentée ci-dessus, il faudrait écrire isset($_GET['page']) ? $_GET['page'] : 1, la forme ternaire raccourcie n’est pas utilisable (le résultat de isset($_GET['page']) ?: 1 si $_GET['page'] existe serait un booléen true).

Le nouvel opérateur permet de "raccourcir" à $_GET['page'] ?? 1. On pourrait dire que c’est l’équivalent de isset($_GET['page']) ?: 1 sans qu’on ait besoin de mettre la fonction isset(), et qui en prime retourne bien le contenu de $_GET['page'] s’il existe.

+0 -0

A quoi sert le @ dans un code php ?

L'arobase (@) sert à éviter l'affichage d'erreurs que retourne php.
Il est conseillé de s'en servir uniquement si l'on est certain de gérer correctement ses erreurs, et surtout pas pour cacher les erreurs de programmation ou de conception que l'on fait.

Exemple correct :

1
2
3
4
5
6
7
<?php
// on évite d'afficher un E_WARNING pour fichier non trouvé
if ($compteur = @fopen('compteur.txt')) {
    // instructions
} else {
    // action à entreprendre en cas d'échec d'ouverture du fichier
}

Exemple correct

Exemple incorrect :

1
2
<?php
echo @htmlspecialchars($_GET['var']); // on cache une notice de variable indéfinie

Exemple incorrect

Cependant, le message d'erreur peut être récupéré dans la variable $php_errormsg si la directive track_error est activée. Vous pouvez ainsi affiner le traitement en cas d'erreur au besoin.
Plus d'informations à ce sujet dans la documentation

+0 -0

Mes variables de sessions disparaissent après rechargement d’une page, pourquoi ?

Si vous rencontrez ce problème, il est fort probable que la configuration de php sur votre (vieil ?) hébergement soit établie avec le register_globals activé. Pour le vérifier, faites un :

<?php
echo ini_get('register_globals');
Récupération de l’information quant à l’activation de register_globals

Si vous obtenez 1, c’est que malheureusement celui-ci est activé sur votre hébergement.

Depuis PHP 5.4, la directive register_globals n’existe plus

Plus d’information sur register_globals

Qu’est-ce que le register_globals ?

C’est une directive de php qui transforme les variables super-globales ($_SESSION, $_POST, $_GET, $_COOKIE, etc..) en variables simples, c’est à dire que si l’on définit une variable de session du nom de pseudo ($_SESSION['pseudo']) , une variable $pseudo sera automatiquement créée.

En quoi cela pose t-il problème ?

Si vous avez déclaré une variable $_SESSION['pseudo'] dans une page, et que sur une seconde page vous utilisez une variable $pseudo, $_SESSION['pseudo'] sera écrasée par la variable $pseudo. Si vous avez malencontreusement omis d’initialiser une variable dans votre script, un problème de sécurité survient, car l’utilisateur pourra la créer en l’ajoutant dans l’url de votre page

Il est vital de toujours initialiser ses variables, register_globals activé ou pas

Comment régler le problème ?

Si vous avez de la chance, votre hébergeur autorise sa modification via un fichier .htaccess. Ajoutez donc un tel fichier avec cette ligne (ou ajoutez-la au .htaccess existant) :

php_flag register_globals off
Code à placer sur une ligne d’un fichier .htaccess

Si vous obtenez une

erreur 500 : Internal Server Error

C’est que pas de chance pour vous, vous ne pouvez pas modifier cette directive.

Dans ce cas, la meilleure des solutions est de nommer différemment les variables super-globales en les préfixant pour les distinguer des autres variables "simples" de votre script.
Ainsi $_SESSION['pseudo'] pourrait devenir par exemple $_SESSION['sess_pseudo']. De cette manière, il n’y aurait plus de risque d’écrasement.

+0 -0
Jeux de caractères et encodage (1)

Des caractères étranges s’affichent sur mon site (ou dans ma base de données) à la place de caractères accentués (é, è, î, ê, ), quelle en est la cause ?

Les caractères accentués tronquent mes chaînes, que se passe-t-il ?

Ces problèmes peuvent provenir de multiples endroits.

Pour des caractères étranges, si vous avez :

  • é, è, î, ê à la place de respectivement é, è, à, ç (entre autres)
    Vous avez des données en UTF-8, mais elles sont prises comme de l’ISO 8869–1 ou "jeu de caractères cousin"
  • Des (�) à la place de é, è, à, ç, etc.
    Vos données sont en ISO 8859–1(5) ou "jeu de caractères cousin", mais elles sont prises comme de l’UTF-8

ISO 8859–1, UTF-8, tout ceci ne vous parle pas trop ? Il y a un tutoriel sur ce site qui vous expliquera.

Si vous utilisez un framework ou un CMS, faites bien attention aux différents paramètres de celui-ci, ainsi que la manière de les renseigner.

Si vous êtes sur un site "à l’ancienne", il faut déjà définir quel type d’encodage on se sert dans ses pages et s’y tenir pour tout.

Tout n’est pas bon à faire

L’utilisation des fonctions utf8_encode(), utf8_decode() (dépréciées depuis PHP 8.2) et header('Content-Type: text/html; charset=…') (point 7) est à considérer comme ultime recours, dans le cas où vous ne pouvez réellement pas faire autrement et qu’aucun des points ci-dessous appliqués correctement ne résout le problème

Les éléments à vérifier lorsque l’on a ce type de problème sont les suivants :

  1. Vérifier le type d’encodage utilisé dans votre éditeur de texte (voir les options de celui-ci)

    Certains éditeurs ne proposent pas l’ISO 8859–1(5) dans les options (Notepad++ par exemple), on choisira alors pour eux le jeu "cousin" ANSI. Cependant, dans l’idéal, passez à de l’UTF-8, ou utilisez au moins un autre éditeur qui supporte correctement le jeu de caractères ISO 8859–1(5)

  2. Spécifiez les variables de connexion/client de MySQL
    Jeu de caractères par défaut de MariaDB/MySQL

    Si vous ne précisez rien et que vous ne modifiez rien à la configuration de base de MariaDB ou de MySQL 5.x, ils fonctionnent par défaut en Windows-1252 (un "cousin" de l’ISO 8859–1), quelle que soit l’API de connexion (voir ici pour MariaDB et là pour MySQL 5.x pour plus d’info).
    Avec MySQL 8.0, c’est de l’UTF-8 qui est utilisé par défaut  ;)

    Pour changer cela, ajoutez ;charset=[jeu de caractères] au premier paramètre (appelé DSN) du constructeur de PDO, comme dans l’exemple suivant.

    <?php
    // Avec PDO
    $cnx = new PDO(
        'mysql:host=localhost'
            . ';dbname=my_db'
            . ';charset=utf8',
        $utilisateur,
        $motDePasse,
        array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        )
    );
    
    Exemple de spécification du jeu de caractère pour la connexion à une base de données MySQL

    Avec mysqli — notez la similitude d’avec les vieilles fonctions mysql_*, premier paramètre en plus :

    <?php
    mysqli_set_charset(
        $databaseLinkResource,
        'utf8'
    );
    
    Exemple de spécification du jeu de caractère pour la connexion à une base de données avec mysqli

    Le jeu de caractères à spécifier est celui dans lequel sont vos pages et scripts, indépendamment de celui dans lequel sont vos données.
    Pour de l’UTF-8, on utilisera utf8 ; pour de l’ISO 8859–1(5), latin1.

    Vieilles versions de PHP

    Si vous travaillez avec une version de PHP < 5.3.6, PDO ne prend pas ce paramètre en compte

    Il faut dans ce cas ajouter en plus de ce qui est mentionné ci-dessus une commande que PDO lancera à chaque ouverture de connexion. Placez ce paramètre là où cela correspond à entre les lignes 10 et 11 de l’exemple de code ci-dessus

    Ce qu’il faut ajouter pour PHP avant 5.3.6
    <?php
    // Encodage en UTF-8
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"
    // Encodage en ISO 8859-1(5)
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'latin1'"
    
    Elément de tableau à ajouter pour spécifier le jeu de connexion à MySQL avec PHP < 5.3.8

    Cette solution est prévue pour MySQL uniquement (comme le dénote MYSQL dans MYSQL_ATTR_INIT_COMMAND). A vous de l’adapter pour votre SGBD

  3. Paramétrez l’encodage de travail des fonctions qui le permettent, ou utilisez les fonctions adéquates

    Certaines fonctions (notamment htmlentities(), html_entity_decode(), htmlspecialchars(), json_encode(), json_decode(), et la plupart des fonctions str*()) retournent les chaînes de caractères dans un jeu précis, et n’acceptent que ce jeu précis comme entrée. Lisez attentivement ce message pour plus d’informations

  4. Vérifier que le charset de la balise <meta /> utilisée dans vos pages html est le bon

    C’est surtout pour que les personnes qui enregistreraient vos pages pour les lire plus tard puissent les rendre ensuite dans le bon jeu de caractères.

    <!-- Encodage en UTF-8, en XHTML -->
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
    <!-- Encodage en UTF-8, en HTML 5 -->
    <meta charset="utf-8" />
    
    <!-- Encodage en ISO 8859-1, en XHTML -->
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1" />
    <!-- Encodage en ISO 8859-1, en HTML 5 -->
    <meta charset="iso-8859-1" />
    
    <!-- Encodage en ISO 8859-15, en XHTML -->
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
    <!-- Encodage en ISO 8859-15, en HTML 5 -->
    <meta charset="iso-8859-15" />
    
    Exemples de spécification de l’encodage dans le HTML
  5. Vérifier le type d’encodage utilisé par défaut par PHP s’il est établi (fichier php.ini) (important surtout dès PHP 5.6)
    <?php
    echo ini_get('default_charset');
    
    Comment vérifier le jeu de caractères par défaut pour PHP

    Modifier s’il ne correspond pas à votre encodage, la valeur de default_charset dans le fichier php.ini

  6. Spécifiez le jeu de caractères par défaut envoyé par Apache

    Ajoutez AddDefaultCharset [votre jeu de caractères ici] dans le fichier .htaccess à la racine de votre site. En règle générale, remplacez les espaces par des tirets et mettez tout en minuscules (ex. : utf-8, iso-8859-1).

  7. Si vous n’avez aucun accès aux paramètres de PHP et que la directive Apache fait planter votre serveur ou ne résout rien, il vous reste la possibilité malpropre, fastidieuse et donc dernier recours qui est de spécifier le nouvel encodage dans l’entête avec header() (uniquement si en ayant appliqué les autres points ci-dessus vous avez encore le souci).
    Si l’utilisation de header('Content-Type: text/html; charset=…') est déconseillée, c’est d’une part parce que les versions récentes de PHP se basent sur default_charset (point 5) pour faire envoyer ce qu’il faut. Pour les plus vieilles versions de PHP, Apache peut s’en charger (d’où le point 6).

    <?php
    // Encodage d'une page html en UTF-8
    header('Content-Type: text/html; charset=utf-8');
    // Encodage d'une page html en ISO 8859-1
    header('Content-Type: text/html; charset=iso-8859-1');
    // Encodage d'une page html en ISO 8859-15
    header('Content-Type: text/html; charset=iso-8859-15');
    
    Exemple de spécification du jeu de caractères pour la réponse de PHP
  8. Vérifiez que l’encodage de la base de données est le bon
    Bien définir le jeu de caractères à utiliser

    La seule contrainte à ce niveau est que le jeu de caractères des colonnes de vos tables doit pouvoir contenir tous les caractères que vous souhaitez pouvoir utiliser. En conséquence, si vous affichez un site en ISO 8859–1(5) mais que votre base de données est en UTF-8, il ne devrait pas y avoir de problème.
    A l’inverse, enregistrer par exemple des émoticônes dans des colonnes en utf8_* ne sera pas possible, il faudra utiliser utf8mb4_*.

    Rappelez-vous ce qui est mentionné au point 2 : le jeu de caractères spécifié dans la connexion est indépendant du jeu d’enregistrement. Le SGBD va s’arranger pour que les données insérées soient dans le jeu d’enregistrement, et les données récupérées soient dans le jeu d’affichage. C’est une de ses fonctionnalités.

    MySQL et ISO 8859–15

    MySQL ne possède pas de jeu de caractères qui corresponde à l’ISO 8859–1 ni ISO 8859–15, seulement leur "cousin" Windows-1252. Certains caractères peuvent donc ne pas correctement s’afficher avec phpMyAdmin, mais si vous paramétrez correctement les autres points ci-dessus, ce sera bon dans vos pages

    Pour un site en ISO 8859–1(5), on utilisera généralement une collation latin1_swedish_ci (tout en conservant à l’esprit que certains caractères ne s’afficheront pas nécessairement correctement dans phpMyAdmin), pour un site en UTF-8 une collation utf8_general_ci.
    On notera que, depuis MySQL 5.5.3, deux nouveaux jeux de caractères ont fait leur apparition : utf8mb3, qui est la même chose que utf8, et utf8mb4, qui permet d’utiliser tout le potentiel d’UTF-8, moyennant parfois des possibilités d’enregistrement amoindries (les caractères prenant plus de place, on pourra en enregistrer moins). Cette nouvelle collation est à considérer si vous savez que votre site utilisera les emojis ou une large palette d’alphabets non latin, comme les sinogrammes ou autres caractères exotiques. Pour plus d’informations, je vous conseille de lire ceci

Si vous respectez tous ces points, vous ne devriez plus avoir de problèmes d’affichages de caractères corrompus dans vos pages.

+1 -0

Comment faire pour appliquer une fonction sur toutes les valeurs d'un tableau ?

La fonction array_map() est justement faite pour ça. Avec elle, vous pouvez faire ceci :

1
2
<?php
$monTableau = array_map('strtoupper', $monTableau);

Traitement de tous les éléments de $monTableau pour les mettre en majuscules

+0 -0

Comment utiliser une méthode d'une classe comme fonction de callback, comme le second paramètre de preg_replace_callback() ou le premier de array_map(), par exemple ?

Pour ce genre de cas, il faut utiliser un tableau contenant une instance de la classe puis le nom de la méthode. C'est ce tableau qui sera passé comme deuxième argument à preg_replace_callback().

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
class blabla{
    function parser($matches)
    {
        return '<div class="code">'.$matches[1].'</div>';
    }
    function plop($content)
    {
        preg_replace_callback(
            '#`(.+)`#',
            array($this, 'parser'),
            $content
        );
   }
}

Exemple d'appel d'une méthode d'une classe avec preg_replace_callback()

Notez bien que l'ordre array(instance de la classe, nom de la méthode) est important

+0 -0

Comment vérifier qu'une chaîne de caractères contient un nombre entier, une chaîne alphabétique ou alphanumérique ?

Il existe toute une panoplie de fonctions bien pratique pour vérifier cela : les fonctions ctype_*().

1
2
3
4
5
6
7
8
<?php
if (ctype_digit($var)) {
    echo '$var est une chaîne contenant un entier';
} else if (ctype_alpha($var)) {
    echo '$var est une chaîne contenant les lettres de a à z (minuscules et majuscules)';
} else if (ctype_alnum($var)) {
    echo '$var est une chaîne contenant des chiffres et lettres';
}

Exemple d'utilisation des fonctions ctype_*() pour tenter de déterminer le type de données dans une chaîne de caractères

+0 -0

Comment supprimer les espaces contenus au début et à la fin d’une chaîne de caractères ?

Pour cela, vous avez les fonctions trim(), ltrim() et rtrim()

<?php
$chaine = ' J\'aime pas les espaces qui servent à rien ! ';
$chaine_propre = trim($chaine); /*J'aime pas les espaces qui servent à rien !*/
Suppression des espaces en début et fin de chaîne

Et si je veux enlever seulement ceux en début ou fin de chaîne ?

Oui, c’est possible

Pas de panique il existe aussi des fonctions, dont la fonction ltrim()

Pour ceux qui ne l’auraient pas vu il y a un 'l' devant pour signifier 'left' c’est à dire gauche et donc par conséquent 'enlever les espaces situées à gauche' de la chaîne : ceux du début  ;)

<?php
$chaine = ' J\'aime pas les espaces qui servent à rien ! ';
$chaine_propre = ltrim($chaine); /*J'aime pas les espaces qui servent à rien ! */
Suppression des espaces en début de chaîne

Et si je veux enlever seulement ceux en fin de chaîne ?

Par déduction, il suffit de rajouter un "r" pour "right" et de faire avec la fonction rtrim().
Bravo, c’est aussi simple que ça :magicien:

<?php
$chaine = ' J\'aime pas les espaces qui servent à rien ! ';
$chaine_propre = rtrim($chaine); /* J'aime pas les espaces qui servent à rien !*/
Suppression des espaces en fin de chaîne

Et si je ne veux effacer QUE les tabulations par exemple ? Ou que j’aimerais enlever n’importe quel caractère ?

C’est aussi possible

Il est possible de choisir le ou les caractères que l’on souhaite effacer.
Pour cela il suffit de renseigner le deuxième paramètre de la fonction trim().

<?php
$chaine = " J'aime pas les tabulations ! \t";
$chaine_propre = trim($chaine, "\t"); /* J'aime pas les tabulations ! */
 
$chaine = 'les sssss en moinsssss';
$chaine_propre = trim($chaine, 's'); /*les sssss en moin*/
$chaine = 'pas de ponctuation !?';
$chaine_propre = trim($chaine, ' !?.;:'); /*pas de ponctuation*/
Suppression de caractères définis en début et fin de chaîne

trim(), ltrim(), rtrim() effacent par défaut les caractères suivants :

Caractère

Code ASCII

Description

" "

32

0x20

une espace ordinaire

"\t"

9

0x09

une tabulation

"\n"

10

0x0A

une nouvelle ligne (line feed)

"\r"

13

0x0D

un retour de chariot (carriage return)

"\0"

0

0x00

le caractère NUL

"\x0B"

11

0x0B

une tabulation verticale

+0 -0

Comment faire des actions différentes sur mon formulaire en fonction du bouton submit utilisé ?

Les boutons peuvent spécifier quelle cible doit traiter la soumission du formulaire avec l’attribut formaction.

Vieux navigateurs

Ceci ne fonctionnera pas avec Internet Explorer 9 et plus vieux.

Si vous devez faire quelque chose de compatible, ajoutez des valeurs à vos boutons, et testez ensuite la valeur envoyée ainsi afin de déterminer l’action à effectuer.

<!-- l'action dans la balise <form> est celle qui sera effectuée par défaut. Dans celle-ci,
     il faudra choisir selon la valeur du champ action si on traite un envoi ou une visualisation -->
<form action="/traitement_vieux_navigateurs.php" method="post">
    <!--
    … Champs du formulaire …
    -->
    <p>
        <!-- Ici on spécifie le traitement d'envoi directement -->
        <button type="submit" name="action" value="Envoyer" formaction="/envoyer.php">Envoyer</button>
        <!-- Et ici, on spécifie directement le traitement de visualisation -->
        <button type="submit" name="action" value="Visualiser" formaction="/visualiser.php">Visualiser</button>
    </p>
</form>
Un formulaire HTML avec deux actions possibles. Les vieux navigateurs utiliseront l’action définie dans la balise <form>, tandis que les plus récents comprendront qu’il faut utiliser ce qui a été spécifié dans formaction du bouton utilisé.
<?php
if (!empty($_POST)) {
    // …
    if ($_POST['action'] == 'Visualiser') {
        require_once 'visualiser.php';
    } else {
        require_once 'envoyer.php';
    }
}
// …
Un exemple de contenu pour traitement_vieux_navigateurs.php, qui va juste vérifier quel traitement utiliser de manière "explicite"
+0 -0

Comment afficher le code source d’une page php ?

Vous pouvez le faire directement en spécifiant une extension .phps à votre fichier dans l’url si votre hébergeur le gère.

Si votre hébergeur ne le gère pas, tentez en plus d’ajouter ceci dans un fichier .htaccess :

AddType application/x-httpd-php-source .phps
Spécifie pour apache que les fichiers avec l’extension .phps doivent être traités comme des sources PHP, donc non exécutables (source : documentation officelle de highlight_file())

Si vous êtes maître du serveur, vous pouvez même ajouter cela dans httpd.conf.

Si le serveur ne gère pas du tout le procédé proposé ci-dessus, il est aussi possible de le faire uniquement en PHP, en ajoutant ces trois lignes au début d’un fichier :

<?php
if (isset($_GET['source'])) {
	exit(highlight_file(__FILE__));
}
Ce petit code fait en sorte que, si vous l’appelez en ajoutant ?source à son URL, vous en voyez la source.

Notez bien que cette dernière proposition, si elle est appliquée à un fichier qui contient les identifiants de connexion, permet à n’importe-qui de les récupérer  :pirate:

+0 -0

Comment inverser les effets de la fonction nl2br() ?

Avec une fonction simple, se servant elle-même de str_replace().

1
2
3
4
5
6
7
8
9
<?php
function br2nl($string) {
    return str_replace(nl2br("\n"), "\n", $string);
    // Vous pouvez remplacer nl2br("\n") par '<br>' ou '<br />' selon votre version de php
}

$chaine = "test<br />ntest"; //Sous PHP >= 4.0.5
$chaine = "test<br>ntest"; //Sous PHP < 4.0.5
echo br2nl($chaine);

La fonction et un exemple d'utilisation

1
2
test
test

Affichage du résultat brut

+0 -0

Comment savoir si une année est bissextile ?

Depuis l'ajustement du calendrier grégorien, sont bissextiles les années :

  • soit divisibles par 4 mais non divisibles par 100 ;
  • soit divisibles par 400.

Wikipedia, dernier accès au 25 juillet 2014

Vous pouvez utiliser cette fonction :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
function bissextile($annee) {
    return checkdate(2,29,$annee);
}

$i = 1999;
while(++$i < 2006) {
    echo $i.' : ';
    var_dump(bissextile($i));
}

Simple fonction vérifiant si le 29 février de l'année passée en paramètre est un jour valide et exemple d'utilisation

1
2
3
4
5
6
2000 : bool(true)
2001 : bool(false)
2002 : bool(false)
2003 : bool(false)
2004 : bool(true)
2005 : bool(false)

Affichage du résultat

Notez qu'il y a aussi la chaîne de formatage L qui, passée à date() ou à Datetime::format(), retourne 1 si l'année est bissextile, et 0 dans le cas contraire.

+0 -0

Comment vérifier la validité du domaine d’une adresse email ?

Là aussi, vous pouvez vous aider de ceci, qui se base sur la fonction checkdnsrr() :

<?php
function verif_email($email) {
    // On scinde l'adresse au niveau de la première arobase (s'il y en a deux…)
    list($user, $domaine) = explode('@', $email, 2);
    // On vérifie qu'il y a un enregistrement MX (Mail eXchange) pour le domaine
    return checkdnsrr($domaine, "MX");
}

if (verif_email('zestedesavoir@hotmail.com')) {
    echo 'hotmail.com existe bien';
} else {
    echo 'hotmail.com n\'existe pas';
}
Fonction de vérification d’un enregistrement MX et exemple d’utilisation

hotmail.com existe bien

Résultat

La fonction checkdnsrr() n’était pas disponible sur système Windows avant PHP 5.3

Dans le cas où vous avez un environnement qui n’implémente pas cette fonction, vous pouvez la créer. La proposition ci-dessous ne retourne qu’un simple booléen, dans le but unique d’éviter la génération d’une erreur fatale du fait que la fonction n’existe pas.

De quoi éviter des erreurs sous Windows avec PHP avant 5.3
<?php
if (!function_exists('checkdnsrr')) {
    function checkdnsrr() {
        return true;
    }
}
Alternative pour Windows sous PHP < 5.3
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte