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 :

fgetcsv et INSER INTO Souple [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut fgetcsv et INSER INTO Souple
    Bonjour à tous;

    J'ai bien bossé le fgetcsv
    et je récupère le tout dans des array
    le but est bien sur de faire un INSERT INTO, donc avec SET id = :id, Nom = :Nom, etc
    mais le problème c'est que les csv ont
    • Un nombre de colonnes différents
    • Des noms de colonnes différents

    alors le nombre de SET va changer.

    J'ai fait ca
    1. Lire le csv

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    OK
    Mais les arrays sont de la forme [0] => 1, [1] => Le nom etc...
    Et pour le array de execute() il aurait fallu [id] => 1, [Nom] => Le nom etc...

    Alors je tente:
    1. De récupérer les entetes dans un array

    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
    $arrayName = array();
    if ($i==0) 
    	{ // Créer les en tetes
    	$num = count($data); echo "Num=".$num;
        	echo "<br/>";
        	for ($n=0; $n < $num; $n++) 
        		{ 
            		//echo $data[$n]."<br/>";
            		array_push($arrayName,$data[$n]);
        		}
        	// print_r($arrayName);
        	for ($d=0; $d < $num; $d++) { 
        	 	echo $arrayName[$d].' / ';
    	 } 
    }
    Ok

    Et là il faudrait créer un array des lignes suivantes avec comme entete l'arrayName précédent ?

    Qu'en pensez-vous ?
    Je pense que je galère bien, en tout cas


  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    C'est plus simple de ne me pas nommer les paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
       if (!isset($sth)) {   
                  $sth = $pdo->prepare('INSERT INTO ' . $table . ' VALUES (' . implode(',', array_fill(0, count($data), '?')) . ')');
       }
       else {
                  $sth->execute($data);
       }
    }   
    unset($sth);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Waouh !
    Ca claque


    J'essaye ça !

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    En lancant des print_r pour $data et s$sth on a


    $Data= Array ( [0] => 11 [1] => [2] => Semi mat [3] => 1 )
    Ok
    Pour $sth:
    $sth= PDOStatement Object ( [queryString] => INSERT INTO finitions VALUES (?,?,?,?) )

    Ben ouais mais ca marche
    Super Sabotage Merci !!!

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut Protéger des injections
    Bonjour,
    Pour protéger l'application des injections,
    j'ai tenté d'importer un .csv avec <u/>DD</u>
    et comme protection j'ai fait:
    • un mysql_real_escape_string() sur le array_fill > C'est pô bon.
    • htmlspecialchars sur le ('?') > pas d'erreur mais ca garde les <u>
    • htmlentities sur le ('?') > idem


    Vous auriez une idée ?

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Ce que tu tentes là, c'est une injection XSS, en l’occurrence l'ajout de code exécutable à l'affichage de la page. En général on tente <script>alert('BOUM!')</script>, si tu as une popup "BOUM!", c'est pas bon.

    mysql_real_escape_string protège des injections SQL, qui magouillent les requêtes en base de donnée. Ce n'est pas ton cas, donc il est normal que ça ne fasse rien dessus. (Et de toute façon, si tu utilises PDO et les requêtes préparéescorrectement, tu es déjà protégé, inutile de mélanger mysql_real_escape_string dans l'affaire)

    htmlentities et htmlspecialchars protègent des injections de HTML en "neutralisant" le HTML pour qu'il doit affiché et non "exécuté". Dans l'exemple de l'alert('BOUM!') que je citais au-dessus, ça va écrire "alert('BOUM!')" au lieu de faire la popup. Tu es donc bien protégé, mais évidement c'est moche vu que ça écrit le code html dans la page.

    Si tu veux retirer des balises html d'une chaine, regarde du côté de strip_tags.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Bonjour Célira, merci de la réponse

    J'ai fait pas mal d'essais

    Le Strip_tags n'est pas possible sur le $data qui est un array.

    J'ai l'impression qu'il va falloir que je le fasse sur chacune de ses valeurs.
    et que je le reconstruise ensuite.

    Une bonne idée ?

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Le fait que $data soit un tableau n'empeche pas d'utiliser strip_tags sur chacun des éléments à l'interieur par un boucle.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    C'est ce que je pensais
    et recréer le tableau ensuite.
    Merci

  10. #10
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Tu peux aussi utiliser la fonction array_​map pour appliquer la fonction à tout le tableau (évidement, si c'est un tableau de tableaux, ça va devenir plus compliqué)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  11. #11
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Je vais regarder array_map.

    Toutefois j'ai bricolé ca, dans la boucle du while
    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
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) 
    	{  
    		// D'ci 
                    $i=0;
    		foreach ($data as $key => $value) { 
    		$data[$i] = strip_tags($value); 
    		echo strip_tags($data[$i]); 
    		$i++;
    		}
    		echo "<br/>Data= ";  print_r($data); echo "<br>"; 
                    // jusque là
       if (!isset($sth)) 
       	{   
        	$sth = $bdd->prepare('INSERT INTO ' . $table . ' VALUES (' . implode(',', array_fill(0, count($data), '?')) . ')');
       	}
       else { // echo "Sth= "; print_r($sth); echo "<br>";
            $sth->execute($data);
            $Nb++;
       	}
    }
    (avec des echo et print pour vérifier)

    Le boum ne passe pas.

    Ca vous semble correct ?

  12. #12
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Si le but est d'enregistrer le fichier CSV dans une table, pourquoi ne pas utiliser une requête LOAD DATA INFLE ?
    https://dev.mysql.com/doc/refman/5.1/en/load-data.html
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Si le but est d'enregistrer le fichier CSV dans une table, pourquoi ne pas utiliser une requête LOAD DATA INFLE ?
    https://dev.mysql.com/doc/refman/5.1/en/load-data.html
    Ah je ne connais pas (encore),

    Sinon apres des essai je remarque que mon code n'importe pas
    les champs qui commencent par 1 chiffre
    (Bien que le type de champs soit Varchar 250 utf8_bin)

    Z'auriez une idée du pourquoi ?

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

Discussions similaires

  1. [MySQL] inser into avec variable php
    Par gwendoline-bricout dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 16/10/2013, 09h47
  2. [PDO] PDO MySQL INSERT INTO rien ne s'insere.
    Par jano_dave dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/12/2009, 10h49
  3. Réponses: 7
    Dernier message: 30/03/2006, 07h49
  4. [VB6] [Excel] Insérer une image dans une feuille
    Par mathias dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 09/10/2002, 07h44
  5. Inserer Un Menu dans un autre en execution
    Par apt dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2002, 11h22

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