Commentaires

  1. Avatar de rawsrc
    • |
    • permalink
    Salut moimp,

    Citation Envoyé par moimp
    Salut les développeurs, après deux billets de blog assez ardus (je dois le reconnaître), aujourd'hui on va aller dans la simplicité et surtout dans une extrême utilité : je vais vous présenter un petit moteur de rendu PHP (j'aurais précisé ce que c’est ?) de ma conception qui est bâti que sur une seule et unique classe : la programmation orientée objet réduite à sa plus simple expression.
    Comme c'est une introduction, je n'allais pas partir dans des explications techniques qui sont abordées de toute façon juste après.

    Citation Envoyé par moimp
    ne tolère aucun oubli dans les échappements : J'aurais précisé htmlspecialchars.
    htmlspecialschars() ou htmlentities ou urlencode ou rawurlencode... des échappements il en existe un paquet.

    Citation Envoyé par moimp
    il est rare que l'on qu'on laisse les attributs publics.
    Euphonie.

    Citation Envoyé par moimp
    Dans ce code notez l'utilisation de $this, comme on fait des inclusions, $this représente une instance de la classe PhpEcho, du coup on a à disposition les fonctionnalités offertes par celle-ci (regardez le code source de la fonction __toString() pour bien comprendre l'origine de $this).
    Là, malgré tes explications, je ne suis pas sûr de bien comprendre en quoi le fait de faire une inclusion, permet de récupérer le texte de l’instance. Si tu peux, il serait peut-être nécessaire de préciser davantage.
    Ok, je vais expliquer un peu plus en détail.

    Citation Envoyé par moimp
    $body = new PhpEcho([DIR_ROOT, 'view LoginForm.php']
    Il y a une erreur (espace entre view et LoginForm.php)
    Non c'est totalement voulu, regarde le code de la méthode setFile(), les espaces sont automatiquement transformés en DIRECTORY_SEPARATOR. Lis aussi la tartine PhpDoc juste au-dessus.

    J'ai corrigé les fautes et autres étourderies. Merci.

    Citation Envoyé par moimp
    De toute façon, merci encore pour cet excellent boulot. Je pense que je vais utiliser ton travail.
    Bon courage donc
  2. Avatar de moimp
    • |
    • permalink
    Pour laurentSc, tu as raison, je ne suis pas exempt, non plus. Compte tenu de tes remarques et des erreurs déjà corrigées, mes suggestions deviennent en grande partie du pinaillage. Je les donne quand même:

    Salut les développeurs, après deux billets de blog assez ardus (je dois le reconnaître), aujourd'hui on va aller dans la simplicité et surtout dans une extrême utilité : je vais vous présenter un petit moteur de rendu PHP (j'aurais précisé ce que c’est ?) de ma conception qui est bâti que sur une seule et unique classe : la programmation orientée objet réduite à sa plus simple expression.



    Pour suivre notre exemple, il est tout à fait sensé à ce que la vue en charge de rendre fournir un message attende un tableau de valeurs de ce genre :



    ne tolère aucun oubli dans les échappements : J'aurais précisé htmlspecialchars.



    La contrepartie c'est quoi qu'on en dise, En contrepartie, quoi qu’on en dise,



    il est rare que l'on qu'on laisse les attributs publics.



    Maintenant, vous voulez compter le nombre d'éléments définis dans votre instance de classe comme si s'était un tableau, pas de problème, l'interface Countable est là pour ça :



    Enfin juste pour finir, il est possible de bloquer le contexte défini par new, si par exemple vous ne souhaitez pas que la classe soit instanciée (cas du Singleton) en rendant la méthode magique privée



    Dans ce code notez l'utilisation de $this, comme on fait des inclusions, $this représente une instance de la classe PhpEcho, du coup on a à disposition les fonctionnalités offertes par celle-ci (regardez le code source de la fonction __toString() pour bien comprendre l'origine de $this).
    Là, malgré tes explications, je ne suis pas sûr de bien comprendre en quoi le fait de faire une inclusion, permet de récupérer le texte de l’instance. Si tu peux, il serait peut-être nécessaire de préciser davantage.



    $body = new PhpEcho([DIR_ROOT, 'view LoginForm.php']
    Il y a une erreur (espace entre view et LoginForm.php)


    De toute façon, merci encore pour cet excellent boulot. Je pense que je vais utiliser ton travail.
  3. Avatar de laurentSc
    • |
    • permalink
    Bonsoir à tous,

    merci pour ton boulot rawsrc.

    d'abord, amusant la remarque de moimp sur les fautes de français car quand il écrit "je ne suis pas encore aller au bout", y a aussi une faute ! ("allé", pas "aller")...

    Bon, je viens de terminer ma première lecture. Je compte en faire une 2e demain, puis d'essayer d'utiliser PhpEcho. Mais merci pour ce billet clair car mon niveau de compréhension est à peu près équivalent à celui de Dendrite. Et même remarque : je découvre l'implémentation de classes natives ; très instructif.
    Mis à jour Aujourd'hui à 10h19 par laurentSc
  4. Avatar de rawsrc
    • |
    • permalink
    Salut moimp

    je trouve ta critique sur le MVC infondée, tu peux tout à fait utiliser PhpEcho en dehors du l'approche MVC. Dans notre exemple on isole la vue du reste, mais ce n'est nullement obligatoire, tu peux très bien tout mélanger. Ce n'est pas conseillé, je te l'accorde mais cela n'est pas interdit. Personnellement, je sépare naturellement les éléments quand je code, c'est sans réfléchir comme un réflexe. Alors je n'ai pas trop prêté attention. C'est une très bonne approche pour survivre dans la programmation : Diviser pour mieux régner.

    Pour les autres critiques, poste tout ici même.

    Et enfin pour ce qui est du MVC, je t'invite à visiter mon blog DVP, tu y trouveras du grain à moudre
  5. Avatar de moimp
    • |
    • permalink
    Bonjour à tous,

    Tout d'abord merci pour ce travail.

    Malheureusement, on sent que ce billet a été écrit "à la va vite". En effet, tu ne définis pas ce qu'est un moteur de rendu. Tu ne fais pas allusion à la structure MVC et il faut entrer dans le détail pour savoir que cet article peut nous intéresser. J'ai également vu au passage des imprécisions et des fautes de Français.
    A ceci près, je ne suis pas encore aller au bout mais ce que j'ai vu m'intéresse.
    A l'occasion, j'approfondirai et te ferai une critique plus précise et plus constructive. Faut-il te les envoyer en commentaires ou en messages privés?
    Mis à jour 12/10/2019 à 18h25 par moimp
  6. Avatar de rawsrc
    • |
    • permalink
    Salut Dendrite

    85% de compris à la première lecture ! Ouf (pour moi)
    En tout cas, ça fait plaisir à lire car pour en arriver à ce score, j'ai mis plus d'une journée de rédaction et de mise en forme.
    C'est pas évident de se mettre à la place d'un débutant derrière son clavier surtout quand tu ne sais pas où les difficultés se situent.
    Je ne vois pas encore les têtes des lecteurs derrière leur écran à la lecture de tel ou tel paragraphe

    C'est parfait si tu l'utilises pour un petit projet perso.

    De mon côté et pour la petite histoire, c'est une version très simplifiée d'un moteur de rendu que j'ai créé en 2009 et qui s'appelle Rerender. Il offre des fonctionnalités aussi simples que celles de PhpEcho à côté d'autres beaucoup plus avancées comme : la gestion de widgets, de contexte d'exécution, l'injection dynamique et la création de helpers, dérivation de template... Comme pour PhpEcho, aucune nouvelle syntaxe à apprendre, juste du PHP basique (tout orienté objet, il va de soi) et le tout tient en 10 fichiers .php
  7. Avatar de Dendrite
    • |
    • permalink
    Bonjour Raw et merci pour le partage.
    Je vais surtout te remercier pour ce bel effort de simplicité. Je comprends 85% de l'article à la première lecture, c'est que c'est gagné.
    Tu as eu entièrement raison de séparer totalement tous les pré-requis puis de nous proposer ton code de classe non truffé de commentaires.
    C'est plus agréable.
    Je découvre grâce à tes préambules que l'on peut implémenter des librairies natives de PHP.
    Je vais tenter d'adopter ta classe pour mon site perso justement, my-memo... Un mini-twig en quelque sorte... Je suis trop contente.
    Et je reviens vers toi dans quelques temps, pour te faire le feedback. Ne t'inquiète pas si c'est long.
  8. Avatar de SergioMaster
    • |
    • permalink
    Après avoir testé sous Ubuntu (cela fonctionne ) mais j'ai procédé à quelques changements au niveau du traitement de l'image, mise en ressource cela m'évite de déployer le fichier fleche.png ainsi que les problèmes de chemin de chargement c'est donc tout bénéfice.

    Code : 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
    procedure TBonus.ListViewMenuUpdateObjects(const Sender: TObject;
      const AItem: TListViewItem);
    //  NOTE
    // il serait mieux de ne charger qu'une seule fois la ressource dans un Stream
    // de même s'il s'agit d'un fichier
    // d'où "l'avantage" de la liste d'image quoique, si l'on utilise un MultiResBitmap on se retrouvera dans le même cas
    var aStream: TResourceStream;
    begin
    // Chargement d'une ressource
    if AItem.Purpose=TListItemPurpose.Header then
      begin
         aStream := TResourceStream.Create(HInstance,'fleche',RT_RCDATA);
          try
            AItem.Objects.ImageObject.Bitmap.LoadFromStream(aStream);
         finally
           aStream.Free;
        end;
    // Chargement fichier "externe"
    //    AItem.Objects.ImageObject.Bitmap.LoadFromFile('..\..\fleche.png');
    // Utilisation TImageList
    //    AItem.Objects.ImageObject.Bitmap:=ImageList1.Bitmap(TSizeF.Create(32,32),0);
      end;
    end;
    Ces changements ont été répercutés dans le zip.
  9. Avatar de SergioMaster
    • |
    • permalink
    Intéressante mais sera-t-elle pérenne ?
    À la faute dans l'introduction, j'ai penne peine à le croire
  10. Avatar de Dendrite
    • |
    • permalink
    Youpi, merciiiiiiiiiiiii !
    Je travaille tout ça au boulot, et hop, je reviens vers toi pour te dire si ça tourne comme j'aime.
    Fin du hors sujet !
  11. Avatar de rawsrc
    • |
    • permalink
    Salut Dendrite,

    ton approche n'est pas bonne, ta classe n'utilise que 2% de ce qu'offre la classe PDO. Tu limites à mort les fonctionnalités et tu ne te sers que pour ouvrir une connexion. C'est léger !
    Si tu veux profiter pleinement de PDO partout où tu en as besoin sans avoir à trimbaler les paramètres de connexion :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Cnx
    extends \PDO
    {
        private static $pdo;
     
        public function __construct()
        {
            if (self::$pdo === null) {
                self::$pdo = new \PDO('mysql:host=localhost;port=3306;dbname=nom_base_de_donnees;charset=utf8', 'root', 'mot_de_passe');
            }
            return self::$pdo;
        }
    }
    ensuite si tu as plein de connexions (un pool) tu peux très bien te servir d'une classe qui stocke, distribue et ouvre les connexions à la demande, pour cela il suffit que chaque connexion ait un identifiant unique.

    Voici une classe que j'utilise (je ne t'ai pas mis tout les dépendances mais tout le concept est là) :
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    <?php
    
    declare(strict_types=1);
    
    namespace Database;
    
    use Config\Configurator;
    use Error\EECollector;
    
    /**
     * Classe regroupant les services relatifs et spécifiques à une ou plusieurs connexions à des base de données
     */
    class Service
    {
        /**
         * Tableau des services de base de données
         * La clé pdo n'existe que si une connexion a été établie avec succès
         *
         * @var array [id => [pdo, config_group, params => [scheme, host, database, user, pwd, port, attemps, timeout]]]
         */
        private static $pool = [];
    
        /**
         * Ajoute un service de base de données identifié par un id unique
         *
         * @param string    $id             Identifiant unique du service
         * @param \PDO      $pdo
         */
        public static function addPdo(string $id, \PDO $pdo)
        {
            self::$pool[$id] = ['pdo' => $pdo];
        }
    
        /**
         * Ajoute un service de base de données dont les paramètres sont définis
         * dans le fichier principal de configuration de l'application
         *
         * @param string    $id                 Identifiant unique du service
         * @param string    $group              Identifiant du groupe de paramètres dans le fichier de configuration => ce qui est entre crochets dans le .ini
         * @param array     $others             [key => value] Paramètres supplémentaires à passer dans la chaine de connexion à la base de données
         */
        public static function addFromConfigFile(string $id, string $group, array $others = [])
        {
            self::$pool[$id] = ['config_group' => $group, 'others' => $others];
        }
    
        /**
         * Ajoute un service de base de données dont les paramètres sont définis manuellement
         *
         * @param string $id             Identifiant unique du service
         * @param string $scheme
         * @param string $host
         * @param string $database
         * @param string $user
         * @param string $pwd
         * @param string $port
         * @param string $attempts
         * @param string $timeout
         * @param array  $others         à passer dans la chaine de connexion à la base de données
         */
        public static function addManualParams(
            string $id, string $scheme, string $host, string $database, string $user, string $pwd, string $port,
            string $attempts = '3', string $timeout = '5', array $others = [])
        {
            self::$pool[$id] =  [
                'others'    => $others,
                'params'    => [
                    'scheme'    => $scheme,
                    'host'      => $host,
                    'database'  => $database,
                    'user'      => $user,
                    'pwd'       => $pwd,
                    'port'      => $port,
                    'attempts'  => $attempts,
                    'timeout'   => $timeout
                ]
            ];
        }
    
        /**
         * Renvoie une connexion PDO
         * Si connexion inexistante, elle sera établie automatiquement en fonction du paramétrage
         *
         * @param  string           $id Identifiant unique du service
         * @return \PDO |EECollector
         */
        public static function pdo(string $id)
        {
            if (isset(self::$pool[$id])) {
                return self::$pool[$id]['pdo'] ?? self::open($id);
            } else {
                return new EECollector();
            }
        }
    
        /**
         * Ouvre une connexion vers une base de données
         *
         * @param string $id Identifiant unique du service
         * @return \PDO |EECollector
         */
        private static function open(string $id)
        {
            $service       = self::$pool[$id];
            $driver_params = $service['others'] ?? [];
    
            if (isset($service['config_group'])) {
                // extraction des paramètres du fichier de configuration
                $params = Configurator::group($service['config_group']);
    
                if ($params instanceof EECollector) {
                    return $params;
                }
    
                // driver_params provenant du fichier de configuration : clés différentes des clés communes
                $common_keys    = array_flip(['scheme', 'host', 'database', 'user', 'pwd', 'port', 'timeout', 'attempts']);
                $driver_params += array_diff_key($params, $common_keys);
    
                return self::connect(
                    $id,
                    $params['scheme'],
                    $params['host'],
                    $params['database'],
                    $params['user'],
                    $params['pwd'],
                    $params['port'],
                    $params['timeout'],
                    $params['attempts'],
                    $driver_params
                );
            } elseif (isset($service['params'])) {
                // paramètres manuels
                return self::connect(
                    $id,
                    $service['params']['scheme'],
                    $service['params']['host'],
                    $service['params']['database'],
                    $service['params']['user'],
                    $service['params']['pwd'],
                    $service['params']['port'],
                    $service['params']['timeout'],
                    $service['params']['attempts'],
                    $driver_params
                );
            }
        }
    
        /**
         * @param  string $id             Identifiant unique du service
         * @param  string scheme          Ex: mysql pgsql...
         * @param  string $host           Adresse IP du serveur
         * @param  string $database       Nom de la base de données
         * @param  string $user           Nom de l'utilisateur
         * @param  string $pwd            Mot de passe de la connexion
         * @param  string $port           Numéro du port pour la connexion
         * @param  string $timeout        Délai d'attente réponse serveur
         * @param  string $attempts       Nombre d'essais de reconnexion
         * @param  array  $driver_params  Array(key => value) Paramètres additionnels à passer à l'ouverture de la connexion
         * @return \PDO |EECollector
         */
        private static function connect(string $id, string $scheme, string $host, string $database, string $user,
                                        string $pwd, string $port, string $timeout, string $attempts, array $driver_params)
        {
            $dsn = "{$scheme}:host={$host};dbname={$database};";
    
            if ((int)($port)) {
                $dsn .= "port={$port};";
            }
    
            $dsn .= "connect_timeout={$timeout};";
    
            if ( ! empty($driver_params)) {
                $dsn .= implode(';', $driver_params).';';
            }
    
            $eec = new EECollector();
    
            // essais d'ouverture de connexion
            for ($i = 0; $i < $attempts; ++$i) {
                try {
                    $dbh = new \PDO($dsn, $user, $pwd, [
                        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
                        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
                        \PDO::ATTR_EMULATE_PREPARES   => false
                    ]);
                    self::$pool[$id]['pdo'] = $dbh;
                    return $dbh;
                } catch (\PDOException $e) {
                    $eec->addException($e);
                }
            }
            return $eec;
        }
    }
  12. Avatar de laurentSc
    • |
    • permalink
    Bon, Laurent, tu nous fais quand un petit article pour nous montrer un domaine où tu te sens musclé ? J'ai hâte de te lire !
    Ca va être rapide, vu qui y en pas !

    mais c'est pro, et c'est tout ce que je cherche, des durs à cuire du code
    Moi, je dirais des cadors ou des pointures...
  13. Avatar de Dendrite
    • |
    • permalink
    Bon, Laurent, tu nous fais quand un petit article pour nous montrer un domaine où tu te sens musclé ? J'ai hâte de te lire !
    A+.
    Sinon, moi, même respect que toi pour les forums DVP... C'est parfois un peu sec, mais c'est pro, et c'est tout ce que je cherche, des durs à cuire du code.
  14. 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();
      }
    }
  15. Avatar de WuKoDLaK
    • |
    • permalink
    [supprimé et édité dans le fil du forum par commodité]
    Mis à jour 28/09/2019 à 17h13 par WuKoDLaK
  16. 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.
  17. Avatar de chrtophe
    • |
    • permalink
    Il est toujours possible de faire autre chose que du VBA pour piloter Excel, tout comme un droitier peut écrire avec la main gauche, mais c'est pas ce qui a de plus pratique ni efficace.
  18. Avatar de Pierre Fauconnier
    • |
    • permalink
    Clément n'a pas encore compris que "l'establishment", comme il dit (c'est à dire moi, en l'occurence), demande simplement que sur un forum VBA, on donne des solutions VBA et pas des solutions VB.NET. Il n'a pas encore compris non plus que n'importe qui n'est pas en mesure (technique, administrative, ...) d'installer une solution vb.net sur des postes en entreprise, ni que la portabilité d'une solution vb.net sur un fichier excel n'égalait en rien le VBA.

    Je pense que la compréhension de ces simples principes est à la portée d'un gamin de 4 ans. Mais bon, chacun son trip ou son "don Quichotte"...
  19. 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.
  20. 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.
Page 1 sur 2 12 DernièreDernière