Bonjour a tous,

Je débute en Php et j'ai écrit une partie de ce code en me basant sur le tuto forulaire. Si quelqu'un à la patience de jeter un oeil sur mon code et me proposer des améliorations ce serait sympa, cela permettrait de m'améliorer ^^.
Merci à celle ou celui qui m'aidera

<?php
if(isset($_POST'Envoyer'])){ 
    extract($_POST);
    $valide= true;
    if(empty($NIR) OR !preg_match("#^[0-9]{13}$#", $_POST'NIR'])){ 
        $valide=false;
        $erreurnir="vous n'avez pas rempli votre NIR Ou le format \"$NIR\" est incorrect.";}

    if(empty($Nom)){
    $valide=false;
    $erreurnom=" vous n'avez pas rempli votre Nom";
    }

    // Tous les champs sont remplis donc ici on se connecte à la base de donné et on vérifie si le NIR existe déjà
    if($valide){
    // Identifiants
    $host = 'localhost';
    $login = 'root';
    $pass = 'root';
    $db = 'bd_cnav';

    // Connexion
    mysql_connect($host, $login, $pass) or trigger_error(mysql_error(), E_USER_ERROR);

    mysql_select_db ($db) or die ('ERREUR '.mysql_error()); 
    $requete = "SELECT * FROM bd_assure WHERE NIR='".$_POST'NIR']."' ";
    $resultat = mysql_query ($requete); 
    $ligne = mysql_num_rows($resultat);

         if($ligne !=0) // Le nom existe déjà, on affiche un message d'erreur
            {
                $errornirexist="<font color=\"red\">Désolé, mais ce Nir n° \"$NIR\" existe déjà dans notre base.</font>";
            }else
                { 
            $sqil="INSERT INTO bd_assure (NIR, Nom, Commentaire) VALUES ('".$_POST'NIR']."', '".$_POST'Nom']."', '".$_POST'Commentaire']."')";
            $resul = mysql_query($sqil) or die ('Erreur '.$sqil.' '.mysql_error());
            $numero = mysql_insert_id();
            $bdvalid= "<span class=\"valid\">Insertion de l'asuré(e) n°\"$NIR\" dans la base MYSQL réussie !</span>";
            }

// libère l'espace mémoire et sort de SQl
mysql_free_result ($resultat); 
mysql_close();

        }
}

2 réponses


KTC
Auteur
Réponse acceptée

Merci Yuki,

Je vais regarder ta correction et analyser tes commentaires, de plus c'est en PDO donc ça me change du code php classique qui parait il est dépassé, mais la plus part des tuto sont encore avec du php classique...

Merci encore pour avoir pris du temps

( Note : Il y a un bug dans le parseur de code du forum, il m'ajoute un double "empty", je l'ai signalé dans la partie qui permet de signaler les bugs).

<?php
if( isset( $_POST'Envoyer'] ) ) {
    $error = array();
    $dbConf = array(
        'host' => 'localhost',
        'user' => 'root',
        'pass' => 'root',
        'name' => 'bd_cnav'
    );

    // - Verif. NIR
    if( !isset( $_POST'NIR'] ) || empty( $_POST'NIR'] ) ) {
        $error] = "Vous n'avez pas rempli votre NIR !";
    } else if( !preg_match("#^[0-9]{13}$#", $_POST'NIR']) ) {
        $error] = "Le format de votre NIR est incorrect.";
        // Ou alors : $error] = 'Le format du NIR : "' . htmlspecialchars( $_POST'NIR'] ) . '" est incorrect.';
    }

    // - Verif. Nom
    if( !isset( $_POST'Nom'] ) || empty( $_POST'Nom'] ) ) {
        $error] = "Vous n'avez pas rempli votre nom.";
    }

    if( empty( $error ) ) {
        try {
            $db = new PDO('mysql:host=' . $dbConf'host'] . ';dbname=' . $dbConf'name'], $dbConf'user'], $dbConf'pass']);

            // - En temps normal, il aurait été judicieux d'utiliser une requete préparé, mais avec la regex testé plus haut, c'est pas utile ici.
            $countNIR = $db->query("SELECT COUNT(*) FROM `bd_assure` WHERE `NIR`=" . $_POST'NIR'])->fetchColumn(); 
            if( $countNIR !== O ) {
                $error] = 'Désolé, mais ce Nir n°"' . $_POST'NIR'] . '" existe déjà dans notre base.';
            } else {
                $db->prepare("INSERT INTO `db_assure` (`NIR`, `Nom`, `Commentaire`) VALUES(:NIR, :Nom, :Commentaire)")->execute(array(
                    ':NIR' => $_POST'NIR'], 
                    ':Nom' => htmlspecialchars( $_POST'Nom'] ),
                    ':Commentaire' => htmlspecialchars( $_POST'Commentaire'] )
                ));

                $numero = $db->lastInsertId();
                $actionMsg = '<span class="valid">Insertion de l\'assuré(e) n°"' . $_POST'NIR'] . '" dans la base réussie !</span>';
            }
        } catch( Exception $e ) {
            echo 'Erreur : ' . $e->getMessage();
            exit;
        }
        unset( $db );
    }
    $actionMsg = ( isset( $actionMsg ) ) ? $actionMsg : ( !empty( $error ) ? '<div class="error" style="color:red;"><ul><li>' . implode('</li><li>', $error) . '</li></ul><div>' : '' );
}

Quelques trucs à savoir :

  • Les erreurs sont contenus dans le tableau $error, elles ne sont pas identifiés, si tu veux avoir une variable par erreur tu peux fixer une clé au moment ou l'erreur est assigné (ex: $error'erreurnom'] = "...";) au lieu de $error] = "...";

  • Je te conseil d'activer l'affichage des erreurs de type "Notice", parce qu'il y a pas mal de variables non déclarés dans ton code (et j'ose à peine imaginer la suite du code qui récupère tout cela.)

  • Pour récupérer les valeurs des entrées de $_POST dans la suite de ton code, il faudra passer par $_POST'Commentaire'] par exemple, le "extract" est une tres mauvaise idées sur des entrées utilisateurs, et n'oublie pas d'échapper tout cela, sinon ca va puer les failles XSS et autres joies ...

  • Dans mon code, je n'ai pas assigné toutes les variables dont tu pourrais avoir besoin, tout simplement parce que je ne connais pas tes besoins. Vérifie avant d'utiliser.

  • $actionMsg contient le message de sortie (Erreur ou confirmation).