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

Langage PHP Discussion :

Créer une requête d'importation de données


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 590
    Points : 813
    Points
    813
    Par défaut Créer une requête d'importation de données
    Bonjour,
    Je veux créer une requête d'insertion pour importer des données avec une requête sur le modèle INSERT IGNORE INTO dat_customers ($sCols) VALUES ($sValues)

    A partir d'un tableau:
    je crée une liste de colonnes $sCols en extrayant les clés du tableau et là tout est bon.
    je crée une liste de valeurs $sValues avec des boucles foreach et là, je coince à la ligne 13.
    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
    function importAddresses($data){
    	$db = dbConnect();
    	//var_dump($data);			// OK: renvoie le tableau attendu de la forme 0=>'nom_colonne'=>'une donnée
    	$sCols		= implode(',', array_keys($data[0]));
    	//var_dump($sCols);			// OK: renvoie la liste des colonnes
    	$sValues	= '';
    	foreach($data as $key=>$aValues){
    		foreach($aValues as &$sValue){
    			$sValue = $db->quote($sValue);
    		}
    		unset($sValue);
    		var_dump($aValues);		// OK: renvoie les bons tableaux
    		$sValues .= "(".implode(',',$aValues)."),\n";
    		var_dump($sValues);		// Renvoie toujours la première liste. Pourquoi?
    	}
    	exit;		// Pour test uniquement
     
    	$sql = <<<SQL
    INSERT IGNORE INTO dat_customers ($sCols) VALUES
    ($sValues)
    SQL;
    	$sql	= str_replace("),\n)",'))',$sql);
    	$stmt	= $db->query($sql);
    	var_dump($stmt->rowCount());
    	//return $stmt->rowCount();
    }

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    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 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    $data est un tableau d'enregistrements, or ton 1er foreach() se comporte comme si $data était un enregistrement.

    Il faudrait plutôt faire :

    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
    <?php
     
    function importAddresses($data)
    {
        $db = dbConnect();
     
        $sCols = implode(', ', array_keys($data[0]));
     
        $aValues = [];
        foreach ($data as $record) { // Parcours des enregistrements
            foreach ($record as $field => $value) { // Parcours des valeurs de l'enregistrement
                $record[$field] = $db->quote($value); // Echappement de chacune des valeurs
            }
            $aValues[] = '(' . implode(', ', $record) . ')';
        }
     
        $sValues = implode(",\r\n", $aValues);
     
        $sql = <<<SQL
            INSERT IGNORE INTO dat_customers ({$sCols})
            VALUES
            {$sValues}
            SQL;
     
        echo "<pre>{$sql}</pre>";
     
        // ...
    }

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 590
    Points : 813
    Points
    813
    Par défaut
    La requête est maintenant correcte mais j'ai encore un souci:
    La requête s'exécute sans tenir compte du mot clef IGNORE. Je suppose que c'est du à la colonne create_date dont la valeur par défaut est CURRENT_TIMESTAMP qui varie à chaque instant mais que je ne souhaite pas modifier.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    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 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    IGNORE se base uniquement sur la PRIMARY KEY ou un index UNIQUE.

    En as-tu ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 590
    Points : 813
    Points
    813
    Par défaut
    J'ai bien une clef primaire et un index unique sur plusieurs colonnes.
    Je me pose la question sur l'index unique. Ai-je le droit de faire porter cet index sur des colonnes null. Que se passe t-il dans ce cas? J'ai regardé ici mais je ne suis pas sûr de moi. Je vais analyser ma table pour voir si je peux modifier une partie de sa structure en éliminant les null.

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 200
    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 200
    Points : 8 425
    Points
    8 425
    Billets dans le blog
    17
    Par défaut
    Le NULL viendra "fausser" ton index UNIQUE.

    Il faut mettre tes colonnes en NOT NULL et/ou forcer une valeur à place de NULL, 0 par exemple.

    Unique Indexes
    A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. If you specify a prefix value for a column in a UNIQUE index, the column values must be unique within the prefix length. A UNIQUE index permits multiple NULL values for columns that can contain NULL.
    https://dev.mysql.com/doc/refman/8.0...e-index-unique

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/04/2020, 14h25
  2. [XL-2007] Créer une fonction pour importer une donnée du web
    Par tomatotep dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/02/2016, 18h41
  3. Réponses: 3
    Dernier message: 28/03/2015, 09h15
  4. Réponses: 4
    Dernier message: 09/01/2008, 20h10
  5. [Requête/SQL]Importer des données d'une table à l'autre
    Par atlantideD dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/04/2007, 10h46

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