Comment bien écrire son code ?

Florian.

Premium
Inscription
8 Août 2012
Messages
4 251
Réactions
1 220
Points
14 353
Hello,

Après plusieurs semaine sur un projet, une personne est venu m'aider, elle ma montré comment elle codé et personnellement j'ai kiffer et c'est ultra lisible.

Pour ce tuto je vais perdre le code de https://induste.com/threads/update-bdd-sur-toutes-les-valeurs.552148/ car je codais un peu comme ça c'est a dire avec des else/if de partout, resultat si vous devez modifier ou rechercher un truck c'est le bordel

Alors: son code fait 188lignes au total ce qui est assez énorme on notera qu'il peux juste update la table

Voici le résultat

PHP:
<?php
require "config.php";
/*

LES REQUETES DELETE/INSERT INTO/UPDATE

*/
function add(){
    global $bdd;

    if(!$_POST['statue']){ return 1;}

    if(!preg_match("/^[a-zA-Z0-9ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ'\"_ -]+$/", $_POST['staue'])){ return 11;}

    $statue = htmlspecialchars($_POST['statue']);


    $insert = $bdd->prepare("INSERT INTO commande (statue) VALUES (?)");
    $insert->execute(array($statue));
}

function updatecommande($id){
    global $bdd;
    if(!$_POST['statue'] OR !$_POST['id']){return 'Vous devez remplir les champs'; }
    if(!preg_match("/^[a-zA-Z0-9ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ'\"_ -]+$/", $_POST['statue'])){ return 11;}
    if(!preg_match("/^[0-9]+$/", $id)){return 111;}
    $UPDATEcommande = $bdd->prepare("UPDATE commande SET statue = ? WHERE id = ?");
    $UPDATEcommande->execute(array($_POST['statue'], $id));
    return 1111;
}

function delete($id){
    global $bdd;
    if(!preg_match("/^[0-9]+$/", $id)){ return;}
    if(isset($_POST['subDelete'])){
        $delete = $bdd->prepare("DELETE FROM commande WHERE id = :id");
        if($delete->execute(array($id))){ return 'Votre commande a bien été supprimé.'; $error = 1;}else{ return 'Une erreur est survenue, veuillez réessayer.'; $error = 1;}
    }

    $display = $bdd->prepare("SELECT * FROM commande WHERE id = :id");
    $display->execute(array($id));
    $fetch = $display->fetch();
    affichepost($fetch['statue'], 'Delete', 'Supprimer', true, $error);
}
/*

ICI C'EST TOUT LES POST

*/

function affichepost($statue, $subname, $subvalue, $disabled, $error){   //FUNCTION PRINCIPAL ELLE EVITE DE COPIER 5000 FOIS LE POST
    if($error){ echo $error;}
    ?>
    <form action="" method="POST">
    <input type="text" name="name" placeholder="Nom de la commande"<?php if($statue){ echo " value=\"". $statue ."\"";} ?><?php if($disabled){ echo " disabled";} ?>>
    <br><br><input type="submit" name="sub<?= $subname; ?>" value="<?= $subvalue; ?>">
    </form>
    <?php
}

function addcommande(){
    if(isset($_POST['subAdd'])){
        $verif = submitAdd();
        if($verif == 1){ setFlash('Veuillez remplir les champs obligatoires.'); $error = 1;}
        elseif($verif == 1000){ setFlash('Votre commande a bien été ajouté !', success); $error = 1;}
    }

    if(isset($_POST['statue'], 'add', 'Ajouter', false, $error);}
    else{affichepost('', '', '', '', '', '', '', '', '', 'Add', 'Ajouter', false, $error);}
}

function edit($id){
    global $bdd;
    if(!preg_match("/^[0-9]+$/", $id)){ return 'Veuillez remplir les champs obligatoires.'); $error = 1;}
    if(isset($_POST['subEdit'])){
    $verif = updatecommande($id);
    elseif($verif == 11){ return 'Une erreur est survenue lors du statue'; $error = 1;}
    elseif($verif == 111){ return 'Une erreur est survenue lors de l\'id'; $error = 1;}
    $display = $bdd->prepare("SELECT * FROM commande WHERE id = ?");
    $display->execute(array($id));
    $fetch = $display->fetch();
    affichepost($fetch['statue'], 'Edit', 'Modifier', false, $error);
}

?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>ItsTrapp</title>

<!-- Police de la page -->
<link href='' rel='stylesheet' type='text/css'>
<link href='' rel='stylesheet' type='text/css'>

<!-- Chargement des styles -->
<link href="css/bootstrap.css" rel="stylesheet" type="text/css">
<link href="css/style.css" rel="stylesheet" type="text/css">
<link href="css/font-awesome.css" rel="stylesheet" type="text/css">
<link href="css/responsive.css" rel="stylesheet" type="text/css">
<link href="css/animate.css" rel="stylesheet" type="text/css">

<!-- Chargement du JS -->

<script type="text/javascript" src="js/jquery.1.8.3.min.js"></script>
<script type="text/javascript" src="js/bootstrap.js"></script>
<script type="text/javascript" src="js/jquery-scrolltofixed.js"></script>
<script type="text/javascript" src="js/jquery.easing.1.3.js"></script>
<script type="text/javascript" src="js/jquery.isotope.js"></script>
<script type="text/javascript" src="js/wow.js"></script>
<script type="text/javascript" src="js/classie.js"></script>
<script type="text/javascript" src="js/typed.js"></script>
<script type="text/javascript">
$(document).ready( function () {
    // On cache les sous-menus :
    $(".navigation ul.subMenu").hide();
    // On sélectionne tous les items de liste portant la classe "toggleSubMenu"

    // et on remplace l'élément span qu'ils contiennent par un lien :
    $(".navigation li.toggleSubMenu span").each( function () {
        // On stocke le contenu du span :
        var TexteSpan = $(this).text();
        $(this).replaceWith('<a href="" title="Afficher le sous-menu">' + TexteSpan + '<\/a>') ;
    } ) ;

    // On modifie l'évènement "click" sur les liens dans les items de liste
    // qui portent la classe "toggleSubMenu" :
    $(".navigation li.toggleSubMenu > a").click( function () {
        // Si le sous-menu était déjà ouvert, on le referme :
        if ($(this).next("ul.subMenu:visible").length != 0) {
            $(this).next("ul.subMenu").slideUp("normal");
        }
        // Si le sous-menu est caché, on ferme les autres et on l'affiche :
        else {
            $(".navigation ul.subMenu").slideUp("normal");
            $(this).next("ul.subMenu").slideDown("normal");
        }
        // On empêche le navigateur de suivre le lien :
        return false;
    });


} ) ;
</script>
</head>
<body>

[CODE]  <?php
require('header.php');
if($_GET['edit']){ edit($_GET['edit']);}
elseif($_GET['delete']){ delete($_GET['delete']);}
elseif($_GET['add']){ addcommande();}
    ?>[/CODE]
</body>
</html>

Vous voyez y'a pas mal de function environ 2 par Update/add une seul pour le delete, vous pouvez mettre 1 pour update et add ;)

Comme vous voyez le code est assez lisible y'a pas de else/if dans tout les sens, mais vous pouvez faire mieux! mettre toutes les functions dans un fichier et vous vous retrouverez avec
PHP:
  <?php
require('header.php');
if($_GET['edit']){ edit($_GET['edit']);}
elseif($_GET['delete']){ delete($_GET['delete']);}
elseif($_GET['add']){ addcommande();}
    ?>
avec 5lignes !

Je vous déconseille de C/C ce code, car tout simplement il peux y avoir des erreurs, c'était juste pour vous montrez comment je fait dorénavant, si vous avez des questions voir même des astuces je suis preneur :p
 
Dernière édition:

WhiiTe'

Administateur
Ancien staff
Inscription
22 Octobre 2011
Messages
14 704
Réactions
8 499
Points
32 425
C'est comme en MVC non en gros? x) Tu as tes fichiers avec les functions et une autre avec l’exécution des fonctions etc.. :mmh:
 

tete0148

Membre
Inscription
10 Février 2013
Messages
5
Réactions
1
Points
2 296
Je ne trouve pas que ce soit une bonne façon d'écrire son code.
Le code n'est déjà pas indenté d'une façon très lisible:
Les conditions sur la même ligne c'est pas trop ça. Il faut une instruction par ligne normalement, et indenter le bloc de la condition.

Ensuite l'utilisation de fonctions comme ça c'est pas non plus un génie. Aujourd'hui on ferait plutôt appel à une structure MVC orientée objet, avec, pour moi, l'utilisation de DAOs (Data Access Object) et de modèle.

Comme ça on a la classe User dont on peut créer des instances qui contiennent le nom d'utilisateur, l'email, etc.
Ensuite on a la classe UserDAO qui s'occupe de récupérer, sauvegarder les utilisateurs. Elle a les méthodes find, findAll, save, delete et permet d'ajouter une couche d’abstraction entre l'accès aux données et le code de l'application.

Au niveau du code, on a plus qu'à appeler la méthode find d'une instance de UserDAO (qui peut être un singleton) en passant en paramètre l'id par exemple, et on récupérera une instance de l'utilisateur qui a cet ID.

Tu peux en apprendre plus en suivant ce lien:
 

Florian.

Premium
Inscription
8 Août 2012
Messages
4 251
Réactions
1 220
Points
14 353
Je ne trouve pas que ce soit une bonne façon d'écrire son code.
Le code n'est déjà pas indenté d'une façon très lisible:
Les conditions sur la même ligne c'est pas trop ça. Il faut une instruction par ligne normalement, et indenter le bloc de la condition.

Ensuite l'utilisation de fonctions comme ça c'est pas non plus un génie. Aujourd'hui on ferait plutôt appel à une structure MVC orientée objet, avec, pour moi, l'utilisation de DAOs (Data Access Object) et de modèle.

Comme ça on a la classe User dont on peut créer des instances qui contiennent le nom d'utilisateur, l'email, etc.
Ensuite on a la classe UserDAO qui s'occupe de récupérer, sauvegarder les utilisateurs. Elle a les méthodes find, findAll, save, delete et permet d'ajouter une couche d’abstraction entre l'accès aux données et le code de l'application.

Au niveau du code, on a plus qu'à appeler la méthode find d'une instance de UserDAO (qui peut être un singleton) en passant en paramètre l'id par exemple, et on récupérera une instance de l'utilisateur qui a cet ID.

Tu peux en apprendre plus en suivant ce lien:
C'est sur que pas grand chose peux concurrencé l'architecture MVC mais tu l'apprend pas en 1J après je donne des pti astuce puis le code est pas lisible comment ça ? Tu as les message d'erreur en haut, après j'aurais encore pu faire plus simple avec moins de code, puis pour delete add j'ai déjà une function idem pour fetch et fetchall

Mais comme tu l'as dit l'architecture MVC est top mais complexe

C'est comme en MVC non en gros? x) Tu as tes fichiers avec les functions et une autre avec l’exécution des fonctions etc.. :mmh:
Oui un peu, mais je trouve ça plus simple, après je met pas tout dans le fichier function sinon tu te perd, mais depuis que je code comme ça mon code est plus lisible tu n'as pas 600 else if que tu dois scroller 5min x)
 

WhiiTe'

Administateur
Ancien staff
Inscription
22 Octobre 2011
Messages
14 704
Réactions
8 499
Points
32 425
C'est sur que pas grand chose peux concurrencé l'architecture MVC mais tu l'apprend pas en 1J après je donne des pti astuce puis le code est pas lisible comment ça ? Tu as les message d'erreur en haut, après j'aurais encore pu faire plus simple avec moins de code, puis pour delete add j'ai déjà une function idem pour fetch et fetchall

Mais comme tu l'as dit l'architecture MVC est top mais complexe


Oui un peu, mais je trouve ça plus simple, après je met pas tout dans le fichier function sinon tu te perd, mais depuis que je code comme ça mon code est plus lisible tu n'as pas 600 else if que tu dois scroller 5min x)

Tu peux faire des fichiers différents pour chaque page comme ça x)
 
Haut