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

WordPress PHP Discussion :

Création de plugin - problème de création de table


Sujet :

WordPress PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Apprenti informaticien
    Inscrit en
    Août 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Apprenti informaticien

    Informations forums :
    Inscription : Août 2014
    Messages : 35
    Points : 35
    Points
    35
    Par défaut Création de plugin - problème de création de table
    Bonjour tout le monde,

    Je dois mettre en place un plugin WordPress pour la gestion de vente de billets pour des événements comme projet dans mon école. Je ne maîtrise pas très bien le PHP et je n'y connais rien à WordPress.

    J'essaie de créer des tables lors de l'activation de mon plugin.

    J'ai donc la fonction register_activation_hook() qui me lance ma 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
    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
     
    // Création des tables
        public static function BaTi_install_DB()
        {
     
            global $wpdb;
     
            // Table client
            $wpdb->query("CREATE TABLE IF NOT EXISTS {$wpdb->prefix}BaTi_tblClient (
                        cliId INT UNSIGNED NOT NULL AUTO_INCREMENT,
                        cliNom VARCHAR(45) NOT NULL,
                        cliPrenom VARCHAR(45) NOT NULL,
                        cliPassword VARCHAR(60) NOT NULL,
                        cliMail VARCHAR(45) NOT NULL,
     
                        PRIMARY KEY (cliId),
     
                        CONSTRAINT UNIQUE Unique_Password (cliPassword)
                    ) ENGINE=INNODB   DEFAULT CHARSET=utf8;");
     
            // table type de billets
            $wpdb->query("CREATE TABLE IF NOT EXISTS {$wpdb->prefix}BaTi_tblTypeBillet (
                        tybiId INT UNSIGNED NOT NULL AUTO_INCREMENT,
                        tybiNom VARCHAR(45) NOT NULL,
                        tybiPrix DOUBLE NOT NULL,
     
                        PRIMARY KEY (tybiId),
     
                        CONSTRAINT UNIQUE Unique_Nom (tybiNom)
                    ) ENGINE=INNODB   DEFAULT CHARSET=utf8;");
     
            // table événement
            $wpdb->query("CREATE TABLE IF NOT EXISTS {$wpdb->prefix}BaTi_tblEvent (
                        eveId INT UNSIGNED NOT NULL AUTO_INCREMENT,
                        eveNom VARCHAR(45) NOT NULL,
     
                        PRIMARY KEY (eveId),
     
                        CONSTRAINT UNIQUE Unique_Nom (eveNom)
                    ) ENGINE=INNODB   DEFAULT CHARSET=utf8;");
     
            // table Commande
            $wpdb->query("CREATE TABLE IF NOT EXISTS {$wpdb->prefix}BaTi_tblCommande (
                        comId INT UNSIGNED NOT NULL AUTO_INCREMENT,
                        BaTi_tblClient_cliId INT UNSIGNED NOT NULL,
                        comDate DATE NOT NULL,
                        comMontantTotal DOUBLE NOT NULL,
     
                        PRIMARY KEY (comId),
     
                        KEY BaTi_tblClient_cliId_FK(BaTi_tblClient_cliId),
                        CONSTRAINT BaTi_tblClient_cliId_FK FOREIGN KEY (BaTi_tblClient_cliId) REFERENCES BaTi_tblClient(cliId)
                    ) ENGINE=INNODB;");
     
            // table billet
            $wpdb->query("CREATE TABLE IF NOT EXISTS {$wpdb->prefix}BaTi_tblBillet (
                        bilId INT UNSIGNED NOT NULL AUTO_INCREMENT,
                        BaTi_tblCommande_comId INT UNSIGNED NOT NULL,
                        BaTi_tblTypeBillet_tybiId INT UNSIGNED NOT NULL,
                        BaTi_tblEvent_eveId INT UNSIGNED NOT NULL,
                        bilCodeBarre INT NOT NULL,
                        bilPDF VARCHAR(255),
     
                        PRIMARY KEY (bilId),
     
                        KEY BaTi_tblCommande_comId_FK (BaTi_tblCommande_comId),
                        CONSTRAINT BaTi_tblCommande_comId_FK FOREIGN KEY (BaTi_tblCommande_comId) REFERENCES BaTi_tblCommande(_comId),
                        KEY BaTi_tblTypeBillet_tybiId_FK (BaTi_tblTypeBillet_tybiId),
                        CONSTRAINT BaTi_tblTypeBillet_tybiId_FK FOREIGN KEY (BaTi_tblTypeBillet_tybiId) REFERENCES BaTi_tblTypeBillet(tybiId),
                        KEY BaTi_tblEvent_eveId_FK (BaTi_tblEvent_eveId),
                        CONSTRAINT BaTi_tblEvent_eveId_FK FOREIGN KEY (BaTi_tblEvent_eveId) REFERENCES BaTi_tblEvent(eveId),
     
                        CONSTRAINT UNIQUE Unique_CodeBarre (bilCodeBarre)
                    ) ENGINE=INNODB   DEFAULT CHARSET=utf8;");
     
        }   // END BaTi_install_DB
    Malheureusement cela ne me génère que les trois premières tables. Mon fichier de log m'affiche ceci :

    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
    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
     
    [29-Apr-2015 14:11:33 UTC] PHP Notice:  has_cap est appelé avec un argument qui est <strong>déprécié</strong> depuis la version 2.0&nbsp;! L&rsquo;utilisation des niveaux d&rsquo;utilisateur par les extensions et thèmes est désormais interdite. Utiliser les rôles et capacités à la place. in N:\xampp\htdocs\JapanImpact\wp-includes\functions.php on line 3495
     
    [29-Apr-2015 14:11:33 UTC] Erreur de la base de données WordPress Can't create table 'dbjapanimpact.ji_bati_tblcommande' (errno: 150) pour la requête CREATE TABLE IF NOT EXISTS JI_BaTi_tblCommande (
     
                        comId INT UNSIGNED NOT NULL AUTO_INCREMENT,
     
                        BaTi_tblClient_cliId INT UNSIGNED NOT NULL,
     
                        comDate DATE NOT NULL,
     
                        comMontantTotal DOUBLE NOT NULL,
     
     
     
                        PRIMARY KEY (comId),
     
     
     
                        KEY BaTi_tblClient_cliId_FK(BaTi_tblClient_cliId),
     
                        CONSTRAINT BaTi_tblClient_cliId_FK FOREIGN KEY (BaTi_tblClient_cliId) REFERENCES BaTi_tblClient(cliId)
     
                    ) ENGINE=INNODB; faite par activate_plugin, do_action('activate_BasickTicketting/index.php'), call_user_func_array, BaTi_Install_Plugin::BaTi_install_DB
     
    [29-Apr-2015 14:11:33 UTC] Erreur de la base de données WordPress Can't create table 'dbjapanimpact.ji_bati_tblbillet' (errno: 150) pour la requête CREATE TABLE IF NOT EXISTS JI_BaTi_tblBillet (
     
                        bilId INT UNSIGNED NOT NULL AUTO_INCREMENT,
     
                        BaTi_tblCommande_comId INT UNSIGNED NOT NULL,
     
                        BaTi_tblTypeBillet_tybiId INT UNSIGNED NOT NULL,
     
                        BaTi_tblEvent_eveId INT UNSIGNED NOT NULL,
     
                        bilCodeBarre INT NOT NULL,
     
                        bilPDF VARCHAR(255),
     
     
     
                        PRIMARY KEY (bilId),
     
     
     
                        KEY BaTi_tblCommande_comId_FK (BaTi_tblCommande_comId),
     
                        CONSTRAINT BaTi_tblCommande_comId_FK FOREIGN KEY (BaTi_tblCommande_comId) REFERENCES BaTi_tblCommande(_comId),
     
                        KEY BaTi_tblTypeBillet_tybiId_FK (BaTi_tblTypeBillet_tybiId),
     
                        CONSTRAINT BaTi_tblTypeBillet_tybiId_FK FOREIGN KEY (BaTi_tblTypeBillet_tybiId) REFERENCES BaTi_tblTypeBillet(tybiId),
     
                        KEY BaTi_tblEvent_eveId_FK (BaTi_tblEvent_eveId),
     
                        CONSTRAINT BaTi_tblEvent_eveId_FK FOREIGN KEY (BaTi_tblEvent_eveId) REFERENCES BaTi_tblEvent(eveId),
     
     
     
                        CONSTRAINT UNIQUE Unique_CodeBarre (bilCodeBarre)
     
                    ) ENGINE=INNODB   DEFAULT CHARSET=utf8; faite par activate_plugin, do_action('activate_BasickTicketting/index.php'), call_user_func_array, BaTi_Install_Plugin::BaTi_install_DB
     
    [29-Apr-2015 14:11:34 UTC] PHP Notice:  has_cap est appelé avec un argument qui est <strong>déprécié</strong> depuis la version 2.0&nbsp;! L&rsquo;utilisation des niveaux d&rsquo;utilisateur par les extensions et thèmes est désormais interdite. Utiliser les rôles et capacités à la place. in N:\xampp\htdocs\JapanImpact\wp-includes\functions.php on line 3495
     
    [29-Apr-2015 14:11:34 UTC] bla=
     
    [29-Apr-2015 14:11:34 UTC] bla=false
     
    [29-Apr-2015 14:11:35 UTC] bla=false
     
    [29-Apr-2015 14:11:35 UTC] bla=true
     
    [29-Apr-2015 14:11:35 UTC] PHP Notice:  has_cap est appelé avec un argument qui est <strong>déprécié</strong> depuis la version 2.0&nbsp;! L&rsquo;utilisation des niveaux d&rsquo;utilisateur par les extensions et thèmes est désormais interdite. Utiliser les rôles et capacités à la place. in N:\xampp\htdocs\JapanImpact\wp-includes\functions.php on line 3495
    C'est donc une erreur 150 liée aux clés étrangères, mais je ne vois pas ma faute.

    Est-ce que quelqu'un aurait une solution?

    Cordialement
    Faboogy

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    sous WordPress, la création d'un nouvel objet passe plutôt par la création d'un "custom post type"
    Par exemple le code suivant permet de créer une liste d'événements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    add_action("init", function () {
     
        $configuration = array(
            "public" => TRUE,
            "label" => "Événements",
        );
     
        register_post_type("evenement", $configuration);
    });
    Avec ce code, il y a les pages d'administration gérées par WordPress (ajout / modification / suppression) ainsi que l'affichage sur le site à l'adresse http://serveur/evenement/nomDeLEvenement
    En créant des nouveaux types d'objet, on peut ensuite ajouter des champs particuliers comme si on créait une nouvelle table dans la base de données. Sauf que là c'est Wordpress qui fait tout, pas besoin de toucher à la base de données.
    Dans les réglages, il possible d'indiquer que ce type d'objet n'apparait pas sur le site par exemple. Il y a des exemple d'utilisation sur la page de la fonction "register_post_type" :
    http://codex.wordpress.org/Function_...ster_post_type

    et pour la vente ainsi que la gestion des clients, il y a la fantastique extension gratuite WooCommerce


    voilà pour la partie information. maintenant si tu veux quand même passer par la création de tables, c'est comme tu veux, ça dépends quels sont tes objectifs

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2012
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2012
    Messages : 131
    Points : 242
    Points
    242
    Par défaut
    tu as oublié le prefixe ici REFERENCES BaTi_tblClient

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Apprenti informaticien
    Inscrit en
    Août 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Apprenti informaticien

    Informations forums :
    Inscription : Août 2014
    Messages : 35
    Points : 35
    Points
    35
    Par défaut
    mathieu:

    J'avoue que je ne comprends pas comment fonctionne ce "custom post type", mais si je peux éviter de modifier la base de données, je suis vivement intéressé. Est-ce que tu pourrais m'expliquer le concept?

    Le projet d'école que je dois réaliser consiste à créer un plugin qui permet de créer des événements, la vente de billets pour ceux-ci et la génération de ces billets. Le plugin WooCommerce, me semble-t-il, permet de faire tout cela, ce ne serait donc pas correct que je l'utilise, mais merci quand même.

    selmouadin:

    Ce que tu m'indiques c'est d'écrire ceci?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    KEY BaTi_tblCommande_comId_FK (BaTi_tblCommande_comId),
                        CONSTRAINT BaTi_tblCommande_comId_FK FOREIGN KEY (BaTi_tblCommande_comId) REFERENCES {$wpdb->prefix}BaTi_tblCommande(_comId)
    Si c'est le cas, j'ai essayé, mais malheureusement cela ne me permet pas de créer les deux tables manquantes.

    Merci à vous deux pour l'aide que vous m'apportez.

  5. #5
    Membre expérimenté

    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2011
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 049
    Points : 1 689
    Points
    1 689
    Billets dans le blog
    2
    Par défaut
    Pourquoi vouloir réinventer la roue ?
    Il existe toute une série de plugins qui servent à ça. Voir sur http://www.wordpress.org/plugins/

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Apprenti informaticien
    Inscrit en
    Août 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Apprenti informaticien

    Informations forums :
    Inscription : Août 2014
    Messages : 35
    Points : 35
    Points
    35
    Par défaut
    C'est un projet d'école sur lequel je serai noté, dans mon cas c'est justement le but de réinventer la roue ^^'

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Apprenti informaticien
    Inscrit en
    Août 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Apprenti informaticien

    Informations forums :
    Inscription : Août 2014
    Messages : 35
    Points : 35
    Points
    35
    Par défaut
    J'ai regardé les custom post type, je n'ai pas très bien compris, mais je ne crois pas que ce soit très pratique, car j'ai des clés étrangères. Mes éléments doivent être liés.

    Cependant, j'ai trouvé la solution. Il faut d'abord créer la table avec une clé, puis modifier la table et ajouter la contrainte comme ceci:

    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
     
     // table Commande
            $wpdb->query("CREATE TABLE IF NOT EXISTS {$wpdb->prefix}BaTi_tblCommande (
                        comId INT NOT NULL AUTO_INCREMENT,
                        BaTi_tblClient_cliId INT NOT NULL,
                        comDate DATE NOT NULL,
                        comMontantTotal DOUBLE NOT NULL,
     
                        PRIMARY KEY (comId),
     
                        KEY BaTi_tblClient_cliId_FK(BaTi_tblClient_cliId)
     
                    ) ENGINE=INNODB DEFAULT CHARSET=utf8;");
     
            // ajout de la clé étrangère
            $wpdb->query("ALTER TABLE {$wpdb->prefix}bati_tblcommande
                            ADD CONSTRAINT FK_{$wpdb->prefix}bati_tblcommande_{$wpdb->prefix}bati_tblClient FOREIGN KEY (BaTi_tblClient_cliId) REFERENCES {$wpdb->prefix}bati_tblclient (cliId);");
    Merci de votre et bonne continuation !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] Création de composant - Problème à la création dans l'IDE
    Par Jon Shannow dans le forum Lazarus
    Réponses: 4
    Dernier message: 03/12/2012, 10h34
  2. [Hudson] Problème de création de plugin
    Par hannibal.76 dans le forum Intégration Continue
    Réponses: 5
    Dernier message: 11/07/2012, 21h14
  3. Problème de création table InnoDb + Foreign key (150)
    Par Bensor dans le forum Requêtes
    Réponses: 1
    Dernier message: 29/09/2006, 00h17
  4. Réponses: 9
    Dernier message: 05/04/2006, 17h48
  5. Problème de création de table sous MySql
    Par ducamba dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2003, 09h59

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