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 :

importer un CSV avec des champs de type entier vides [PostgreSQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 191
    Points : 78
    Points
    78
    Par défaut importer un CSV avec des champs de type entier vides
    Bonjour,

    J'essaie d'importer un fichier csv dans une table sous PostgreSQL 13 et un formulaire php (ultra-débutant).
    Il y a deux clés étrangères de type integer dans la table, l'une peut être vide. Donc quand j'importe le fichier j'ai le message classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    invalid input syntax for type integer
    pour l'une d'entre elles.

    Voici un extrait du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (($getData = fgetcsv($file, 4096, ';')) !== FALSE)
    			{
    				$sql = "INSERT INTO activite.us (numus, gidaxe)
    				VALUES ('".$getData[1]."','".$getData[11]."') " ;
     
    				$result = pg_send_query($connect, $sql) ;
    La dernière variable $getData[11] lève l'erreur, elle correspond à la clef étrangère qui peut être NULL. D'où l'erreur.
    Malgré de nombreuses et pas toutes comprises réponses, comment faire en sorte que les champs vides soient acceptés à l'import ?
    Merci,

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Une chaîne vide n'est pas équivalente à NULL. Tu peux éventuellement le tester coté PHP pour remplacer dans la requête la chaîne vide par NULL (sans quotes autour), mais tu peux le faire coté SQL en modifiant ta requête de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = "INSERT INTO activite.us (numus, gidaxe)
            VALUES ('".$getData[1]."', NULLIF('".$getData[11]."', '')::integer) " ;
    Au passage, c'est un trou de sécurité que de composer ta requête par concaténation. Utilise PDO avec des requêtes préparées plutôt que les fonctions pg_.... C'est plus sûr et plus performant (entre autre). Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "INSERT INTO activite.us (numus, gidaxe) VALUES (?, NULLIF(?,'')::integer)";
    $sth =  $pdo->prepare($sql);
    $keys = array_flip([1, 11]);
     
    while ( false !== $getData = fgetcsv($file, 4096, ';') ) {
        $sth->execute(array_intersect_keys($getData, $keys));
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 191
    Points : 78
    Points
    78
    Par défaut
    Merci pour la réponse. Cela fonctionne très bien !
    Merci également pour cette mise en garde quant aux concaténations. Mes connaissances étant très limitées en php, je fais au mieux (je pratique rarement malheureusement). Cela dit, l'exemple avec PDO va me permettre de découvrir concrètement de quoi il retourne.
    Merci encore.

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

Discussions similaires

  1. [DATA] Importer fichier csv avec des NA - SAS
    Par celine2906 dans le forum SAS Base
    Réponses: 3
    Dernier message: 23/02/2017, 13h52
  2. Requêtes avec des champs de type array
    Par ZIED dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2011, 10h09
  3. Importer 1 Fichier CSV avec des ";" dans les champs
    Par opaillon dans le forum Import/Export
    Réponses: 3
    Dernier message: 15/01/2009, 14h23
  4. Jointure entre 2 tables avec des champs de types différents
    Par qltmi dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/11/2008, 20h58
  5. Import fichier texte avec des champs variables
    Par joshua12 dans le forum Access
    Réponses: 4
    Dernier message: 26/09/2006, 09h06

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