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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Fonctions PHP et SQL


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut Fonctions PHP et SQL
    Bonjour à tous,

    Alors voilà, j'ai plusieurs fichiers, un qui regroupe tout un tas de fonctions portant le nom d'action en SQL (create table, drop table, etc...)
    J'ai un fichier de connexion à la base de données, celui là est ok, lorsque je test en créant des requêtes "en dur" dans une variable $sql et que je continue avec un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $res = $mysqli->query($sql);
    Ca créer bien ma table dans la base.
    Mais je ne souhaite pas écrire ma requête en dur !
    Je souhaite avoir des fonctions " action sql" d'un côté, et un tableau avec des arguments de l'autre côté.

    Des exemples seront plus parlant :
    Fichier de fonction :

    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
    abstract class DBMigration
    {
        abstract protected function up();
        abstract protected function down();
     
     
        // $my : connection MySQL (déjà ouverte)
        // $log : fichier de log (déjà ouvert)
        public function __construct($mysqli, $log) {
          $this->mysqli = $mysqli;
          $this->log = $log;
        }
     
        // Création d'une table avec la liste des colonnes et leur type
        public function create_table($tablename, $columns) {
                require_once("migrations/test.php");
                $migration = new CreateTableCountries($mysqli, $log);
                $res = $mysqli->query($sql);
                $migration->up();
        }
    Puis mon fichier test.php contenant ce que je veux ajouter dans ma table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      class CreateTableCountries extends DBMigration {
     
        public function up() {
          // Création de la table countries
            $this->create_table('countries', array(
            'id' => 'integer(11)',
            'name' => 'varchar(255)',
            ));
        }
    En gros la fonction up() servira pour tout ce qui est create table, tandis que j'aurais également une fonction down() pour tout ce qui est drop tables.

    Pour résumer :

    2 fichiers, un comprenant les fonctions create table, drop table, etc...
    L'autre pour tout ce qui est fonction up et créations des tables.

    Maintenant ma question est : Que dois-je mettre dans mon premier fichier dans les fonctions create table par exemple pour que ça créer effectivement la table que je défini dans mon fichier test.php ? Je rappelle que je ne souhaite pas écrire la requête en dur.
    Ce que j'ai fait actuellement ne retourne pas d'erreur mais ne me créer pas ma table pour autant.

    Je suis un débutant complet en php, soyez indulgents svp :p

    Merci d'avance !
    Janesh

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 133
    Par défaut
    Salut,

    Rien de bien difficile ici, si tu as réussi à imaginer ça c'est que tu n'es plus un débutant du coup je ne vois pas bien qu'est ce qui te bloque ?
    Poste le code de createTable, mais bon si tu sais faire une requête CREATE TABLE et une concaténation PHP ...

    Sinon, un troisième argument serait le bienvenue contenant un array qui représenterait la clé primaire.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    Salut et merci de prendre du temps pour m'aider
    Etant donné que c'est un projet scolaire de groupe, ce n'est pas moi qui ai imaginé intégralement cette structure (j'ai vu des manières de faire bien plus simple sur le net donc je me serais pas embêté avec ça...)

    SI je poste c'est justement car je ne trouve pas la solution par moi même :p
    Donc oui je sais faire un create table en SQL, je sais aussi concaténer, mais ma question c'est : avec quoi ? Je ne sais pas trop ce que je dois mettre justement dans cette fonction, dois-je concaténer avec mon array de l'autre fichier...?

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 133
    Par défaut
    Dans ta classe DBMigration, tu ajoute une méthode "create_table" qui, grâce aux paramètres en entrée, va construire la requête CREATE TABLE.
    Comme dans DBMigration tu as une ressource $mysqli, tu peux exécuter ta requête.

    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
     
    	/**
    	 * @param string $tableName
    	 * @param array $tableParams
    	 * @return null
    	 */
    	public function create_table($tableName, $tableParams) 
    	{
    		// construction de la requête
    		//...
     
    		// exécution de la requête
    		//...
     
    		return ;
    	}

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    C'est peut être pas très lisible dans mon premier message comme j'ai balancé pas mal de code, mais j'avais déjà commencé à la créer cette méthode create_table avec des paramètres (il faut scroll dans le code que j'ai link sur la classe DBMigration), mon souci étant que ce que la partie "construction de la requête" et "exécution de la requête" ne fonctionne pas comme je veux, mon but je le rappelle c'est de pouvoir dans la méthode create_table exécuter la fonction up() de mes autres fichiers de création de table (il y en aura plusieurs).

    Donc en gros quand j'vais exécuter ma fonction up dans create_table ça va déclencher la création de table, de mon fichier test.php, le tout sans noter en dur la requête mais juste en prenant ce qu'il y a dans le fichier test.php, donc le nom de l'array c'est le nom de la table et les paramètres c'est le contenu de ma requête.

    Je suis plus clair ? ^^

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 133
    Par défaut
    Ok, donc je n'avais effectivement pas compris ta problématique de ton point de vue.

    mon but je le rappelle c'est de pouvoir dans la méthode create_table exécuter la fonction up() de mes autres fichiers de création de table (il y en aura plusieurs).
    Ça c'est problématique puisque up appelle create_table, tu vas nous faire une récursion infinie là ^^.
    create_table ne doit pas appeler up mais up doit bien appeler create_table.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    Hmmm d'accord...une idée de comment je pourrais procéder autrement du coup ? :p Sans que ça soit trop éloigné de ma méthode intiale ? (donc avec les 2 fichiers et fonctions)

  8. #8
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 133
    Par défaut
    Je pensais avoir répondu à cette question ?
    Dans ce cas vois avec un autre si il comprend mieux ton problème.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    Bah je pense que tu as répondu en parti oui, le souci étant que je n'arrive toujours pas à mettre le bon contenu de cette fameuse fonction create table :/
    Comme tu peux le voir j'avais déjà commencé à créer la fonction de la même manière que tu me l'as indiqué, mais j'aurais vraiment besoin d'aide pour remplir le contenu de cette fonction svp ^^ Rien que cette fonction me débloquerait je pense pour toutes les autres de mon projet.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    Bon je pense que je suis plus ou moins sur la bonne voie...
    Je me suis créé un fichier test.php avec le strict minimum de ce que je voudrais dedans, et ça fonctionne bien :

    Fichier test.php

    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
    <?php
     
        require_once('./mysqli.php');
        $tablename='countries';
        $test=array(
            'id' => 'integer(11)',
            'name' => 'varchar(255)',
            );
     
        // on créé un tableau vide qui va contenir la concaténation de toutes les clés/valeurs sous la forme : "clé valeur" 
        $all_pairs = array();
        // on parcours le tableau
        foreach ($test as $key => $value) {
            // on ajoute "clé valeur" dans le tableau
            array_push($all_pairs, "$key $value");
        }
        // on créé un chaine qui contient tous les éléments du tableau $all_pairs rassemblés par des ", " 
        $concat_str = implode(", ", $all_pairs);
        // on affiche, juste pour vérifier
        echo $concat_str, "\n";
        $mysqli->query("create table $tablename($concat_str)");
     
    ?>
    Je créer donc dans ma base de donnée ma table countries avec ses paramètres.

    Maintenant quand j'essaie de tout séparer plus rien ne fonctionne, je n'arrive pas à appeler mes fonctions j'ai l'impression.
    Je reprends donc mon architecture, je sépare en 2 fichiers :

    Fichier DBMigration.php

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    abstract class DBMigration
    {
        abstract protected function up();
        abstract protected function down();
     
     
        // $my : connection MySQL (déjà ouverte)
        // $log : fichier de log (déjà ouvert)
        public function __construct($mysqli, $log) {
          $this->mysqli = $mysqli;
          $this->log = $log;
        }
     
        //$date = date(" YmdHis");
     
        function mytest1($test) {
        require_once ('./migrations/test.php');
     
        $migrations = new CreateTableCountries($mysqli, $log);
        $migrations->up();
     
        // on créé un tableau vide qui va contenir la concaténation de toutes les clés/valeurs sous la forme : "clé valeur" 
        $all_pairs = array();
        // on parcours le tableau
        foreach ($test as $key => $value) {
            // on ajoute "clé valeur" dans le tableau
            array_push($all_pairs, "$key $value");
        }
        // on créé une chaine qui contient tous les éléments du tableau $all_pairs rassemblés par des ", " 
        $concat_str = implode(", ", $all_pairs);
        // on affiche, juste pour vérifier
        echo $concat_str, "\n";
     
         $mysqli->query("create table countries($concat_str)");
     
      }
    Je cherche donc à piocher les infos dans la fonction up de ce fichier :

    Fichier test.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        require_once('./includes/DBMigration.php');
        class CreateTableCountries extends DBMigration {
     
        public function up() {
          // Création de la table countries
            $this->mytest1('countries', $test=array(
            'id' => 'integer(11)',
            'name' => 'varchar(255)',
            ));
     
            $this->add_unique('countries', 'name', 'uq_countries_name');
        }
    Mais donc après tout ça j'ai l'impression qu'à partir de mon fichier DBMigration je n'arrive pas à appeler ce qui se trouve dans le fichier test.php
    Ca ne créer pas ma table countries, ça ne retourne aucun message d'erreur...bref je vois pas du tout ce que je loupe.
    Ca fait des heures que je tourne en rond...un coup de main serait fortement apprécié svp !

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Par défaut
    Que je comprenne...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require_once('./includes/DBMigration.php');
    ... pour pouvoir étendre la classe CreateTableCountries avec DBMigration.
    Jusque là ok.

    Ensuite tu instancies une classe CreateTableCountries dans DBMigration alors que CreateTableCountries hérite de DBMigration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    
    $migrations = new CreateTableCountries;

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    Je l'ai déplacé dans un nouveau fichier que j'ai nommé classes.php, est-ce une manière plus propre de procéder ?

    Le problème avec ça, c'est que, à mon sens, je suis obligé de pointer à la fois vers mon fichier test.php et vers DBMigration, du coup je me retrouve avec une boucle infini...
    Mon idée finale c'est vraiment de pouvoir récupérer le tableau se trouvant test.php, fonction up, et de le balancer dans ma fonction mytest1 du fichier DBMigration, pour pouvoir créer ma table.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 209
    Par défaut
    Dans la classe DBMigration

    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
      function mytest1($nom_de_table, $test) {
        
        // on créé un tableau vide qui va contenir la concaténation de toutes les clés/valeurs sous la forme : "clé valeur" 
        $all_pairs = array();
        // on parcours le tableau
        foreach ($test as $key => $value) {
            // on ajoute "clé valeur" dans le tableau
            $all_pairs[]= $key." ".$value;
        }
        // on créé une chaine qui contient tous les éléments du tableau $all_pairs rassemblés par des ", " 
        $concat_str = implode(", ", $all_pairs);
        // on affiche, juste pour vérifier
        echo $concat_str, "\n";
     
        $this->mysqli->query("create table ". $nom_de_table . " " . $concat_str);
     
      }
    Et pour les autres classes :

    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
    
        require_once('./includes/DBMigration.php');
    
        class CreateTableMachinchose extends DBMigration {
          
          public function up() {
            // Création de la table countries
            
            $this->mytest1('Machinchose', $test=array(
            'id' => 'integer(11)',
            'name' => 'varchar(255)',
            ));
            
            // Et ça : Je ne sais pas à quoi elle sert.
            // Je vois cette méthode à aucun endroit... 
            $this->add_unique('Machinchose', 'name', 'uq_Machinchose_name');
          }
        }

  14. #14
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 13
    Par défaut
    J'aurais dû l'effacer, c'est une autre méthode que je vais devoir écrire dans le fichier DBMigration. Pour l'instant l'essentiel c'est plutôt la première partie du fichier.

Discussions similaires

  1. [MySQL] [Requête SQL] Question Fonctions PHP
    Par Paul75 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 22/09/2008, 09h05
  2. [SQL] Regrouper des valeurs : fonction php équivalente à Group BY
    Par thibaut06 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/02/2008, 14h58
  3. [SQL] Résultat de fonction php non valide dans requête SQL
    Par darksnake dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/12/2007, 13h44
  4. [SQL] comment "desactiver" une fonction php dans une page?
    Par horas dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/05/2007, 15h04
  5. [CSV] Fonction PHP pour SQL Server
    Par wolflinger dans le forum Langage
    Réponses: 2
    Dernier message: 17/05/2006, 12h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo