PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 Re : Forum Général PHP » Php, lecture fichier csv pour insertion Mysql » 09-03-2010 23:13:14

Merci beaucoup !! Cette fonction a l'air très interessante, et surtout utile pour la suite  !!

D'ailleur je suis tombé la dessus INSERT ... ON DUPLICATE KEY UPDATE , j'imagine que cela pourrai me servir pour verifier si un enregistrement équivalent existe deja dans ma table.

#2 Re : Forum Général PHP » Php, lecture fichier csv pour insertion Mysql » 09-03-2010 23:13:14

Je continu mon petit script, J'ai donc ajouter quelques élèments afin de tester si les donnees existe deja dans ma base afin d'éviter les doublons.

La ou c'est assez difficile c'est qu'il faut que j'alimente plusieurs table, et que certaines table ont des liaisons. L'id d'un nouvel enregistrement dans une table doit être également ajouté dans une autre.

Voila ou j'en suis

[code php]
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');

$dbname = 'satis';
mysql_select_db($dbname);


if (($handle = fopen("glpi.csv", "r")) !== FALSE)
{
   while (($data = fgetcsv($handle, 1000, ";")) !== FALSE)
   {
   
        $nameequipement    = $data[0];
        $lieu   = $data[1];
        $pcname   = $data[2];
        $mac    = $data[3];
        $serialnumber   = $data[4];
        $mobile   = $data[5];
        $fabricant  = $data[6];
        $osname     = $data[7];
        $detail        = $data[8];
       
        $cas_particulier= explode(">",$lieu);
        $batiment    = $cas_particulier[0];
        $etage       = $cas_particulier[1];
        $roomname   = $cas_particulier[2];
     
        // INSERTION DES SALLES
        // Verification des doublons
        $query = "SELECT max(id_room) FROM room";
        $result = mysql_query($query);
        $data= mysql_fetch_array($result);
       
        $comteur_id_room = $data[0]
       
       
        $sqlv1 = "SELECT roomname FROM room WHERE roomname='$roomname'";
        $reqv1 = mysql_query($sqlv1) or die('Verification de l\'existance de doublons de salle impossible<br/>'.mysql_error());
        $doublon_salle = mysql_fetch_array($reqv1);

        if($doublon_salle==true)
        {
            echo "<li>La salle <strong> '$roomname'</strong> existe déjà dans nos bases</li>";
        }
        else
        {
            $requete = "INSERT INTO room (roomname) VALUES ('$roomname')";
            $req = mysql_query($requete) or die('Impossible de créer une salle<br/>'.mysql_error());
            echo $roomname. ' a été ajouté';
           
            $comteur_id_room+1;
           
        }
       
        echo $compteur_id_room;
       
        // INSERTION DES OS
        // Verification des doublons
        $sqlv2 = "SELECT osname FROM os WHERE osname='$osname'";
        $reqv2 = mysql_query($sqlv2) or die('Verification de l\'existance de doublons de systeme d\'exploitation impossible<br/>'.mysql_error());
        $doublon_osname = mysql_fetch_array($reqv2);
       
        if($doublon_osname==true)
        {
            echo "<li>Le systeme '$osname' existe déjà dans nos bases</li>";
        }
        else
        {
            $requete = "INSERT INTO os (osname) VALUES ('$osname')";
            $req = mysql_query($requete) or die('Impossible de créer un os<br/>'.mysql_error());
            echo $osname. ' a été ajouté';
        }
       
        // INSERTION DE LA CONFIGURATION
        // Verification des doublons
        $sqlv3 = "SELECT pcname FROM pc WHERE pcname='$pcname'";
        $reqv3 = mysql_query($sqlv3) or die('Verification de l\'existance de doublons de configuration impossible<br/>'.mysql_error());
        $doublon_pcname = mysql_fetch_array($reqv3);
       
        if($doublon_pcname==true)
        {
            echo "<li>La configuration '$pcname' existe déjà dans nos bases</li>";
        }
        else
        {
            $requete = "INSERT INTO pc (pcname,detail) VALUES ('$pcname','$detail')";
            $req = mysql_query($requete) or die('Impossible de créer une configuration<br/>'.mysql_error());
            echo $pcname. ' a été ajouté';
        }
       
        // INSERTION DE L'EQUIPEMENT
        // Verification des doublons
        $sqlv4 = "SELECT mac FROM equipement WHERE mac='$mac'";
        $reqv4 = mysql_query($sqlv4) or die('Verification de l\'existance de doublons d\'adresse Mac impossible<br/>'.mysql_error());
        $doublon_mac = mysql_fetch_array($reqv4);
       
        if($doublon_mac==true)
        {
            echo "<li>L\'adresse Mac '$mac' existe déjà dans nos bases</li>";
        }
        else
        {
            $requete = "INSERT INTO equipement (serialnumber, nameequipement, mac, id_room, id_pc, mobile)
                        VALUES ('$serialnumber','$nameequipement','$mac','$id_room','$id_pc','$mobile')";
            $req = mysql_query($requete) or die('Impossible de créer une configuration<br/>'.mysql_error());
            echo $nameequipement. ' a été ajouté';
        }
   
   

    }
    fclose($handle);
}

   

?>

[/code]

Comme on peu le voir, Ma méthode de recherche de doublon et répétitive, je vais donc essayer de fabriquer une fonction afin d'éclaircir ca.
Deuxièmement après certain enregistrement, je vais devoir récupérer l'id de ce dernier afin de l'insérer dans d'autre table. d'ou mes essais  (ligne 36) qui au passage ne marche pas terrible ^^

$query = "SELECT max(id_room) FROM room";
    $result = mysql_query($query);
    $data= mysql_fetch_array($result);
   
    $comteur_id_room = $data[0]

#3 Re : Forum Général PHP » Php, lecture fichier csv pour insertion Mysql » 09-03-2010 23:13:14

Maljuna Kris, j'ai regardé et essayer avec la méthode LOAD DATA INFILE de cette maniere :

LOAD DATA INFILE 'glpi.csv'
        INTO TABLE test
FIELDS
        TERMINATED BY ';'
        ENCLOSED BY '"'
        ESCAPED BY '\\'
LINES
        STARTING BY ''
        TERMINATED BY '\n'
(nom, lieu, modele, mac, numero, type, fabricant, os)

Seulement, il m'arrete l'insertion a la ligne 112 sur un total de 224, mais cela est du a mon fichier CSV (tester avec un fichier bateau de 300 ligne et cela fonctionne sans souci). Ca fonctionne tres bien !! Sauf que j'ai du placer le fichier dans un repertoire du serveur mysql.. (je suis pas tres doué c'est vrai yikes )

Dionisos:

C'est bien le coup du tableau et de comment utiliser les données que je n'avais pas compris !!

Donc $data est le tableau, alimenté par la fonction: fgetcsv.  Du coup il reste plus qu'a recuperé les informations via $data[x] ou X correspond au numero de la colone de mon tableau.

Au passage merci pour la fonction explode(), elle est vraiment génial ^^


Merci encore pour tes explications clair, et ton exemple carrement fonctionnel ! je l'ai adapter a mes besoins et fonctionne parfaitement:
[code php]
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die                      ('Error connecting to mysql');

$dbname = 'loaddata';
mysql_select_db($dbname);




if (($handle = fopen("glpi.csv", "r")) !== FALSE) {
   while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
   
    $nom        = $data[0];
    $lieu        = $data[1];
    $modele        = $data[2];
    $mac        = $data[3];
    $numero     = $data[4];
    $type        = $data[5];
    $fabricant    = $data[6];
    $os            = $data[7];

     $cas_particulier = explode(">",$lieu);
     $batiment     = $cas_particulier[0];
     $etage     = $cas_particulier[1];
     $salle        = $cas_particulier[2];

     $requete = "INSERT INTO test (nom, batiment, etage, salle, modele, mac, numero, type, fabricant, os)
                 VALUES ('$nom', '$batiment', '$etage', '$salle', '$modele', '$mac', '$numero', '$type', '$fabricant', '$os')";
     mysql_query($requete);
    }
  fclose($handle);
}
?>
[/code]

Maljuna Kris: Effectivement, il ne faut pas que j'oublie ca !! Je penser faire une verification avant l'insertion mysql pour verifier si un ou plusieurs champs sont déja present dans ma table. Il est biensur hors de question d'avoir des doublons ou bien de modifier l'id de l'enregistrement, ca serai assez problèmatique lol

#4 Re : Forum Général PHP » Php, lecture fichier csv pour insertion Mysql » 09-03-2010 23:13:14

Qu'est ce qui rend ce script non optimisé ??

Je suis sur de mon CSV, seulement dans ce fichier il faudra faire des traitement avants de pouvoir les inserer dans ma base de donnée.

Je m'explique; Ce fichier contiendra un tableau de 9 colonnes, Dans une de ses collones, la chaine est "BAT_B > ET_2 > b210"

Avant de l'inserer dans ma table, je vais devoir separé cette chaine entre chaque ">" ce qui donnerai 3 chaine au lieu d'une et donc au final pour me retrouver avec un tableau de 11 colonnes et non de 9 comme au début.

Il y'a également autre chose, ce fichier CSV est une mise a jours, et sera utilisé peut etre une fois par mois comme tel, mais bon la quelque soit la méthode la difficulté sera la même.

Je ne sais pas si cette contrainte peut m'empecher d'utiliser la méthode LOAD DATA que tu m'indique (merci pour le lien wink )?!

#5 Forum Général PHP » Php, lecture fichier csv pour insertion Mysql » 09-03-2010 23:13:14

meche
Réponses : 8

Bonjours a tous,

J'aurai besoin de créer un script capable de lire un fichier CSV, comportant plusieurs colonnes, puis de les exploiter en les inserants dans une table (voir plusieurs, mais precedons par étapes lol)

Apres quelques recherche, je suis tombé sur la fonction fgetcsv()

J'ai donc repris l'exemple qui lit le fichier puis affiche les données :

[code php]<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
        $num = count($data);
        echo "<p> $num champs à la ligne $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}
?>[/code]

J'arrive a comprendre a peu pret comment fonctionne ce script, sauf la parti exploitation des données:

for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";

D'après ce qui est expliqué, cette fonction place les données dans un tableau, donc j'imagine que c'est en comprennant comment exploiterun tableau en php que je trouverais ma solution.

Si vous avez une idée, un lien comment exploiter un fichier csv, et si je suis dans le bon concernant les tableaux, je suis prenneur.

Merci

Pied de page des forums

Propulsé par FluxBB