Consultez la formation SEO spéciale Wordpress
par WebRankInfo / Ranking Metrics

Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Ven Déc 16, 2016 17:48

Bonjour niap

Je voulais faire en camelCase avec une minuscule au début, mais les fonctions avec "bind" auraient ressemblé à :

fillBindParam($array_values), myBindParam(void) et deleteBindParam(void)

C'est ok ?

Et les variables entièrement en minuscules ?

Super merci pour votre aide. ;)

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Ven Déc 16, 2016 18:27

Rebonjour

Je vais arranger ma fonction parse_mysql($sql), en extrayant les noms de tables et les colonnes.

Ainsi, les masques destinés aux fonctions *BindParam() seront fiables et complets.

Je montrerai le résultat dès que j'aurai terminé.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Sam Déc 17, 2016 11:04

Hello

Je butte sur un problème conceptuel.

A propos des MyPrepare($sql) :

Après chaque MyPrepare($sql), il faut mémoriser les masques destinés aux MyBindParam($array_values).

Mais... Cette fonction MyPrepare($sql), ( qui se charge de lancer le prepare($sql_prepare) réel ) , peut très bien être lancée à l'extérieur de toute boucle interne.

Et... Les MyBIndParam($array_values) ne peuvent être lancées qu'à l'intérieur de chaque boucles internes.

Le problème, consiste à faire le lien entre les masques ( private ), produits par MyPrepare(), et leurs utilisations dans MyBindParam($array_values).

Comment ( dans la classe Database ), identifier puis relier ces deux données de masques , en amont en aval ?

Pour rappel, un masque serait une array du type :

Code: Tout sélectionner

  $array_values["TABLE1.COLUMN_1" => $value_1,
                      "TABLE1.COLUMN_2" => $value_2,
                     etc...
                     "TABLE2.COLUMN_x" => $value_x,
                     etc...
        ]



La prise en compte de ce paramètre, ne peut être que transparente.

Si un MyPrepare($sql), incrémente un compteur auquel sont rattachés les masques, comment ( sur le plan programmatique ), savoir quel est le bon masque ( bon compteur ), pour le traitement des masques par MyBindParam($array_values) ?

Normalement, celà ne pourrait être fait ( mémorisé ), que par le programmeur ?

Comment faire ?

Merci beaucoup de votre aide.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Sam Déc 17, 2016 12:58

Voili, voilou

J'avais une approche trop orientée "programmation séquentielle", alors que c'est de la P.O.O.

Chaque masque rendu par le MyPrepare($sql), est donc un objet instancié, donc cette fonction doit rendre un pointeur $masque_bind vers ce masque, ce pointeur sera utilisé au moment du lancement de
$masque_bind->MyBindParam($array_values), ce qui permettra éventuellement de simplifier $array_values en array simple

Je ne suis pas spécialiste en P.O.O., aussi comment gérer ce pointeur et ces values ?

Au passage, les $array_values seront simplifiées, il n'y aura besoin que des valeurs ( clés numériques) , puisque l'interprétation ( stricte ;) ) des types de valeurs sera faite.

Merci beaucoup de votre aide.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Dim Déc 18, 2016 13:35

Rebonjour

Voilà l'architecture de classes que j'envisage :

Une classe Database ( dérivée de PDO ) dont le constructeur génère le $sql_prepare, et fixe dans la classe DatabaseBindParam les conditions de type des paramètres des myBindParam(), en instancifiant DatabaseParam puis en rendant le $this de l'objet instancié.

La classe Database, comporte évidemment une fonction __get("my_prepare").

Une classe DatabaseBindParam ( dérivée de PDOStatement ) fournissant les__set($column, $value) , avec vérification forte des types, lançant les bindParam() réels. Mais le $this de cette classe, me permet-il de lancer les $this->bindParam() réels ?

Les $column, fixés par le programmeur-utlisateur, sont censés être rigoureusement les mêmes que dans la requête SQL initiale.

Dans cette classe, une méthode ad hoc $this->my_execute() chargée de déclencher le execute réel. ( Même chose ? )

Le blème serait que la connexion serait assurée par la classe singleton DatabaseConnect indépendante, avec une fonction statique getConnect() rendant $conn l'objet unique PDO de connexion.

Est-il envisageable, de lancer cette fonction statique à l'intérieur de Database, pour éventuellement lancer le $conn->prepare(_get($this->my_prepare)) directement, ?

Merci beaucoup pour vos réponses à mes questions.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Mar Déc 20, 2016 23:51

Bonjour

Voilà, j'ai résolu semble-t-il les dépendances entre classes :

- DatabaseConnection extends PDO

Cette classe fournit la fonction singleton : getConnection(), donnant l'objet instancié $this sur la classe parente ( le même quel que soit le nombre de fonctions déclenchées ).

Le constructeur ( qui ne fait rien ), est malheureusement public, car cette classe dérive de PDO.

Contient la fonction : prepare($sql_prepare) qui lance parent::prepare($sql_prepare). ( Obligatoire pour Database ).

- Database extends DatabaseConnection.

Lance : $this->conn = parent::getConnection(); A part çà constructeur vide.

Contient la fonction : MyPrepare($sql), qui calcule $this->sql_prepare, puis lance : parent:: prepare($this->sql_prepare);

- DatabaseBindParam extends PDOStatement

Contient des setter pour les colonnes avec vérification forte des types.

Plus d'erreur à la compilation ou l'exécution, sauf des problèmes résiduels qui nécessitent une mise au point fine de l'algorithme.

Je vais déboguer puis mettre au point l'intégration.

La séquence d'utilisation :

Code: Tout sélectionner

  // Exemple
 $sql = "select NUMCH, NOMCH  from CHEVAUX where NUMCH=3";

 // Une seule fois dans le script. Donne le handle de connexion.
  $conn = new Database;

  // Lance parent:prepare($sql_prepare).
 $bindParam = $conn->MyPrepare($sql);

  // Affectation des valeurs :
 $bindParam->NUMCH = 200;  etc... La valeur et le type sont vérifiés, puis lancement à chaque fois de la fonction parent::bindParam($column, $value, $type).

  // Appel de la fonction : parent::execute();
 $tmp_array = $bindParam->MyExecute();

  // Affichage.
  foreach($tmp_array as $key => $value)
  {
       echo "\tNUMCH = " . $value[0] . "\t\tNOMCH = " . $value[2] . "\n";
  }

  // Nettoyage.
  unset($tmp_array);
  $BindParam->deleteBindParam();
  $conn->deleteDatabase();




Pour l'instant l'intégration est minimale, et je dois encore mettre au point.

Mais il n'y a plus d'erreurs fatales, sauf pour des détails de l'algorithme.

Merci de me dire ce que vous en pensez. ;)

Respectueusement.
Haut
Messages: 8557

Enregistré le: 14 Mai 2003

Message le Mer Déc 21, 2016 7:27

Ah oui ça à l'air super pratique, c'est clean, c'est cohérent, PSR compliant, DRY et j'en passe.

Code: Tout sélectionner
$conn->deleteDatabase(); 

ça on devine tout de suite que ça fait un DROP DATABASE, sympa.

Tu devrais mettre ça en open source.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Mer Déc 21, 2016 11:30

Bonjour spout

Le nom ( Database ) de la classe, peut être n'importe quel nom.

deleteDatabase signifie : suppression de cette classe et de ses données.

Sinon, cette suppression n'aurait lieu qu'à la fin du script...

Comment résoudre le problème de l'interface ?

Je suis obligé de séparer ( fonctionnellement parlant ), le MyPrepare($sql) des affectations ( $bindParam->column = $value; etc... du reste : MyExecute().

Un instance $bindParam conserve les valeurs, ce qui peut limiter les affectations au maximum, et conserver le MyPrepare().

Pour l'intégration j'ai l'intention de faire une fonction : $conn->fetchAll() ( qui ramasse tout ), et puis une fonction spécifique pour tous les résultats réduits à une seule row : $conn->fetchRow(). ( pas de Myprepare(), seulement $conn->aquery() + $res->fetch(PDO::NUM) + $res->closeCursor() ).

Pour les petits nombres de rows : $conn->Aquery() ( idem que pour fetchRow() ).

Le blème, c'est que l'utilisateur/programmeur devrait décider ( suivant le nombre attendu de rows ), de quelle fonction lancer : Aquery(), fetchRow() ou fetchAll().

Et... Ces fonction détruisant l'objet créé à la fin, il y aurait toujours besoin éventuellement de : MyPrepare() ->affectation colonnes ->MyExecute() -> etc... ( les delete () à la fin ).

Donc : 5 fonctions plus les delete...().

Suffisant comme intégration ?

Merci beaucoup de vos réponses.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Dim Déc 25, 2016 17:03

Joyeux Noël à tous les Wrinautes

Suite à perte/vol de mon portefeuille, je suis en train de faire refaire mes documents.

Demandes prévues pour : C.I. dans une semaine, Vitale dans 15 jours.

J'ai élargi les mots-clés en tenant compte de la version 1.7 de MySQL.

Mais, je vais revoir en profondeur la logique de la fonction myPrepare($sql) de ma classe Database.

Je vais faire une approche top-down.

Bien amicalement.
Haut
Messages: 140

Enregistré le: 17 Oct 2009

Message le Lun Déc 26, 2016 15:49

Pas de bol ortolojf :-O

Bonnes fêtes, joyeux noël, etc.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Lun Déc 26, 2016 17:11

Bonjour niap

J'ai tous les documents pour la C.I. et la carte vitale.

Ma CB Visa me parviendra demain ou après-demain. ;)

J'attends demain pour tirer de l'argent avec mon chéquier.

Théoriquement un mauvais moment à passer.

J'ai adapté à l'instant ma librairie de parsing html pour du sql MySQL.

Cette fois-ci, j'interprète les caractères uns à uns, au lieu de par blocs.

J'ai tous les mots-clés de MySQL 5.7 dans une array, et mon interprétation des instructions MySQL sera exhaustive.

Je vais programmer la suite demain.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Jeu Déc 29, 2016 16:07

Bonjour

J'ai ma CB Visa, j'aurai ma C.I. dans trois ou quatre semaines. ;)

J'attends l'imprimé de la Sécu pour la Carte Vitale.

Tout baigne. Ouf de ouf.

Amicalement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Mar Jan 24, 2017 14:08

Rebonjour

Voilà, j'ai tous mes papiers sauf ma Carte d'Electeur. ;)

A propos de cette "Database Abstraction Layer Interface", j'ai mis sur mon site, un script 'essai_mysql.php' lisant l'instruction MySQL en paramètre sql, et corrigeant ses défauts.

Une très légère analyse lexicale, qui me permettra une fois validée, de traduire les masques à donner aux instructions PHP prepare( ), de manière automatique.

Voici l'url du script :

https://www.pronostics-courses.fr/essai_mysql/essai_mysql.php

L'instruction MySQL en paramètre, peut être donnée en ajoutant: ?sql=instruction_mysql , sans quotes autour du paramètre.

Merci beaucoup si vous pouviez tester de toutes les manières possibles.

Théoriquement, ce script n'accepte que des DML ( Data Manipulation ).

Merci beaucoup de vos réponses.

Respectueusement.
Haut
Messages: 8557

Enregistré le: 14 Mai 2003

Message le Mar Jan 24, 2017 15:39

Erreur:
https://www.pronostics-courses.fr/essai_mysql/essai_mysql.php?sql=SELE ... ,%202,%203)
https://www.pronostics-courses.fr/essai_mysql/essai_mysql.php?sql=SELE ... ,%20b,%20c)%20FROM%20chevaux%20WHERE%201
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Mar Jan 24, 2017 17:45

Bonjour spout

J'ai corrigé l'erreur.

Maintenant, je met un espace avant tout mot-clé, que ce soit un opérateur ou une fonction.

Il est à prévoir, qu'il y aura un espace avant les opérateurs arithmétiques, malheureusement.

Merci de me reporter d'autres erreurs.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Mar Jan 24, 2017 23:07

Rebonjour

Maintenant çà devrait marcher. ;)

J'ai revu le problème des espaces, en réaffectant les fonctions et les opérateurs.

Les opérateurs ne sont pas précédés par un espace, les fonctions sont précédées par un espace.

Normalement çà passe avec n'importe quelles fonctions et n'importe quels opérateurs.

J'arrangerai la détection des erreurs plus tard.

Rappel d'url :

https://www.pronostics-courses.fr/essai_mysql/essai_mysql.php

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Mer Jan 25, 2017 13:24

Rebonjour

Message d'erreur corrigés.

Maintenant, je suis capable en théorie d'identifier les values ( auxquelles il faudra appliquer des masques ), et les Tables, Colonnes, et Aliases.

Si tout est correct sur le soft actuellement.

Je pourrai ainsi gérer les arrays faisant correspondre ces éléments, à charge ensuite de faire automatiquement : les prepare() réels, les bindParam() réels, et les execute().

Ceci de manière transparente et automatique.

Les bindParam() ultérieurs sur un prepare() en cours, seront fait avec des setter.

Après, la surcouche PHP sera simple et facile.

Merci beaucoup pour les suggestions déjà reçues, et merci pour vos avis et suggestions éventuels.

Respectueusement.
Haut
Messages: 8557

Enregistré le: 14 Mai 2003

Message le Mer Jan 25, 2017 13:41

ortolojf a écrit:Après, la surcouche PHP sera simple et facile.


Code: Tout sélectionner
<?php
Cheval
::where('numch'200)->count();
Cheval::whereIn('numch', [123]);
Cheval::whereHas('race', function ($q) {
    
$q->where('nom''Lusitanien');
}); 


On a pas la même notion de simple et facile... :lol:
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Mer Jan 25, 2017 14:05

Bonjour spout

Moi j'instancifie ma classe Database . ;)

Je n'ai pas de méthodes ( ni de variables ) statiques.

C'est vrai que c'est mieux de diminuer le nombre d'instructions PHP.

Mais mon procédé ( algorithme ), sera de vitesse : O(n) ( linéaire ).

Celà dit, j'essaierai d'adopter ta syntaxe entièrement orientée objet.

Merci beaucoup de ton aide.

Amicalement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Sam Jan 28, 2017 23:06

Rebond

Avant-hier, j'ai obtenu la connexion à ma database ( sur mon ordi ) et pu lancer la classique fonction query().

Deux classes : DatabaseConnexion ( singleton de connexion ), et Database extends PDOStatement.

Les fonctions PDOStatement habituelles, sont simplement déclarées avec :

Code: Tout sélectionner
        public function __call($method, $args)
        {
                if(is_callable(array($this->pdo_statement, $method)))
                {
                        return call_user_func_array(array($this->pdo_statement, $method), $args);
                }
                else
                {
                        throw new BadMethodCallException('Undefined method Database::' . $method);
                }
        }


$this->pdo_statement est la variable contenant le résultat de :

Code: Tout sélectionner

   $this->pdo = DatabaseConnexion::getInstance();

  $this->pdo_statement = $this->pdo->query($this->sqlprepare);



Mon singleton ne pouvant pas être dérivé de PDO ( mais rendant quand même un objet PDO ), je ne sais pas comment faire autrement que de cette manière très très barbare.

En tout cas la database est accédée.


Depuis hier, je peaufine le parsing MySQL.

Celà consiste en une "finite state machine" qui lit en suivant l'instruction MySQL préformatée, et qui générera les rnasques et les valeurs.

A la fin, je traiterai le problème des variables SQL ( précédées par des ampersand & ).

Pour l'instant les ampersand sont considérés comme des opérateurs binaires, et donc je devrai ajouter en aval l'interprétation en fonction du contenu.

Cà devrait aller plus vite maintenant, j'ai l'algorithme ( en théorie ).

Il faudra résoudre le problème de l'adaptation prévisionnelle aux versions futures de MySQL.

Je vais voir à la fin, si c'est possible d'identifier les mots-clés même non connus.

Bien à vous.

Amicalement.
Haut
Messages: 8557

Enregistré le: 14 Mai 2003

Message le Sam Jan 28, 2017 23:24

Je pense que tu dois utiliser l'injection de dépendance:
https://www.grafikart.fr/formations/programmation-objet-php/injection
https://openclassrooms.com/courses/introduction-a-l-injection-de-depen ... ces-en-php
[...]
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Dim Jan 29, 2017 10:06

Bonjour spout

Mon ordi est en PHP 7.

J'ai deux problèmes similaires ( rien à voir avec PHP 7 ) :

1) Mon singleton DatabaseConnexion ne peut pas dériver de PDO.

2) Ma classe Database doit dériver de PDOStatement pour que les fonctions genre fetch(), fetchAll() etc natives de PDOStatement, puissent être utilisées dans Database.

Pour le 2), ces fonctions ne peuvent pas appeler leur parent, puisque Database est instanciée sans que son parent ne le soit :

Code: Tout sélectionner
    /**
         * Constructeur de la classe Database
         */
        public function __construct() {

                $this->fonc_parse = "sql_data_token";

                $this->sql_init();
        }



Je ne vois pas quels paramètres je mettrais à parent::__constuct() pour instancier le parent PDOStatement.


Pour le 1) Je n'ai accès à l'objet PDO proprement dit, qu'avec : $this->PDOInstance, et cet objet, bien que de type PDO, ne peut également pas me permettre d'instancier le parent ( pas de parent PDO puisque le constructeur de DatabaseConnexion est private ).

Voici le constructeur :

Code: Tout sélectionner

       /**
         * Constructeur de la classe DatabaseConnexion
         */
        private function __construct()
        {
                try {
                        $this->_PDOInstance = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db . ";charset=" . $this->charset . ";collate" . $this->collate, $this->user, $this->passwd);
                        $this->_PDOInstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                } catch(PDOException $e) {
                        exit("\n\n" . 'Erreur : '. $e->getMessage() . "\n\n");
                }
        }

      /**
         * Méthode qui crée la connexion
         * si elle n'existe pas encore
         * puis la retourne.
         */
        public static function getInstance()
        {
                if (!(self::$_instance instanceof self))
                {
                        self::$_instance = new self();
                }

                return self::$_instance;
        }




L'injection de dépendance, me permettrait-il de résoudre l'instanciation des classes parentes ?

Super merci pour ton aide.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Dim Jan 29, 2017 14:36

Rebonjour spout

Voilà, finalement je n'ai plus besoin de dériver quoi que ce soit.

J'ai ces fonctions :

Code: Tout sélectionner

  /*
   * Classe DatabaseConnexion
   * ( renommée en DB pour faire simple )
   */
  public static function __callStatic($method, $args)
        {
                if (!is_callable(self::getInstance(), $method))
                {
                        throw new BadMethodCallException("No such method $method for DB");
                }

                return call_user_func_array(array(self::getInstance(), $method), $args);
        }

        public function __call($method, $args)
        {
                if(is_callable(array($this->_PDOInstance, $method)))
                {
                        return call_user_func_array(array($this->_PDOInstance, $method), $args);
                }
                else
                {
                        throw new BadMethodCallException('Undefined method DB::' . $method);
                }
        }

       /*
        * Classe Database
        */
        private function setPDOStatement($value)
        {
                $this->pdo_statement = $value;
        }

        private function getPDOStatement()
        {
                return $this->pdo_statement;
        }



La classe DB est correcte, les deux classes ne sont plus dérivées ( pas besoin ), mais cet affreux hack avec setPDOStatement() et getPDOStatement() me reste sur le coeur.

Ce n'est pas de la POO, mais je ne vois pas comment faire autrement.

En tout cas le problème de la classe DB est résolu.

Merci beaucoup de ton aide.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Dim Jan 29, 2017 17:42

Pardon

Nonobstant mon ignorance manifeste en POO, je vois la fin du tunnel :

Code: Tout sélectionner

  /**
         * Constructeur de la classe Database
         */
        public function __construct() {

                $this->pdo = DB::getInstance();

                if((is_null($this->pdo))||(!$this->pdo instanceof DB))
                {
                        echo "Erreur de connexion DB.\n\n";

                        print_r($this->pdo)  . "\n";

                        throw new Exception("Erreur de connexion DB.");

                        return(true);
                }

                $this->fonc_parse = "sql_data_token";

                $this->sql_init();
        }



Après, le lancement des fonctions PDOStatement habituelles ou particulières à mon interface, sera géré normalement par le code dans Database.

Il n'y a pas besoin d'instancier plusieurs fois Database pour celà ( pour chaque lancement de fonction ), ce sera à moi de gérer les variables rendues par ces fonctions.

D'ailleurs pour gérer ces variables, j'aurai à garder trace des variables créées par ces fonctions.

J'ai remarqué sur le net, que l'utilisation des classes PDO et PDOStatement, donnait lieu en général à de la POO pure pour la classe PDO, et plutôt procédurale pour la PDOStatement.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Dim Jan 29, 2017 20:52

Bonjour

Voici ce que j'obtiens pour l'instant :

( Je n'affiche pas les ID ).

Code: Tout sélectionner

   $sql_initiale = select A.NUMCH, A.NOMCH, B.ID  From CHEVAUX A, COURSES B WHERE B.NUMCH=A.NUMCH ORDER BY B.ID DESC LIMIT 5

      Instuctions MySQL resultantes :

      $sql_prepare = SELECT A.NUMCH, A.NOMCH, B.ID FROM CHEVAUX A, COURSES B WHERE B.NUMCH= A.NUMCH ORDER BY B.ID DESC LIMIT 5
      $sql_masque_prepare = SELECT A.NUMCH, A.NOMCH, B.ID FROM CHEVAUX A, COURSES B WHERE B.NUMCH= A.NUMCH ORDER BY B.ID DESC LIMIT 5

   $token_select[ 0 ][ 0 ][COLUMN] = NUMCH
   $token_select[ 0 ][ 0 ][TABLE_OU_ALIAS] = A
   $token_select[ 0 ][ 1 ][COLUMN] = NOMCH
   $token_select[ 0 ][ 1 ][TABLE_OU_ALIAS] = A
   $token_select[ 0 ][ 2 ][COLUMN] = ID
   $token_select[ 0 ][ 2 ][TABLE_OU_ALIAS] = B

   $token_from[ 0 ][ 0 ][TABLE] = CHEVAUX
   $token_from[ 0 ][ 0 ][ALIAS_TABLE] = A
   $token_from[ 0 ][ 1 ][TABLE] = COURSES
   $token_from[ 0 ][ 1 ][ALIAS_TABLE] = B


      154285      EL:NINO:(HOL)
      157422      GINA:BROS:(GER)
      139745      URCK:DEL:RIO:(ITY)
      158014      GREEK:F:BOKO:(GER)
      146580      FLORAL:GIRL:(HOL)




Je n'aurai plus qu'à rapprocher les aliases.

Je vais maintenant faire les $token_where et les $token_having

Amicalement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Jeu Fév 02, 2017 12:17

Rebonjour

Un peu d'amélioration :

Code: Tout sélectionner
      $sql_initiale = INSERT INTO FONCTIONS_TARTEAUCITRON(ID, NAME, NUM, PARAM) VALUES('APLUSBEGALIX' . ',' . 'APLUSBEGALIX' . ', ' . 'APLUSBEGALIX' . ', ' . 'APLUSBEGALIX')

      Instuctions MySQL resultantes :

      $sql_prepare = INSERT INTO FONCTIONS_TARTEAUCITRON(ID, NAME, NUM, PARAM) VALUES('APLUSBEGALIX','APLUSBEGALIX','APLUSBEGALIX','APLUSBEGALIX')
      $sql_masque_prepare = INSERT INTO FONCTIONS_TARTEAUCITRON(ID, NAME, NUM, PARAM) VALUES('APLUSBEGALIX','APLUSBEGALIX','APLUSBEGALIX','APLUSBEGALIX')

      IS_INSERT

   $token_nom[IS_INSERT][TABLE][0] = FONCTIONS_TARTEAUCITRON

      IS_INTO

   $token_nom[IS_INTO][COLUMN][0] = ID
   $token_nom[IS_INTO][COLUMN][1] = NAME
   $token_nom[IS_INTO][COLUMN][2] = NUM
   $token_nom[IS_INTO][COLUMN][3] = PARAM

      IS_VALUES

   $token_value[IS_VALUES][ID][0] = 'APLUSBEGALIX'
   $token_value[IS_VALUES][NAME][1] = 'APLUSBEGALIX'
   $token_value[IS_VALUES][NUM][2] = 'APLUSBEGALIX'
   $token_value[IS_VALUES][PARAM][3] = 'APLUSBEGALIX'



Voilà, en théorie pour générer les masques des valeurs, il suffit de prendre les keys des values, qui sont les noms des colonnes.

Je vais d 'abord tester avec des opérateurs ( relationnels et conditionnels ) et des fonctions, qui peuvent éventuellement donner lieu à des variables indicées de manière peu adaptée, et puis après, passer à la programmation de l'interface.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Jeu Fév 02, 2017 13:13

Rebonjour

Pour ceux que çà intéresserait :

Vous pouvez tester à l'url suivante :

https://www.pronostics-courses.fr/essai_mysql/essai_mysql.php

Avec comme paramètre : sql=instruction_sql ( sans quote autour ).

Il y aura nécessairement des erreurs.

Merci beaucoup de votre aide.

Respectueusement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Ven Fév 03, 2017 19:14

Rebonjour

Cette fois-ci, j'ai mis en place dans le prepare(), les masques des bindParam().

Merci de me dire ce qui ne va pas :

https://www.pronostics-courses.fr/essai_mysql/essai_mysql.php

Résultat par défaut :

Code: Tout sélectionner

      Usage : https://www.pronostics-courses.fr/essai_mysql/essai_mysql.php?sql=instruction_mysql

      $sql_initiale = select A.NUMCH, A.NOMCH, B.ID  From CHEVAUX A, COURSES B WHERE B.NUMCH=A.NUMCH GROUP BY A.NUMCH DESC HAVING B.ID<2

      Instuctions MySQL resultantes :

      $sql_prepare = SELECT A.NUMCH, A.NOMCH, B.ID FROM CHEVAUX A, COURSES B WHERE B.NUMCH= A.NUMCH GROUP BY A.NUMCH DESC HAVING B.ID<2

      prepare(SELECT A.NUMCH, A.NOMCH, B.ID FROM CHEVAUX A, COURSES B WHERE B.NUMCH= A.NUMCH GROUP BY A.NUMCH DESC HAVING B.ID<:B_ID_1);

      bindParam(:B_ID_1, 2, 1);



Vous pouvez mettre le paramètre "sql=" que vous voulez ( sans quote ).

Amicalement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Dim Fév 05, 2017 22:17

Bonjour

J'espère que Monsieur spout va me répondre.

Voilà ce que celà donne maintenant, avec le $sql par défaut :

Code: Tout sélectionner

Usage : https://www.pronostics-courses.fr/essai_mysql/essai_mysql.php?sql=instruction_mysql

$sql_initiale = insert into TABLE(NUMCH, NOMCH) select NUMCH, NOMCH from CHEVAUX where NUMCH=5

Instuctions MySQL resultantes :

$sql_prepare = INSERT INTO TABLE(NUMCH, NOMCH) SELECT NUMCH, NOMCH FROM CHEVAUX WHERE NUMCH=5
prepare(INSERT INTO TABLE(NUMCH, NOMCH) SELECT NUMCH, NOMCH FROM CHEVAUX WHERE NUMCH=:NUMCH_1);

Setter/Getter : CHEVAUX->SELECT->NUMCH
Setter/Getter : CHEVAUX->SELECT->NOMCH
Setter/Getter : CHEVAUX->WHERE->NUMCH
bindParam(:NUMCH_1, 5, 1);




Théoriquement, on peut mettre n'importe quelle instruction MYSQL ( de type DML quand même ), et il te sort le prepare(), les setter/getter et les bindParam().

Les setter/getter sont très théoriques, il n'y a aucune vérification par rapport à l'utilisation pratique.

Ce sont simplement des mises en évidence des dépendances entre les tables, les éléments du langage et les colonnes.

Merci de bien vouloir tester.

J'ai testé jusqu'à présent sur cinq sql.

Il est éventuellement possible qu'il y ait des problèmes avec les subqueries.

Amicalement.
Haut
Messages: 2767

Enregistré le: 14 Aoû 2002

Message le Lun Fév 06, 2017 18:39

Rebonjour

Maintenant, il donne théoriquement tous les getters, et seulement les setter quand il y a des values.

Il faut que je peaufine l'interprétation des setter, en fonction des opérateurs arithmétiques ( à ne pas confondre avec un bindParam() ) .

Egalement, je devrais évaluer ce qu'est réellement un getter.


Code: Tout sélectionner

Usage : https://www.pronostics-courses.fr/essai_mysql/essai_mysql.php?sql=instruction_mysql

$sql_initiale = insert into TABLE(NUMCH, NOMCH) select NUMCH, NOMCH from CHEVAUX where NUMCH=5

Instuctions MySQL resultantes :

$sql_prepare = INSERT INTO TABLE(NUMCH, NOMCH) SELECT NUMCH, NOMCH FROM CHEVAUX WHERE NUMCH=5

prepare(INSERT INTO TABLE(NUMCH, NOMCH) SELECT NUMCH, NOMCH FROM CHEVAUX WHERE NUMCH=:NUMCH_1);

Getter : $value = CHEVAUX->SELECT->NUMCH

Getter : $value = CHEVAUX->SELECT->NOMCH

Setter : CHEVAUX->WHERE->NUMCH op 5

bindParam(:NUMCH_1, 5, 1);




Merci de tester :

https://www.pronostics-courses.fr/essai_mysql/essai_mysql.php

Respectueusement.
Haut

Formation recommandée sur ce thème :

Formation SEO spéciale Wordpress : apprenez à optimiser le référencement naturel d'un site fait avec Wordpress... Formation Ranking Metrics animée par un expert SEO / Wordpress.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.