Quelques fonctions pratiques en PHP

Voici une petite compilation de fonctions bien pratiques avec des exemples qui pourront s’avérer utiles aux développeurs php débutants (ou pas). J’en ajouterais peut-être d’autres plus tard :

Générer un mot de passe aléatoire

Voici une façon assez « élégante » pour générer un mot de passe aléatoire (sans caractères spéciaux). La fonction prend en paramètre un entier permettant de définir la longueur du mot de passe :

function randomPass($length)
{
    return substr(md5(uniqid(mt_rand(), true)), 0, $length);
}

Voici un petit exemple d’utilisation :

echo randomPass(10); // Mot de passe généré : 997eb4be89

Calculer le nombre de jours entre deux dates

Un grand classique ! Notez que si vous avez une base de données MySQL, celle-ci a des fonctions toutes prêtes pour manipuler les dates (Voir la documentation)

function dateDiff($date1, $date2)
{
    return floor((strtotime($date1) - strtotime($date2))/(60*60*24));
}

Essayons des dates stockées au format datetime dans notre base de données :

echo dateDiff('2011-09-01 14:44:22', '2011-07-11 12:08:16'); // Affiche 52

Et avec les mêmes dates stockées au format timestamp cette fois :

echo dateDiff(date('Y-m-d H:i:s', 1314881062), date('Y-m-d H:i:s', 1310378896)); // Affiche 52

Ajouter un lien « lire la suite » à un paragraphe

Encore du classique, mais au moins la fonction coupe le paragraphe proprement, c’est à dire sans couper un mot et prend en charge l’encodage UTF-8 :

function readMore($text, $length, $url)
{
    if (mb_strlen($text, 'UTF-8') > $length)
    {      
        $text  = mb_substr($text, 0, $length, 'UTF-8');
        $text  = mb_substr($text, 0, mb_strrpos($text, ' ', -1, 'UTF-8'), 'UTF-8');
        $text .= '&nbsp;[&hellip;]<br /><a href="'.$url.'" title="Lire la suite de cet article">Lire la suite</a>';
       
        return $text;
    }
   
    return $text;
}

Pour tester la fonction il suffit de mettre le texte dans une variable et de spécifier le nombre de caractères que l’on souhaite afficher avant le lien « lire la suite » :

echo readMore($article, 150, 'mapage.php');

Créer un filtre « anti-spam »

Un peu plus compliqué maintenant on va créer un filtre anti-spam mais sans recourir à des plugins ou librairies tierces. Pour ce faire on va générer des questions aléatoires via une fonction php toute bête :

/* Fichier functions.php */
function randomCaptcha()
{
    // On créer 3 array avec des valeurs permettant de construire plusieurs question
    $param1 = array('chat','chien','cheval','pigeon','singe','mouton','cochon','poisson','renard','lion');
    $param2 = array('Gérard Holtz','Vincent Lagaf','Laurence Ferrari','Michel Drucker','Jean-Pierre Foucault','Christophe Dechavanne','Carla Bruni','Patrick Sebastien','Jean-Pierre Pernaut','William Leymergie');   
    $answer = array('blanc','bleu','rouge','noir','violet','jaune','marron','rose','gris','vert'); 
   
    // On ajoute la réponse dans une variable de session
    $_SESSION['captcha'] = $answer[rand(0,9)];
   
    // Et on forme notre phrase avec des éléments des tableaux choisis au hasard
    $phrase = 'Quelle est la couleur du '.$param1[rand(0,9)].' <strong>'.$_SESSION['captcha'].'</strong> de '.$param2[rand(0,9)].' ?';
               
    return $phrase;
}

Et voici la page du formulaire dans lequel on intègre le captcha avec une vérification très basique côté serveur en haut du fichier :

<?php
session_start();
require ('functions.php');
   
if (isset($_POST['send']))
{
    $captcha = filter_var($_POST['captcha'], FILTER_SANITIZE_STRING);

    if (!empty($captcha) && $captcha === $_SESSION['captcha']) {
        $message = "<div style='color:#008000'>Bonne réponse ! On peut continuer le traitement, faire une redirection...</div>";
    } else {
        $message = "<div style='color:#FF0000'>Le champ de sécurité est vide ou incorrect</div>";
    }
   
    unset($_SESSION['captcha']);
}

?>

<!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>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Exemple de filtre Anti Spam</title> 
        <meta name="robots" content="noindex, nofollow" />
    </head>
   
    <body>

        <?php if (isset($message)) echo $message; ?>
        <form method="post" action="<?php htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES); ?>">
            <p>
                <label for="pseudo">Pseudo :</label><br />
                <input id="pseudo" type="text" name="pseudo" />
            </p>
            <p>
                <label for="comment">Message :</label><br />
                <textarea id="comment" name="comment"></textarea>
            </p>
            <p>
                <label for="captcha"><?php echo randomCaptcha(); ?></label><br />
                <input id="captcha" type="text" name="captcha" />
            </p>
            <p>
                <input type="submit" name="send" />
            </p>
        </form>

    </body>
   
</html>

Évidement, ce système à lui seul est loin d’avoir la même efficacité que des services comme reCAPTCHA, mais rien n’interdit d’améliorer un peu ce script :)

Par exemple, on peut rajouter un champ caché, vide, que le bot ira remplir sans se poser de question (honeypot), si ce champ n’est pas vide lorsque le formulaire est soumis alors c’est un bot qui à rempli le formulaire. On peut aussi interdire l’envoi du message s’il contient plus de 2 ou 3 liens, ce qui est souvent le cas du spam (attention toutefois à ne pas supprimer des messages valides). Une autre piste consiste à vérifier si le formulaire n’est pas soumis trop rapidement en ajoutant un champ caché contenant le timestamp du moment où le formulaire a été généré, il ne restera plus qu’à comparer le temps écoulé entre la génération et la soumission du formulaire.

Bref, pour l’instant il n’y a pas de solution miracle contre le spam mais en cumulant les protections on peut arriver à avoir un système anti-spam assez efficace.

3 Commentaires sur “Quelques fonctions pratiques en PHP”

  • mashal27
    # Le 3 mai 2013 à 10 h 16 min

    ca fasait longtemps que je cherchais la fonction pour lire la suite. La votre marche bien mais j’ai un probleme quand il s’agit de transmettre vers la page cible de l’url. Je veux que quand on clique sur le lien lire la suite que ca ouvre la news correspondante alors mon blem c’est comment transmettre l’Id de la news. voici mon code:

    <?php
    $contenu = nl2br(stripslashes($donnee['contenu']));
    $id_news=mysql_real_escape_string($donnee['id']);
    echo readMore ($contenu,150,'article.php?billet=’);
    ?>

    Et c’est le parametre billet qu’on va get dans la page article.php mais ca me donne des erreurs dans cette facon de faire. Alors je vais votre coup de main svp. Merci d’avance.

    1
  • mika
    # Le 6 mai 2013 à 20 h 48 min

    Essayes ça :

    < ?php
    $id_news=mysql_real_escape_string($donnee['id']);
    echo readMore ($contenu,150,'article.php?billet=’.$id_news);
    ?>

    Au passage, mysql_real_escape_string sert à protéger tes variables lors de l’exécution d’une requête SQL. Pour l’affichage des résultats depuis la BDD il faut utiliser htmlspecialchars() pour afficher une chaine de caractères (ou intval() pour des nombres entiers comme un identifiant)

    2
  • mashal27
    # Le 7 mai 2013 à 10 h 29 min

    Merci beaucoup Mika pour ce coup de pouce ca marche super bien. Maintenant je peux continuer avec la suite.

    3

Laisser un commentaire

Vous pouvez ces balises HTML dans votre commentaire :
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Current month ye@r day *