Page 1 sur 1

Importer un fichier CSV dans une bdd

Posté : 10 juin 2015, 16:12
par blinz
Salut à tous,
Je cherche à rentrer ds ma base de données plusieurs champs

J'arrive en gros à lire mon CSV et l'afficher à l'écran grace à :
<?php
$ligne = 1
$fic = fopen("source.csv", "a+");
while($tab=fgetcsv($fic,1024,';'))
{
$champs = count($tab);
echo "<b> Les " . $champs . " champs de la ligne " . $ligne . " sont :</b><br />";
$ligne ++;

for($i=0; $i<$champs; $i ++)
{
echo $tab[$i] . "<br /><br>";
}
}
?>
Ce qui nous renvoi par exemple:
Les 1 champs de la ligne 3 sont :
VENOM INC + VADER,"29/09/2015 19:00","31200 | TOULOUSE | FR","http://www.url/images/picto_g.gif","29/09/2015 00:00:00","29/09/2015 00:00:00","21.80"

Je souhaite maintenant tout simplement insérer ça en bdd.

Ma bdd se présente de la façon suivante,
titre, date début, date fin, heure, codepostal, ville, url_type

Donc faire un INSERT INTO ma table.... mais comment faire avec les infos récupérer, merci pour votre aide par avance.

Re: Importer un fichier CSV dans une bdd

Posté : 10 juin 2015, 16:21
par tof73
l'ordre dans le csv ne changeant pas, tu as les données dans $tab[2], $tab[4], $tab[0] ...

Re: Importer un fichier CSV dans une bdd

Posté : 10 juin 2015, 16:35
par blinz
C'est à dire quelque chose comme ça ?
<?php
	include('conndb.php');
	

    if (file_exists("source.csv"))
    {
    echo "La taille du fichier est de :" . filesize("source.csv")." octets<br><br>"; 
    }
    else
    {
    echo "Fichier inexistant<br><br>";
    }
    

	$ligne = 1;
	$fic = fopen("source.csv", "a+");
	while($tab=fgetcsv($fic,1024,';'))
	{
		$champs = count($tab);
		echo "<b> Les " . $champs . " champs de la ligne " . $ligne . " sont :</b><br />";
		$ligne ++;
		
		for($i=0; $i<$champs; $i ++)
		{
		echo $tab[$i] . "<br /><br>";
		}
	}


		$req = $bdd->prepare('INSERT INTO loisir (titre) VALUES(:'.$tab[0]);	
		$req->execute(array(
				  'titre'=>$tab[0]
				  )) or die('Problème lors de l\'insertion');

	?>
Merci encore pour me coup de main ;)

Re: Importer un fichier CSV dans une bdd

Posté : 10 juin 2015, 17:22
par Ryle
Si ta requête est en dehors de ton while, seul la dernière ligne du fichier csv sera inséré en base ;)

Attention également car ta requête SQL n'est pas correcte. SI tu utilises une requête préparée, il ne faut pas utiliser de variable dans ton SQL (:titre et non :$tab[0]). De plus il manque la parenthèse de fin du VALUES :)

Re: Importer un fichier CSV dans une bdd

Posté : 10 juin 2015, 18:57
par blinz
En fait si vous voulez mes colonne CSV sont les suivantes:
titre,"ProductLongDescription","ExtraTextTwo","ImageLargeURL","ValidFromDate","ValidToDate","ProductPrice"

Apres j'ai mon traitement php qui me ressort correctement ligne par ligne les valeurs:
exemple ligne 3:

champs de la ligne 3 sont :
TEXAS,"04/12/2015 19:00","4361 | ESCH SUR ALZETTE | LU","http://www.fnacspectacles.com/static/0/ ... 04/12/2015 00:00:00","04/12/2015 00:00:00","41.20"

Je cherche maintenant à intégrer ceci ds ma bdd
/ Insertion
		$req = $bdd->prepare('INSERT INTO loisir (titre) VALUES(:titre)');	
		$req->execute(array(
				  'titre'=>$titre
				  )) or die('Problème lors de l\'insertion');
Mais voilà je m'y pers un peu, merci de votre aide.

Re: Importer un fichier CSV dans une bdd

Posté : 10 juin 2015, 23:31
par moogli
salut,

voici un exemple fonctionnel de ce que tu veux.
c'est basé sur une base sqlite en mémoire pour le test, il te suffit de changer la connexion pour utiliser ton sgbd.
L'accès au SGBD est fait avec PDO, et l'insertion utilise une requête préparée (c'est fait pour ça ;)).
<?php

//titre,debut,ville,url,fin,fin,heure
//0 , 1 , 2 3, 4, 5, 6
// code de création de la table pour le test
$create = <<<create
create table loisir (
titre varchar, date_debut varchar, date_fin varchar, heure varchar, codepostal varchar, ville varchar, url_type varchar
);
create;
// la requête insert
$insert = 'insert into loisir (titre, date_debut, date_fin, heure, codepostal, ville, url_type) values (:titre, :date_debut, :date_fin, :heure, :codepostal, :ville, :url_type)';
try {
    // instance de PDO, ici un base sqlite memory, à toi de voir pour ton sgbd
    $pdo = new PDO('sqlite::memory:', null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);
    //création de la table en mémoire
    $pdo->exec($create);
// préparation de la requête inserte
    $stmt = $pdo->prepare($insert);

    // accès au fichier csv
    $file = new SplFileObject("test.csv");
// parcourt du fichier
    while (!$file->eof()) {
        // on récupère la ligne courante sous forme csv
        $csv = $file->fgetcsv();
        // bind sur la marqueur correspondant
        $stmt->bindParam(':titre', $csv[0]);
        $stmt->bindParam(':date_debut', $csv[1]);
        $stmt->bindParam(':date_fin', $csv[4]);
        $stmt->bindParam(':heure', $csv[5]);
        // je récupère les infos dnas le champ
        list($cp, $ville, $pays) = explode('|', $csv[2], 3);
        $stmt->bindParam(':codepostal', $cp);
        $stmt->bindParam(':ville', $ville);
        $stmt->bindParam(':url_type', $csv[3]);
// insertion en base
        $stmt->execute();
    }
    // fermeture de la requête préparée
    $stmt->closeCursor();
// vérification (pour voir si le test fonctionne
    $datas = $pdo->query('select * from loisir');
    while ($data = $datas->fetch(PDO::FETCH_ASSOC)) {
        var_dump($data);
    }
    $datas->closeCursor(); // fermeture du curseur
} catch (Exception $e) {
    var_dump($e);
}
@+