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 :

PHP PDO CREATE TABLE IF NOT EXISTS


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2019
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2019
    Messages : 137
    Points : 77
    Points
    77
    Par défaut PHP PDO CREATE TABLE IF NOT EXISTS
    Bonjour
    j'essaie de créer une table MySql si elle n'existe pas et y insérer des données.
    J'ai essayé "CREATE TABLE IF NOT EXISTS $myTable".
    La table n'est pas créée (ce qui est bien) mais insert a fonctionné malgré tout et je me suis retrouvé avec la même table avec une ligne en plus (les donnée que j'avais voulu insérer si la table n'existait pas). La ligne précédente existe toujours mais son TimeStamp est mis à jour (les deux lignes ont le même TimeStamp, le plus récent)

    Ce que je souhaite faire est que la table ne subisse aucun changement si elle existe (que Insert ne fonctionne pas si la table existe). Et pourquoi recevoir un message "La table existe déjà"

    Merci

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 243
    Points : 8 522
    Points
    8 522
    Billets dans le blog
    17
    Par défaut
    Ce genre de considération laisse penser clairement à un mauvais modèle de données.

    Si tu décides de poursuivre dans cette (mauvaise) voie, alors pour avoir un résultat exploitable il faudra interroger la base système information_schema et sa table tables qui référence les différentes tables créées :

    $sql = <<<SQL
        select all exists (
            select all *
            from information_schema.tables
            where true
                and table_schema = {$pdo->quote($ta_bdd)}
                and table_name = {$pdo->quote($ta_table)}
        ) as is_table_exists
        SQL;
    Le résultat contiendra une unique ligne et une unique colonne is_table_exists valorisée TRUE ou FALSE selon si la table en paramètre existe ou non.

  3. #3
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2019
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2019
    Messages : 137
    Points : 77
    Points
    77
    Par défaut
    Merci beaucoup SEB

    j'ai utilisé
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    prepare("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA ='nom_de_ma_bse_de_donnees'");
    .
    ensuite j'ai déclaré un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_array_de_tables=[];
    ensuite j'ai effectué un fetch et mis tous les noms de tables dans le tableau "mon_array_de_tables"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while($mon_array = $pdo->fetch(PDO::FETCH_ASSOC)){
       if (in_array($ma_table, $mon_array )) {
          array_push($mon_array_de_tables,$ma_table);
       }
    }
    ensuite j'ai terminé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (in_array($ma_table, $mon_array_de_tables)) 
      {
        echo('Cette table existe déjà');
    }
    else{
    // CREATE la table ............
    // INSERT dans la table .......
    Cela fonctionne bien

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 243
    Points : 8 522
    Points
    8 522
    Billets dans le blog
    17
    Par défaut
    Est-ce l'objectif unique de $mon_array_de_tables ?
    Si oui on perd l'intention, ce qui rend le code inutilement lourd et difficile à lire

    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
    $ta_base = 'nom_de_ta_base';
    $ta_table = 'nom_de_la_table_à_chercher';
     
    $sql = <<<SQL
        select all exists (
            select all *
            from information_schema.tables
            where true
                and table_schema = {$pdo->quote($ta_bdd)}
                and table_name = {$pdo->quote($ta_table)}
        ) as is_table_exists
        SQL;
     
    $is_present = $pdo->query($sql)->fetchColumn();
     
    if ($is_present) {
        echo 'Cette table existe déjà';
    } else {
        // ...
    }

  5. #5
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2019
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2019
    Messages : 137
    Points : 77
    Points
    77
    Par défaut
    Merci Seb. Cela fonctionne merveilleusement bien. J'avais concocté à ma manière une formule en utilisant un tableau sans réfléchir sur le reste. Bravo mec !

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 347
    Points : 39 746
    Points
    39 746
    Billets dans le blog
    9
    Par défaut
    Même remarque que dans cet autre fil de discussion
    https://www.developpez.net/forums/d2.../#post12028415


    Citation Envoyé par escartefigue Voir le message
    Pourquoi vouloir générer du DDL (ordres DROP, CREATE et ALTER) depuis une application ? Quel est le besoin ?

    Le DDL requiert des privilèges particuliers que n'ont que très rarement, pour ne pas dire jamais, les utilisateurs des applications métier.
    C'est pourquoi il est préférable de créer les objets base de données à l'extérieur des applications

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

Discussions similaires

  1. create table if not exists
    Par olibara dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 18/03/2010, 16h01
  2. AS400 Probleme de Create table if not exists
    Par mczikas dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 24/02/2009, 17h04
  3. Create procedure if not exists ?
    Par mappy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2008, 17h57
  4. provider 0x80040E37 table does not exist
    Par steph04 dans le forum ASP
    Réponses: 8
    Dernier message: 29/04/2005, 10h56
  5. [DB2] create table... if not exists ?
    Par iubito dans le forum DB2
    Réponses: 6
    Dernier message: 23/03/2004, 18h26

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