Page 1 sur 1

Optimisation CRUD

Posté : 26 déc. 2014, 15:40
par DarKnight
Bonjour j'ai effectué un CRUD avec un tuto mais je voudrai savoir si il y a possibilité de l'optimiser au mieux, pour cela j'ai créer une classe objet pour la connection PDO, fait des require_once du header et footer HTML mais pour le reste je bloque. Le crud est sur une table "user" avec comme champs ID, lastname, firstname, email, birthday, dois je faire une classe user aussi, puis j'ai une redondance de condition dans plusieurs fichier mais bon je vous montre cela voila

database.php
<?php
class Database
{
    private static $dbName = 'pandacraft' ;
    private static $dbHost = 'localhost' ;
    private static $dbUsername = 'root';
    private static $dbUserPassword = 'root';
     
    private static $cont  = null;
     
    public function __construct() {
        die("Erreur d'init");
    }
     
    public static function connect()
    {
       if ( null == self::$cont )
       {     
        try
        {
          self::$cont =  new PDO( "mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword); 
        }
        catch(PDOException $e)
        {
          die($e->getMessage()); 
        }
       }
       return self::$cont;
    }
     
    public static function disconnect()
    {
        self::$cont = null;
    }
}
?>
newUser.php
<?php
     
   require 'database.php';
 
   function verifierAdresseEmail($sEmail)
  {
    $sMotif = '`^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-.]?[[:alnum:]])*\.([a-z]{2,4})$`';
    $bCorrect = false;
    
    if(preg_match($sMotif,$sEmail))
    {
      $bCorrect = true;
    }
    
    return $bCorrect;
  }
  
  function verifBirth($vBirth)
  {
    $sMotif = '`\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$`';
    $bCorrect = false;
    
    if(preg_match($sMotif,$vBirth))
    {
      $bCorrect = true;
    }
    
    return $bCorrect;
  }

    if ( !empty($_POST)) {
        
        $lastNameError = null;
        $firstNameError = null;
        $emailError = null;
        $birthError = null;
         
        extract($_POST);
        $valid = true;
        
        if (empty($lastName)) {
            $lastNameError = "Vous n'avez pas rempli votre nom.";
            $valid = false;
        }
        
        if (empty($firstName)) {
            $firstNameError = "Vous n'avez pas rempli votre prénom.";
            $valid = false;
        }
         
        if (empty($email)) {
            $emailError = "Vous n'avez pas rempli votre e-mail.";
            $valid = false;
        } else if (!verifierAdresseEmail($email)) {
            $emailError = "Veuillez renseigner une adresse mail valide";
            $valid = false;
        }
         
        if (empty($birth)) {
            $birthError = "Vous n'avez pas rempli votre date de naissance.";
            $valid = false;
        } else if (!verifBirth($birth)) {
            $birthError = "Vous avez renseigné une date non valide, Usage: AA-MM-JJ ou AA/MM/JJ" ;
            $valid = false;
        }
         
        if ($valid) {
            $pdo = Database::connect();
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "INSERT INTO user (lastname, firstname, email, birthday) VALUES ('$lastName', '$firstName', '$email', '$birth')";
            $q = $pdo->prepare($sql);
            $q->execute(array($lastName, $firstName, $email, $birth));
            Database::disconnect();
            header("Location: index.php");
        }
    }
 
$page_title = "Création d'un nouvel utilisateur";
include_once "header.php"; 
$form_title = "Ajouter à la base de donnée";
$boutton = "Créer";
$action_form = "newUser.php";
include_once "user.php";  
include_once "footer.php";
?>
updateUser.php
<?php 

	require 'database.php';
	 
	   function verifierAdresseEmail($sEmail)
	  {
		    $sMotif = '`^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-.]?[[:alnum:]])*\.([a-z]{2,4})$`';
		    $bCorrect = false;
		    
		    if(preg_match($sMotif,$sEmail))
		    {
		      $bCorrect = true;
		    }
		    
		    return ($bCorrect);
	  }
	  
	  function verifBirth($vBirth)
	  {
		    $sMotif = '`\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$`';
		    $bCorrect = false;
		    
		    if(preg_match($sMotif,$vBirth))
		    {
		      $bCorrect = true;
		    }
		    
		    return ($bCorrect);
	  }
	
		$id = null;
	    if ( !empty($_GET['id']))
	    {
	        $id = $_REQUEST['id'];
	    }
	     
	    if ( null==$id ) 
	    {
	        header("Location: index.php");
	    }

	    if ( !empty($_POST)) 
	    {
	    	    
	        $lastNameError = null;
	        $firstNameError = null;
	        $emailError = null;
	        $birthError = null;
	         
	        extract($_POST);
	        $valid = true;
	        
	        if (empty($lastName)) 
	        {
	            $lastNameError = "Vous n'avez pas rempli votre nom.";
	            $valid = false;
	        }
	        
	        if (empty($firstName)) 
	        {
	            $firstNameError = "Vous n'avez pas rempli votre prénom.";
	            $valid = false;
	        }
	         
	        if (empty($email)) 
	        {
	            $emailError = "Vous n'avez pas rempli votre e-mail.";
	            $valid = false;
	        } else if (!verifierAdresseEmail($email)) 
	        {
	            $emailError = "Veuillez renseigner une adresse mail valide";
	            $valid = false;
	        }
	         
	        if (empty($birth)) 
	        {
	            $birthError = "Vous n'avez pas rempli votre date de naissance.";
	            $valid = false;
	        } else if (!verifBirth($birth)) 
	        {
	            $birthError = "Vous avez renseigné une date non valide, Usage: AA-MM-JJ ou AA/MM/JJ" ;
	            $valid = false;
	        }
	         
	        if ($valid) 
	        {
	            $pdo = Database::connect();
	            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	            $sql = "UPDATE user  set lastname = ?, firstname = ?, email =?, birthday = ? WHERE id = ?";
	            $q = $pdo->prepare($sql);
	            $q->execute(array($lastName, $firstName ,$email ,$birth, $id));
	            Database::disconnect();
	            header("Location: index.php");
			}	
		}else 
		 {
         $pdo = Database::connect();
         $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         $sql = "SELECT * FROM user where id = ?";
         $q = $pdo->prepare($sql);
         $q->execute(array($id));
         $data = $q->fetch(PDO::FETCH_ASSOC);
         $lastName = $data['lastname'];
         $firstName = $data['firstname'];
         $email = $data['email'];
         $birth = $data['birthday'];
         Database::disconnect();
		 } 
		 
$page_title = "Création d'un nouvel utilisateur";
include_once "header.php"; 
$form_title = "Modification d'une donnée dans la base";
$boutton = "Mettre à jour";
$action_form ="updateUser.php?id=";
include_once "user.php";   
include_once "footer.php";
?>
voila merci pour vos retour et vos conseils, si j'ai codé comme un porc dit le moi toute critique est bonne à prendre !!!!

Re: Optimisation CRUD

Posté : 26 déc. 2014, 23:10
par Nestecha
Le mieux pour optimiser ici c'est d'être logique.

Tu as créé une classe pour la connexion, mais pas pour user, pourquoi ?
Ensuite t'as segmenté les parties, entre newuser, header, footer etc, pourtant tu inscris de la logique pure dans une vue ?

Ce que je veux dire, c'est que tu aurais pu créer un fichier contenant tes fonctions que tu aurais inclu, et tu aurais ainsi éviter la redondance (avec ca + la classe user). Donc tu gagnes de l'espace. Et en gros dans la page newUser, ta structure ce serait plutot :
-header
-si function allVerifs alors new user avec toutes les infos
- footer

Ca t'auras pris 6 lignes grand Max meme si apres tu peux afficher autant de HTML que tu veux.

Tu gagneras aussi beaucoup à faire cela pour la suite de ton code qui sera bien plus simple et rapide à écrire. Pour aller plus loin regarde du côté de l'architecture MVC.

Re: Optimisation CRUD

Posté : 27 déc. 2014, 12:42
par moogli
Salut,

Ta classe de connexion n'a pas grand intérêt, hors mis peux être si tu veux appliquer une patron factory.
Exemple php :
http://www.lafabriquedecode.com/blog/20 ... od-en-php/
http://openclassrooms.com/courses/progr ... n-patterns

Le Die dans le constructeur c'est une mauvaise idée.
Utilise le pattern singleton si tu veux. Le constructeur doit être privé.

Tu utilise mal PDO, soit tu prépare la requête avec des marqueurs (nommé ou pas) soit tu utilise, comme tu le fais, directement les variable dedans (par contre la c'est sensible aux injections sql).

Comme déjà indiqué un mvc te permettrais de mieux mutualiser ton code et d'exploiter un modèle poo complet.
Dans ce cas une classe user, une classe "userDao" (pour l'accès aux données) tu as ton modèle.
Une classe pour le contrôleur et pourquoi pas une pour gérer les vue.
Ainsi tu sépare la logique d'affichage de la logique de gestion des données (vérification d'une adresse email', null, ou vide etc.) du code de stockage des données.

Tu pourras ainsi te rapprocher un crud (voir d'un SCRUD en incluant le select) très simplement (la DAO possède cinq méthodes, une part besoin).
Tu passe un objet user entre chaque couche (ou un tableau de user pour le select) et tu auras bien séparé les couches ;)


@+

Re: Optimisation CRUD

Posté : 27 déc. 2014, 18:29
par darknight
Ola vous êtes dans le coté obscure de la force :-) j'ai un peu de mal avec ce que vous essayé de m'expliquer (MVC etc tout cela reste encore un peu abstrait),

Sinon pour ce block de de if comment pourrai-je en faire une seul fonction sachant quel doit renvoyer un bool mais aussi les différentes variable a afficher ainsi que les message d'erreur... Peut être que la classe user prend ca necessité ici mais pareil un peu de mal avec l'objet.
   require 'database.php';
   require 'verif.php';
  

    if ( !empty($_POST)) {
        
        $lastNameError = null;
        $firstNameError = null;
        $emailError = null;
        $birthError = null;
         
        extract($_POST);
        $valid = true;
        
        if (empty($lastName)) {
            $lastNameError = "Vous n'avez pas rempli votre nom.";
            $valid = false;
        }
        
        if (empty($firstName)) {
            $firstNameError = "Vous n'avez pas rempli votre prénom.";
            $valid = false;
        }
         
        if (empty($email)) {
            $emailError = "Vous n'avez pas rempli votre e-mail.";
            $valid = false;
        } else if (!verifierAdresseEmail($email)) {
            $emailError = "Veuillez renseigner une adresse mail valide";
            $valid = false;
        }
         
        if (empty($birth)) {
            $birthError = "Vous n'avez pas rempli votre date de naissance.";
            $valid = false;
        } else if (!verifBirth($birth)) {
            $birthError = "Vous avez renseigné une date non valide, Usage: AA-MM-JJ ou AA/MM/JJ" ;
            $valid = false;
        }
         
        if ($valid) {
            $pdo = Database::connect();
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "INSERT INTO user (lastname, firstname, email, birthday) VALUES ('$lastName', '$firstName', '$email', '$birth')";
            $q = $pdo->prepare($sql);
            $q->execute(array($lastName, $firstName, $email, $birth));
            Database::disconnect();
            header("Location: index.php");
        }
    }

Re: Optimisation CRUD

Posté : 28 déc. 2014, 23:11
par moogli
Exemple de requête préparée correcte : http://php.net/manual/fr/pdo.prepare.php

pour ce qui est de la gestion d'erreur utilise un try / catch pour récupérer l'exception http://php.net/manual/fr/language.exceptions.php

@+