IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Commentaires

  1. Avatar de Dendrite
    • |
    • permalink
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?php
    class SPDO {
      private $PDO_instance = null;
      private $PDO_statement = null;//pour les requêtes préparées
      private static $instance = null;
      private function __construct() { 
        $this->PDO_instance = new PDO('mysql:host=localhost;port=3306;dbname=ma_base;charset=utf8','root', '', [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES   => false
        ]);  
      }  
      protected static function get_instance(){  
        if(is_null(self::$instance)){
          self::$instance = new SPDO();
        }
        return self::$instance;
      }
      //puis copie des méthodes PDO les plus fréquentes
      protected function prepare($sql){
        $this->PDO_statement = $this->PDO_instance->prepare($sql);
      }
      protected function execute(array $filters=NULL){
        $this->PDO_statement->execute($filters);
      }
      protected function fetch(){
        return $this->PDO_statement->fetch(PDO::FETCH_ASSOC);
      }
      protected function rowCount(){
        return $this->PDO_statement->rowCount();
      }
      protected function lastInsertId(){
        return $this->PDO_instance->lastInsertId();
      }
      //requête en lecture
      public static function return_array($sql, $filters=array()){
        self::get_instance()->prepare($sql);
        self::get_instance()->execute($filters);
        $return_array=array();
        while($row= self::get_instance()->fetch()){
          $return_array[]=$row;
        }
        return $return_array;
      }
      //requête en insertion, retourne l'id d'insertion
      public static function insert_into_table($sql, $filters=array()){
        self::get_instance()->prepare($sql);
        self::get_instance()->execute($filters);
        return  self::get_instance()->lastInsertId();
      }
      //n'importe quel code SQL, retourne fait ou pas
      public static function write_to_db($sql, $filters=array()){
        self::get_instance()->prepare($sql);
        self::get_instance()->execute($filters);
        return  self::get_instance()->rowCount();
      }
    }
  2. Avatar de Dendrite
    • |
    • permalink
    Pardon... c'est moi qui mets la grouille.
    Mais je voulais rester discrète en fait, un peu exprès.
    Je te mets ça ce soir.
  3. Avatar de rawsrc
    • |
    • permalink
    @Dendrite
    Désolé, mais j'ai beau être abonné à mon blog, les messages postés dans la suite des articles ne sortent pas dans mon tableau de bord. Du coup, je mets un certain temps à répondre car je ne passe pas tous les jours sur mon blog.
    Si tu veux un avis éclairé, il faudrait que tu postes le code source de ta classe d'accès à la base de données. D'ailleurs, vu que tu dis que c'est un singleton, je suis étonné de voir des appels de fonction au format statique.
  4. Avatar de Dendrite
    • |
    • permalink
    Rawsrc, j'aimerais ton opinion sur ma dernière évolution.
    Depuis longtemps, j'aime beaucoup les tutos d'emacs, et j'ai découvert cet été celui-ci :

    https://apprendre-php.com/tutoriels/...grant-pdo.html

    Du coup, j'ai revu ma librairie perso. Notamment dans les cas où je me connecte toujours à la même et seule db (ce qui n'est pas majoritaire d'ailleurs)... J'ai réécrit une classe SPDO selon ces conseils. Qu'en dis-tu ? bonne idée ? fausse bonne idée ?

    Ce qui me ravit à l'arrivée, c'est la brièveté du code des pages qui convoquent la db :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    include('../inc/autoloader.php');
    $last_id=SPDO::insert_into_table('insert ignore into strategie values (NULL, ?, ?, NULL)', array('titi','tata'));
    echo $last_id;
    $strategies=SPDO::return_array('select * from strategie order by id desc');
    echo '<pre>';
    print_r($strategies);
    echo '</pre>';
     
    $done=SPDO::write_to_db('update strategie set nom=? where nom=?', array('comique','titi'));
    echo $done;
    $strategies=SPDO::return_array('select * from strategie order by id desc');
    echo '<pre>';
    print_r($strategies);
    echo '</pre>';
    Oui, j'ai conscience d'être un peu hors sujet... mais bon... j'aime bien les hors sujets en fait.
  5. Avatar de Dendrite
    • |
    • permalink
    Salut, c'est la gamine qui prend 54 ans dans 15 jours...
    Je transfère ton blog à mon mari, matheux devant l'éternel et administrateur de db...
    Avec lui, on va étudier ta page à la loupe, p'têt ben qu'à deux cerveaux, on arrivera à en tirer bénéfice.
    Je l'ai vendu à mon mari avec l'argument "Rawsrc, c'est une tronche qui développe pour le coeur de PHP"...
    Mon service est censé passer à Symfony, comment ça me gave... mais chuuuuuuuuuut, j'ai pas le droit de le dire.
  6. Avatar de rawsrc
    • |
    • permalink
    Salut,
    Citation Envoyé par Gobble
    De mon coté, je vois le modèle comme une suite de méthode comprenant uniquement les différentes requêtes sql CRUD, la classe du modèle devant être strictement identique à l'entité de la base de donnée qu'elle gère, ses attributs correspondants aux colonnes de la table .
    C'est parce que tu n'as jamais eu besoin de sortir de ce schéma de fonctionnement. Le modèle peut être beaucoup plus vaste. Par exemple, j'ai eu à coder un jour une application scientifique avec des calculs d'une autre dimension, j'avais des classes (de la couche modèle) en charge de ces calculs, ces derniers devaient être validés par des physiciens. Mais je n'avais aucun besoin d'accéder à la base de données.

    Citation Envoyé par Gobble
    J'ai souvent tendance a gonfler mes contrôleurs de multiples méthodes qui deviennent fourre-tout, je vais méditer sur ta pratique d'isoler chaque action sur un contrôleur.
    Pour l'ajout des fonctionnalités, il est bien plus aisé de créer un fichier en charge que du nouveau traitement que d'aller modifier un contrôleur existant qui au final va devenir obèse.
    Voici la classe mère de tous mes contrôleurs :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?php
     
    declare(strict_types=1);
     
    namespace rawsrc\Core;
     
    use rawsrc\Server\{ Task, Response\Response };
     
    abstract
    class Controller
    {
        /**
         * Function that must bring a response to the current Task
         */
        abstract public function invoke();
     
        /**
         * @var Task
         */
        private $task;
     
        /**
         * @param Task $p
         */
        public function setTask(Task $p)
        {
            $this->task = $p;
        }
     
        /**
         * @return Task
         */
        public function task(): Task
        {
            return $this->task;
        }
     
        /**
         * @param Response $p
         */
        public function setResponse(Response $p)
        {
            $this->task->setResponse($p);
        }
     
        /**
         * @return Response
         */
        public function response(): ?Response
        {
            return $this->task->response();
        }
    }
  7. Avatar de rawsrc
    • |
    • permalink
    @laurentSc

    rigolo va !
  8. Avatar de Gobble
    • |
    • permalink
    Sympa, ton article.

    De mon coté, je vois le modèle comme une suite de méthode comprenant uniquement les différentes requêtes sql CRUD, la classe du modèle devant être strictement identique à l'entité de la base de donnée qu'elle gère, ses attributs correspondants aux colonnes de la table .

    Le contrôleur est un chef d'orchestre qui s'occupe de récupérer la data du modèle, la traiter au besoin par des méthodes inhérentes à celui ci (tri pour l'affichage principalement)

    J'ai souvent tendance a gonfler mes contrôleurs de multiples méthodes qui deviennent fourre-tout, je vais méditer sur ta pratique d'isoler chaque action sur un contrôleur.
  9. Avatar de laurentSc
    • |
    • permalink
    Citation Envoyé par rawsrc
    Salut les jeunes
    Autrement dit, je n'ai pas à tenir compte de ton commentaire
  10. Avatar de rawsrc
    • |
    • permalink
    Salut les jeunes,

    le plus important c'est de bien comprendre et de bien se représenter l'idée derrière cette phrase :
    L’utilité principale de la programmation objet réside dans la possibilité de représenter des éléments tangibles sous forme de concepts abstraits (équivalent à une représentation purement informatique).
    Le concept de la POO est partie d'une observation fine de notre environnement. C'est une des raison pour lesquelles l'informatique a connu un tel essor : il a été rendu possible de coller (informatiquement parlant) à la réalité assez précisément.

    Après, je dois reconnaître que ce n'est pas effectivement à la portée de tout le monde de se cogner l'apprentissage de tant de concepts seul avec un livre aussi complet soit-il.
    Bref, il faut s'accrocher car le jeu en vaut la chandelle.
  11. Avatar de laurentSc
    • |
    • permalink
    Ouaip...Ca fait des années que la POO m'attire ; le concept est intéressant et celui du MVC aussi. Le concept est facile à comprendre, mais l'implémentation de rawsrc est un peu moins accessible. J'espère encore réussir à m'en servir un jour...
  12. Avatar de Dendrite
    • |
    • permalink
    [cancre]
    Laurent, t'es un warrior, moi je dis... J'ai fait défiler l'ascenseur, et j'ai vite vu que mes sites n'avaient pas besoin de tant de perfection et technicité... et heureusement, parce que sinon je ne pourrais pas faire ce métier...
    Je n'envoie pas des fusées sur la lune...
    En attendant, un grand bravo à toi Raw, pour le boulot... sincèrement.
    [/cancre]
  13. Avatar de rawsrc
    • |
    • permalink
    Merci
    J'ai essayé de rester explicite sans m'embarquer dans des considérations techniques trop abstraites.
    J'espère que ça reste clair pour les p'tits nouveaux qui s'y frottent pour la première fois. Ce n'est pas évident de bien s'en rendre compte quand ça te paraît évident avec les années derrière.
  14. Avatar de Pierre Fauconnier
    • |
    • permalink
    Super billet

    Une belle approche théorique. J'avais déjà goûté du MVC en php avec un tuto amenant à la création d'un framework php, mais ton approche complète le tuto de façon magistrale.
  15. Avatar de laurentSc
    • |
    • permalink
    Je me réponds à moi-même :

    dans index.php : use _classes\rep_classes\MaClasse1; et dans MaClasse1.php : namespace _classes\rep_classes;
  16. Avatar de laurentSc
    • |
    • permalink
    autre souci ce matin : j'ai 3 fois l'erreur suivante :
    Undefined offset: 1 in C:\wamp64\www\mvc_rawsrc\src\Utilisateur\Utilisateur.php on line 34
    Cette ligne est 'route' => function(Request $p) { return $p->path()[1] === 'login'; },. Qu'en penses-tu ?
  17. Avatar de laurentSc
    • |
    • permalink
    Citation Envoyé par rawsrc
    Il faut que tu regardes tes concepts et actions déclarées.
    J'ai rien déclaré ; j'ai juste essayé d'exécuter ton code. Où ça se passe, ces déclarations ?
  18. Avatar de rawsrc
    • |
    • permalink
    Ouaip, je n'ai pas pris la bonne version, j'ai empaqueté une version avec ce bug de tableau qui traînait.
    Ça m'apprendra à le faire à plus d'une heure du mat. Je vais republier les sources.

    Pour ce qui est de ton problème, si tu atterris sur cette réponse c'est que le dispatch n'a pas trouvé une action correspondante à la requête envoyée au serveur.
    Il faut que tu regardes tes concepts et actions déclarées.
  19. Avatar de laurentSc
    • |
    • permalink
    Merci pour ta réponse rawsrc. Je vais continuer à essayer.

    Par contre, si j'essaye d'exécuter ton code, j'obtiens une bizarrerie : d'abord, il a râlé car dans une fonction il attendait un array et il recevait une string ; j'ai corrigé (vendor/rawsrc/Task.php ligne 139) :
    $this->response = new Response('Unable to manage the request', ['400 Bad Request']); à la place de

    $this->response = new Response('Unable to manage the request', '400 Bad Request'); mais au lieu de m'afficher le formulaire de login (probablement), il m'affiche
    Unable to manage the request
    Y a un problème, non ?
  20. Avatar de rawsrc
    • |
    • permalink
    Salut laurentSC,

    Merci, j'ai précisé la version du PHP dans le titre.
    Effectivement, ce n'est pas simple à aborder car il y a deux problématiques simultanées : le paradigme de la programmation orientée objet et le concept MVC à proprement parler.
    Forcément, il faut se lever de bonne heure pour ingurgiter le tout.

    J'ai réduit mon cas pratique au strict minimum, juste une page d'accueil et un formulaire de connexion, aucune fioriture pour bien distinguer les étapes et éléments de programmation.

    Apprendre à maîtriser ces 2 concepts est fort utile. Le mieux que je puisse te conseiller c'est de refaire des croquis pour voir et suivre le déroulé du code, histoire de voir comment tout s'emboîte et fonctionne de concert.

    Je vais essayer de poster un schéma récapitulatif
Page 3 sur 4 PremièrePremière 1234 DernièreDernière