[RESOLU] importation d'un fichier excel ou csv dans une table sql avec un script php

Petit nouveau ! | 3 Messages

27 sept. 2016, 01:57

bonjour a tous..
je suis entrain d'ecrire un script php pour importer des données dans une table et voila le script obtenu a la fin
<?php
try
{
    $pdo = new PDO('mysql:host=localhost;dbname=projetemedia;charset=utf8', 'root', '');
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
//UPLOAD DU FICHIER CSV, vérification et insertion en BASE
if(isset($_FILES["file"]["type"]) != "application/vnd.ms-excel"){
    die("Ce n'est pas un fichier de type .csv");
}
elseif(is_uploaded_file($_FILES['file']['tmp_name'])) {
    //$row = 1;
    if (($handle = fopen($_FILES['file']['tmp_name'], "r")) !== FALSE) {
        fgetcsv($handle);
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $num = count($data);
            for ($c=0; $c < $num; $c++) {
                $col[$c] = $data[$c];
            }

            $col1 = $col[0];
            $col2 = $col[1];
            $col3 = $col[2];
            $col4 = $col[3];
            $col5 = $col[4];
            $col6 = $col[5];
            $col7 = $col[6];
            $col8 = $col[7];
            $col9 = $col[8];
            $col10 = $col[9];
            $col11 = $col[10];

            $req = $pdo->prepare('INSERT INTO entreprise (id, RaisonSociale, Activite, pays, ville, Email, Telephone, Gerant,
AutreContact, TelephoneDirecteur, EmailDirecteur, Fonction) VALUES(?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');

            $req->execute(array('',$col1, $col2, $col3,$col4, $col5, $col6, $col7,$col8, $col9, $col10, $col11));

        }
        fclose($handle);

    }
}
?>
. Mais je n'obtiens pas le resultat souhaiter.


voici mon code pour importer le fichier
<form enctype="multipart/form-data" action="import.php" method="POST">
    <div class="form-group">
        <input name="file" type="file" />
        <p><input type="submit" value="Envoyez le fichier" /></p>
    </div>
</form>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 sept. 2016, 12:44

salut,

qu'elle est le problème ?
sans cela il est difficile de t'aider.

pour l'exploitation du fichier regarde plutôt des couples file_get_content / str_getcsv ou de splfileobject qui facilite la lecture de csv http://php.net/manual/fr/splfileobject.fgetcsv.php

exemple
<?php
// connexion avant
// la préparation de la requête ne se fait qu'une seule fois
$req = $pdo->prepare('INSERT INTO entreprise ( RaisonSociale, Activite, pays, ville, Email, Telephone, Gerant,
AutreContact, TelephoneDirecteur, EmailDirecteur, Fonction) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
// ouverture du fichier
$file = new SplFileObject($_FILES['file']['tmp_name']);
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $row) {
    $req->execute([$row[0], $row[1], $row[2], $row[3], $row[4], $row[5], $row[6], $row[7], $row[8], $row[9], $row[10]]);
}
$req->close();

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 3 Messages

28 sept. 2016, 03:25

Merci a vous, en fait quand je charge le fichier et que je clique sur envoyer , j'obtiens une page blanche sans message d'erreur mais je retrouve pas les objets dans la base de données.. donc je ne peux pas savoir ce qu'ils faut corriger...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 sept. 2016, 10:17

je viens de tester ton code (et le miens) avec succès (j'ai corriger la fermeture du curseur).
Il faut que tu débogue ton code pas à pas pour voir ce qui se passe.
est ce que les données sont conforme à ce que tu attends ? (nombre de colonne type de données etc.
Ajoute des else à tes if / elseif pour avoir un message en cas de "cas" non prévu

tu peux afficher $data avec un var_dump($data) pour vérifier cela.

pour mes tests j'ai créé une table simple
CREATE TABLE `entreprise` (
  `id` int(11) DEFAULT NULL,
  `RaisonSociale` varchar(50) DEFAULT NULL,
  `Activite` varchar(50) DEFAULT NULL,
  `pays` varchar(50) DEFAULT NULL,
  `ville` varchar(50) DEFAULT NULL,
  `Email` varchar(50) DEFAULT NULL,
  `Telephone` varchar(50) DEFAULT NULL,
  `Gerant` varchar(50) DEFAULT NULL,
  `AutreContact` varchar(50) DEFAULT NULL,
  `TelephoneDirecteur` varchar(50) DEFAULT NULL,
  `EmailDirecteur` varchar(50) DEFAULT NULL,
  `Fonction` varchar(50) DEFAULT NULL
)
le code php corrigé et fonctionnel
<?php
if (!empty($_FILES['file'])) {
    try {
        $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '', [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'']);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->exec('delete from entreprise');
    } catch (Exception $e) {
        die('Erreur : '.$e->getMessage());
    }
    //UPLOAD DU FICHIER CSV, vérification et insertion en BASE
    if (isset($_FILES["file"]["type"]) != "application/vnd.ms-excel") {
        die("Ce n'est pas un fichier de type .csv");
    } elseif (is_uploaded_file($_FILES['file']['tmp_name'])) {
        $req = $pdo->prepare('INSERT INTO entreprise ( RaisonSociale, Activite, pays, ville, Email, Telephone, Gerant,
    AutreContact, TelephoneDirecteur, EmailDirecteur, Fonction) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
        $file = new SplFileObject($_FILES['file']['tmp_name']);
        $file->setFlags(SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY);
        foreach ($file as $row) {
            $req->execute([$row[0], $row[1], $row[2], $row[3], $row[4], $row[5], $row[6], $row[7], $row[8], $row[9], $row[10]]);
        }
        $req->closeCursor();
    } else {
        echo 'epic fail<br />';
    }
}
?>

<form enctype="multipart/form-data" action="" method="POST">
    <div class="form-group">
        <input name="file" type="file" />
        <p><input type="submit" value="Envoyez le fichier"/></p>
    </div>
</form>
Le fichier de test : https://gist.github.com/anonymous/b69f9 ... 55a3a6fa86

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 3 Messages

29 sept. 2016, 03:51

merci a vous , tout marche trés bien desormais

Petit nouveau ! | 4 Messages

08 juin 2018, 18:12

Bonjour,

Je cherche à importer une fichier CSV, malgré de nombreuses heures passées dessus, rien qui ne fonctionne, mais j'ai trouvé ce script très intéressant, mais je voudrais savoir à quoi renvoie ce fichier
if(isset($_FILES["file"]["type"]) != "application/vnd.ms-excel"){

Merci de votre aide!
Cordialement

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 juin 2018, 22:18

Salut,

La réponse est la : http://php.net/manual/fr/features.file- ... method.php
Il s'agit de comparer le type mime du fichier.
Utiliser l’extension n'est pas fiable (garde facilement modifiable).

Tu trouveras des infos sur l'upload de fichier : https://www.phpjungle.info/articles/10- ... -http.html

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

15 juin 2018, 14:27

Salut,

La réponse est la : http://php.net/manual/fr/features.file- ... method.php
Il s'agit de comparer le type mime du fichier.
Utiliser l’extension n'est pas fiable (garde facilement modifiable).

Tu trouveras des infos sur l'upload de fichier : https://www.phpjungle.info/articles/10- ... -http.html

@+
D'accord merci de votre réponse, mas je ne pense pas avoir bien compris le principe.
J'insert un fichier CSV, et donc grâce à ce code ça devrait me permettre d'éviter d'envoyer un fichier excel ou autre dans la bse de donnée si j'ai bien compris? Parce que j'ai essayé, mais un fichier excel passe quand même et donc je voudrais éviter, et le limiter que aux fichiers CSV.
Merci de votre aide
//UPLOAD DU FICHIER CSV, vérification et insertion en BASE
                        if (isset($_FILES["file"]["type"]) != "application/vnd.ms-excel") {
                            die("Ce n'est pas un fichier de type .csv");

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

15 juin 2018, 23:54

Les fichiers Excel et les fichiers CSV ont le même Mime Type sous Windows (quand Excel est installé), je pense que le test du mime-type n'est pas pertinent, d'autant qu'il me semble que sous Linux, le mimetype d'un fichier CSV est "text/csv"

A ma connaissance, le plus simple est de juste vérifier l'extension.

Le plus sûr est de faire ton traitement dessus en gérant les erreurs (vérifier que le séprateur de champ est bien présent, qu'il y a le même nombre de champs par ligne par exemple), si il n'y a pas d'erreur alors c'est que le format CSV est bien respecté.
Quand tout le reste a échoué, lisez le mode d'emploi...