Vous êtes dans la categorie Tutoriel PHP

Comment formater un numéro de téléphone et insérer des espaces dans une chaine de caractère avec PHP

Rédigé par fab1 aucun commentaire

C'est un problème qui peut se poser sur vos chaines de caractères un peu particulières et qui nécessitent un petit traitement comme un numéro de téléphone non formaté pour l'affichage. Nous allons voir comment cela est facile à résoudre à l'aide de la fonction wordwrap(). Prenons par exemple le cas d'un numéro de téléphone français qui serait stocké de la manière suivante dans votre base de données MySQL par exemple : "0102030405".

La problématique est alors la suivante : vous voulez que l'affichage des numéros de téléphones soit clair pour vos utilisateurs et faire malgré tout des économies de mémoire sur votre serveur de base de données qui stocke un grand nombre de numéros de téléphone en ne sauvegardant pas les numéros avec leurs espaces qui sont présents tout les deux caractères. On fait des économies d'espace mémoire mais c'est pas très joli.

Comme d'habitude en programmation il existe un grand nombre de solutions possibles pour un problème donné. La première fois que j'ai cherché à résoudre ce problème, je suis passé sur de très nombreux forum avec différentes techniques. Si j'écris cet article, c'est pour aider ceux qui tomberont ici et éviter qu'ils cherchent longtemps la solution à ce problème d'espace tout les x caractères dans une chaine.

J'ai d'abord vu les bourrins qui proposaient de faire un for avec du strlen et du substr, ce que revient à 5/6 lignes de codes avec la présence d'itération. En gros je compte deux caractères, j'ajoute un espace et ainsi de suite. Bof, pas terrible de faire des boucles pour un truc aussi simple ...

Ensuite je suis tombé sur les amoureux des d'expressions régulières qui proposaient différentes solutions plus ou moins simples selon la qualité de l’expression régulière concoctée. Attention je ne dis pas que ce n'est pas la bonne solution, mais si vous avez bien suivi le contexte, je trouve ça encore un poil trop lourd pour ce que je cherche à faire. J'aime le simple en programmation, je veux des KISS partout moi :p Bon je ne suis pas totalement réfractaire à ce genre de solution et voici un petit exemple qui fonctionne si on souhaite ajouter un espace tout les deux caractères ce qui correspond à notre besoin concernant le numéro de téléphone non formaté :

<?php 

$string = '0102030405';
echo preg_replace('#(\d{2})#', '$1 ', $string);

?>

Mais ce n'est pas encore parfait à mon gout car ce n'est pas assez simple. C'est à ce moment que j'ai découvert la fonction wordwrap() et franchement, pour le besoin de formater un numéro de téléphone que nous avons, il va être difficile de faire plus simple et surtout clair à comprendre. Cette fonction wordwrap s'utilise alors de la manière suivante sur notre numéro de téléphone français :

<?php

$string = '0102030405';
echo wordwrap($string,2, " ",1);

?>

Je vous laisse consulter la documentation officielle de PHP pour plus d'informations sur cette fonction wordwrap qui peut donc s’avérer très pratique.

Classé dans : Tutoriel PHP

Comment déclarer l'encodage d'une page HTML ou PHP au format UTF-8

Rédigé par fab1 aucun commentaire

Comme nous l'avons vu précédemment, l'encodage de vos pages peut parfois poser quelques problèmes avec un résultat qui ne correspond pas à vos attentes et le problème de ces caractères spéciaux qui ne fonctionnent plus. Pourtant il existe une manière simple pour unifier l'ensemble des parties de son projet web, c'est d'utiliser l'encodage UTF-8 qui est censé supporté l'ensemble des langues et leurs caractères spéciaux.

C'est très pratique que cela permet de supprimer beaucoup de contraintes, mais encore faut-il correctement l'utiliser sur vos différentes pages. Après avoir vu comment il fallait procéder pour profiter de l'encodage UTF-8 via nos requêtes SQL sous PDO et MsQLi, nous allons voir comment encoder une page HTML ou PHP qui affiche le résultat sous ce même format UTF8 (sinon tout ce que l'on fait ne sert à rien :D).

Encoder une page au format UTF-8

Dans ce cas, c'est le serveur qui s'occuper de nous envoyer notre page au bon format UTF-8, n'oubliez pas que cette fonction touche au header, il faudra donc placer cette ligne de code avant toute instruction qui écrit le document HTML de résultat, sinon vous aurez une erreur qui vous indique que le header est déjà défini et que vous ne pouvez plus le modifier. La ligne de PHP à ajouter pour profiter de l'encodage au format UTF-8 :

<?php
header('Content-Type: text/html; charset=UTF-8');
?>

Encoder une page au format XHTML

Cette version est maintenant de moins en moins utilisée, étant donné que l'on préfère maintenant la version HTML pour faire ce genre de choses, surtout que la déclaration est plus simple et claire, mais pour votre projet, peut-être que vous voulez déclarer l'utilisation de l'encodage UTF-8 avec le type XHTML. Pour ce faire, il faudra alors utiliser cette ligne :

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

Encoder une page au format HTML 5

Enfin, on termine avec la version qui est maintenant la plus courante pour déclarer que l'on utilise l'encodage UTF-8, c'est possible via une simple ligne HTML 5 qu'il faut maintenant utiliser si votre document est écrit dans ce format :

<meta charset="UTF-8">

Classé dans : Tutoriel PHP

Récupérer les données de requêtes SQL au format UTF-8 avec PHP PDO et MsQLi

Rédigé par fab1 aucun commentaire

L'encodage des caractères pose toujours quelques problèmes lors de la création et la gestion d’une application Web qui exploite une base de données. Il est alors très courant de rencontrer des problèmes d'encodage avec des caractères spéciaux qui ne s'affichent pas forcément de façon correcte. C'est vraiment très désagréable en tant qu'administrateur mais imaginez pour l'utilisateur qui ne comprend pas l'origine du problème ...

Il va penser que votre site est incompréhensible avec beaucoup de caractères spéciaux qui ne passent pas, ce n'est pas possible de laisser les choses dans cet étant. Nous allons donc tenter d'obtenir le contenu de notre base de données au bon format, en indiquant à nos fonctions PHP PDO et MsQLi le bon encodage à utiliser pour afficher les données de la bdd.

Encodage UTF-8 avec PHP PDO

Dans les deux exemples qui vont suivre, nous allons voir comment forcer l'utilisation de l'encodage UTF8 pour exécuter nos requêtes dans le bon format avec PDO en PHP dans un premier temps :

<?php

// connexion bdd    
$BDD_hote = 'localhost';
$BDD_bd = 'nombdd';
$BDD_utilisateur = 'root';
$BDD_mot_passe = 'root';


 try{
        $bdd = new PDO('mysql:host='.$BDD_hote.';dbname='.$BDD_bd, $BDD_utilisateur, $BDD_mot_passe);
        $bdd->exec("SET CHARACTER SET utf8");
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    }

    catch(PDOException $e){
        echo 'Erreur : '.$e->getMessage();
        echo 'N° : '.$e->getCode();
    }  
?>

Encodage UTF-8 avec PHP MsQLi

On passe maintenant à l'encodage au format UTF-8 avec MsQLi qui sera aussi très utile si vous ne souhaitez pas utiliser les fonctions PDO pour communiquer à avec votre base de données MySQL. Comment forcer l'encodage UTF8 avec MsQLi, la réponse tout de suite :

<?php

// connexion bdd    
$BDD_hote = 'localhost';
$BDD_bd = 'nombdd';
$BDD_utilisateur = 'root';
$BDD_mot_passe = 'root';

$connexion = mysqli_connect($BDD_hote, $BDD_utilisateur, $BDD_mot_passe, $BDD_bd);

/* Réglage du résultat en utf8 */
if (!mysqli_set_charset($connexion, "utf8")) {
    // printf("Erreur lors du chargement du jeu de caractères utf8 : %s\n", mysqli_error($connexion));
} else {
    // printf("Jeu de caractères courant : %s\n", mysqli_character_set_name($connexion));
} 
?>

Classé dans : Tutoriel PHP

Créer un sondage basique qui affiche le nombre de vote et pourcentage avec PHP

Rédigé par fab1 aucun commentaire

Il est possible de faire un très grand nombre de choses avec PHP et aujourd'hui nous allons voir comment créer facilement un petit sondage avec PHP sans utiliser de base de données MySQL. Le stockage des données se fera dans un fichier texte qui devra donc être unique pour chaque sondage que vous allez proposer sur votre site web. Ce petit script sondage est une ébauche et il est bien évidemment possible de l'améliorer pour le rendre encore plus performant.

Comme indiqué précédemment, ce script PHP pour faire votre sondage n'a pas besoin de base de données et seul des fichiers textes seront utilisés pour stocker les résultats. Ensuite nous avons un page PHP qui s’occupe de contrôler le sondage avec une petite feuille de style pour présenter tout ça. Maintenant, place au code :

<?php
ob_start("ob_gzhandler");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">

    <head>
        <title>Sondage Base</title>
        <meta name="Description" content="Phrases pertinentes" />
        <meta name="Keywords" content="Mots pertinent" />

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <link rel="stylesheet" media="screen" type="text/css" href="sondage/style/global.css" />

    </head>
    <?php

$titre = 'sondage'; // = nom du fichier dans lequel est stocké les votes
$question = 'Votre avis sur Walking Dead'; //  La question ici
$reponse[1] = 'Excellent'; // Premier choix de réponse
$reponse[2] = 'Assez bien'; // Deuxième choix de réponse
$reponse[3] = 'Moyen'; // Les autres choix de réponse sont facultative.
$reponse[4] = 'Pas terrible';
$reponse[5] = 'A éviter';

    ?>

    <body>

        <h1>Sondage</h1>

        <div id="sondage">

            <?php

$nb_max_votes = 1; // 0 si illimité
// MODIFICATION DU SONDAGE
$choix = count($reponse);
if (isset($_GET['vote']))
{
    $resultats = fopen("$titre.txt", "r+");
    $vote = $_GET['vote'];
    for ($numero = 1; $numero <= $choix; $numero ++)
    {
        $ligne[$numero] = (int) fgets($resultats);
        if ($numero == $vote)
        {
            $ligne[$numero] ++;
        }
        if (isset($donnees_votes))
        {
            $donnees_votes = $donnees_votes . "\n" . $ligne[$numero];
            $nb_votes += $ligne[$numero]; // comptage du nombre de votes
        }
        else
        {
            $donnees_votes = $ligne[$numero];
            $nb_votes = (int) $ligne[$numero];
        }
    }
    fseek ($resultats, 0);
    if($nb_votes<=$nb_max_votes OR $nb_max_votes==1)
        fputs ($resultats, $donnees_votes); // écriture des données

    fclose($resultats);

    header('Location: http://localhost/sondage/sondage.php');
}
// Lecture du sondage
$resultats = fopen("$titre.txt", "r");

$numero = 1;
while ($numero <= $choix) // attribution d'un nombre pour chaque vote à l'array $resultat[]
{
    $resultat[$numero] = fgets($resultats);
    if ($resultat[$numero] == NULL) // on remplace les lignes vides du fichier txt par 0
    {
        $resultat[$numero] = 1;
    }
    $numero ++;
}

$total_votes = 0; // calcul du total des votes
foreach($resultat as $nb_resultat) $total_votes += $nb_resultat;
if ($total_votes == 0) // éviter la division par 0
{
    $total_votes = 1;
}
$numero = 1;
while ($numero <= $choix) // transformation du nombre de vote en pourcentages
{
    $pourcentage[$numero] = $resultat[$numero] / $total_votes * 100;
    $numero ++;
}

$long_max_bloc = 120; // longueur maximale du curseur pour un vote en pixels

// affichage des barres et du nombre de votes
$numero = 1;
echo ('<div class="titresondage" >'. $question . '</div><br /><form action="sondage.php">');
while ($numero <= $choix)
{
    echo ('<div class="choix"><label><input type="radio" name="vote" value="' . $numero . '" />'. $reponse[$numero] .'</label>
     <br /><img src="sondage/images/bg-red.jpg" height="10" width="' . $pourcentage[$numero] / 100 * $long_max_bloc . '"
     alt="'.round($pourcentage[$numero]).'%" /> <span style="font-size:70%;"><strong>' . $resultat[$numero] . ' votes</strong></span></div>');

    echo (substr($pourcentage[$numero],0,4) . '%');
    $numero ++;
}
echo ('<div><br /><input type="submit" class="submit" value="" />');
echo ('</div></form>');
fclose($resultats);
            ?>
        </div>

    </body>
</html>

Une feuille de style est aussi nécessaire pour le bon affichage des éléments. Vous pouvez récupérer les images nécessaire sur le bouton télécharger à la fin de ce tutoriel. Le code de la feuille de style CSS :

html {
font-size: 100%;
margin:0;
padding:0;
}

body {
color:#000;
font-family:Arial, Helvetica, sans-serif;
font-size:100%;
background:#fff;
margin:0;
padding:10px 20px;
}

#sondage{
color:#fff;
width:225px;
padding-bottom: 3em;
padding-left: 4em;    
padding-top: 3em;    
padding-right: 4em;    
margin:15px 0 0 10px;
background:grey;
}

.submit{
background:url(../images/voter.png) no-repeat;
width:112px;
height:26px;
border:none;
cursor:pointer;
}

.submit:hover {
background:url(../images/voter-on.png) no-repeat;
}

strong {
font-weight:900;
color:#444;
}

div#titresondage {
    background: red;
}

Vous pouvez récupérer l'ensemble des fichiers dans l'archive disponible via le bouton télécharger.

Classé dans : Tutoriel PHP

Comment masquer les messages d'erreurs fonction deprecated sous PHP

Rédigé par fab1 aucun commentaire

Cette type d'erreur E_DEPRECATED est vraiment est très courant en PHP surtout lorsque l'on récupère du code source qui à été écrit il y fort longtemps ou un script qui n'a pas été mis à jour depuis des années par son auteur. En général cela ne pose pas de problème sur la partie exécution du script mais par contre votre affichage risque d'en souffrir fortement ... En effet, chaque fois qu'un fonction obsolète sera exécutée par votre serveur, cela aura pour conséquence d'afficher un message d'erreur de type deprecated qui risque bien de détruire totalement votre mise en page ce qui sera dommage pour vos utilisateurs qui risquent de prendre peur.

Deprecated: mysql_pconnect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in C:\wamp\www\testmenu\index.php on line 41

Alors même si je suis totalement contre ce genre de solution, il est possible de cacher ces messages erreurs deprecated via une petite ligne à ajouter dans votre script. Vous pouvez aussi masquer ces erreurs E_DEPRECATED en modifiant le fichier php.ini ou via le .htaccess mais on ne va pas aller jusque là car je trouve que cacher les messages d'erreurs sur l'ensemble de votre est tout simplement inimaginable car cela s'appliquera aussi pour vos autres scripts en cours de développement par exemple ...

La solution qui sera expliquée ici est donc l'ajout d'une ligne d'une ligne au début de votre script PHP qui va cacher les erreurs deprecated, vous pouvez aussi créer un fichier style cacher_deprecated.php que vous allez inclure sur toutes vos pages qui lèvent cette erreur. Le code est vraiment tout simple :

<?php
error_reporting(E_ALL ^ E_DEPRECATED);
?>

Voila, vous n'avez plus d'erreurs E_DEPRECATED qui apparaissent mais gardez bien à l'esprit que le problème est toujours là et que cela risque de vous poser de sérieux soucis à l'avenir ... Si il s'agit de votre propre script, vous avez vraiment tout intérêt à corriger les fonctions qui posent problème en les remplaçant par la version qui elle est à jour comme avec l'utilisation de PDO qui est conseillé dans notre exemple.

Classé dans : Tutoriel PHP