Foire Aux Questions PHP

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

L'auteur de ce sujet a trouvé une solution à son problème.
Staff
Auteur du sujet

Bonjour,

Si vous débutez dans le développement PHP, vous serez sans doute amené à vous posez 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

Édité par elyppire

Llama ◦ FAQ PHPTuto WAMP

+2 -0
Staff
Auteur du sujet

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. Pour cela, insérez ces ligne au début de votre script :

1
2
3
<?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.

Avec PDO

PDO est par défaut silencieux, donc ne parle pas des erreurs SQL que le moteur de bases de données fournit. Il faut donc (en plus des lignes ci-dessus si absolument aucune erreur ne s'affiche) lui dire de nous en faire part.
Pour ce faire, passez en quatrième paramètre du constructeur un tableau comme celui-ci :

1
2
3
4
<?php
array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);

Activer les messages d'erreur de PDO

Avec MySQLi

Pour cette extension, si vous y êtes venus depuis les vieilles fonctions mysql_*, c'est très similaire à ce que vous faisiez avant : il faut simplement faire s'afficher les messages d'erreur comme montré dans les exemples de la documentation.

Édité par Ymox

Llama ◦ FAQ PHPTuto WAMP

+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 non-object/boolean

La requête que vous avez effectuée n'est pas correcte et a retourné un booléen plutôt qu'un objet PDOStatement. 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.

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Staff
Auteur du sujet

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.

Édité par Ymox

Llama ◦ FAQ PHPTuto WAMP

+0 -0

Vous avez une erreur de type Notice

Les E_NOTICE, alias Notice sont des erreurs d'exécution non critique 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().

Notice: Uninitialized string offset

Cette erreur peut se produire lorsque vous essayez d'accéder à une case d'un tableau qui n'existe pas.

Notice: Use of undefined constant maVariable

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

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Staff
Auteur du sujet

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 ;)

Édité par Ymox

Llama ◦ FAQ PHPTuto WAMP

+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)

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+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)
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: 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.

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.

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

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

C'est une condition sous la forme ternaire.

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

1
2
3
4
5
6
<?php
if (isset($a)) {
    $b = $a;
} else {
    $b = 0;
}

Equivalent de la syntaxe ternaire avec if

Depuis PHP 5.3, il existe une syntaxe raccourcie. 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

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+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

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+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 :

1
2
<?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

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) :

1
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.

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

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 :

  1. é, è, î, ê à 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"
  2. 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.

L'utilisation des fonctions utf8_encode(), utf8_decode() 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
    Pour cela, ajoutez ;charset=[jeu de caractères] au premier paramètre du constructeur de PDO, comme dans l'exemple suivant.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    <?php $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

    Si vous ne précisez rien, PDO fonctionne par défaut en ISO 8859-1. ;)

    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.

    Si vous travaillez avec une version de PHP < 5.3.6, ce paramètre n'est pas pris en compte

    Il faut dans ce cas ajouter une commande que PDO lancera à chaque ouverture de connexion. Ajoutez ce paramètre là où cela correspond à entre les lignes 6 et 7 de l'exemple de code ci-dessus

    1
    2
    3
    4
    5
    <?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

    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. Regardez 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.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- Encodage en UTF-8, en XHTML -->
    <meta http-equiv="Content-Type" content="text/html; 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="text/html; 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" />
    
  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)

    1
    2
    <?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 pour faire envoyer ce qu'il faut. Pour les plus vieilles versions de PHP, Apache peut s'en charger (d'où le point 6).

    1
    2
    3
    4
    5
    6
    7
    <?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

    Ce point est facultatif, mais si vous souhaitez qu'il y ait une grande cohérence entre vos scripts et vos données, cela ne peut pas faire de mal.
    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 ne possède pas de collation qui corresponde à l'ISO 8859-15. Le signe € entre autres ne s'affichera donc pas correctement 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, on utilisera généralement une collation latin1_swedish_ci, pour pour un site en UTF-8 une collation en utf8_general_ci. Pour de l'ISO 8859-15, vous pouvez reprendre la collation prévue pour de l'ISO 8859-1, tout en conservant à l'esprit que certains caractères ne s'afficheront pas nécessairement correctement dans phpMyAdmin. Plus d'infos concernant les collations.
    On notera que, depuis MySQL 5.5.3, deux nouvelles collations 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 une large palette d'alphabets non latin, comme les alphabets cyrilliques ou grec. 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.

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+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

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+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

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+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

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

Comment supprimer les espaces contenus au début et à la fin d'une chaine de caractères ?

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

1
2
3
<?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 chaine ?

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 chaine : ceux du début  ;)

1
2
3
<?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 chaine ?

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:

1
2
3
<?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 ?

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().

1
2
3
4
5
6
7
8
<?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

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

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

La solution est simple : il suffit de mettre l'attribut name à chaque <input type="submit" /> de votre <form>, et de tester dans votre script lequel a été utilisé.

1
2
3
4
5
6
7
8
9
<form action="" method="post">
    <!--
    Champs du formulaire
    -->
    <p>
        <input type="submit" name="action" value="Envoyer" />
        <input type="submit" name="action" value="Visualiser" />
    </p>
</form>

Un formulaire HTML avec deux actions possibles

1
2
3
4
5
6
7
8
9
<?php
if (!empty($_POST)) {
    // …
    if ($_POST['action'] == 'Visualiser') {
        // Code pour la prévisualisation
    } else {
        // Code de l'enregistrement
    }
}

Le traitement selon l'action choisie

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+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 :

1
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

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 :

1
2
3
4
<?php
if (isset($_GET['source'])) {
    exit(show_source(__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:

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+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

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+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.

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+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() :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?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.

1
2
3
4
5
6
<?php
if (!function_exists('checkdnsrr')) {
  function checkdnsrr() {
      return true;
  }
}

Alternative pour Windows sous PHP < 5.3

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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