8768 sujets

Développement web côté serveur, CMS

Bonjour à tous!

Je vous explique ma situation :
je dois récupérer des données excel qui sont au format csv, et les intégrer dans une BDD phpmyadmin (j utilise PDO).

Je réalise une interface en php qui proposent un bouton d'importation qui gere automatiquement cette intégration.
en gros : un bouton qui ouvre un explorateur de fichiers, on choisi le csv que l'on veut, on valide et hop le csv est converti directement dans la BDD.

Ceci me paraît assez difficile vu mon niveau. Ce sera un utilisateur quelconque, qui ne devra rien faire d'autre que d'importer le fichier, sans gérer les paramètres de la BDD, d'où cette interface simplifiée que je dois créer...

y a-t-il quelqu'un qui a déjà été confronté à cette situation et/ou qui pourrait m aider Smiley biggrin ?

Voici mon formulaire:

        <form name="upload" method="post" action="index.php?action=envoyer&nav=Desabonnement.php?" enctype="multipart/form-data" accept-charset="utf-8" class="form-desabo">
            <div class="row desabo-row">
                <div class="col-md-12 col-md-offset-3 center desabo-container">
                    <label for="sepateur">Choisissez le separateur ( , / ; - ..)</label><br>
                    <input type="text" name="separateur" id="separateur"><br>
                    <label for="sepateur">Choisissez le delimiteur ( " [ ] ; - ..)</label><br>
                    <input type="text" name="delimiteur" id="delimiteur"><br>
                    <label for="ignore">Nombre de ligne à ignorer</label><br>
                    <input type="text" name="ignore" id="ignore"><br>
                    <label for="import">N° champ a importer</label><br>
                    <select name="import" id="import">
                        <option value="1">1</option>
                        <option value="2">2</option>
                        <option value="3">3</option>
                        <option value="4">4</option>
                        <option value="5">5</option>
                        <option value="6">6</option>
                        <option value="7">7</option>
                        <option value="8">8</option>
                        <option value="9">9</option>
                        <option value="10">10</option>
                        <option value="11">11</option>
                        <option value="12">12</option>
                        <option value="13">13</option>
                        <option value="14">14</option>
                        <option value="15">15</option>
                    </select>
                    <div class="btn-container">
                        <h1 class="imgupload"><i class="fa fa-file-image-o"></i></h1>
                        <h1 class="imgupload ok"><i class="fa fa-check"></i></h1>
                        <h1 class="imgupload stop"><i class="fa fa-times"></i></h1>
                        <p id="namefile">Accepte les .txt /.csv </p>
                        <button type="button" id="btnup" class="btn btn-primary btn-lg">Posez-le ici!</button>
                        <input type="file" value="" name="fileup" id="fileup">
                    </div>
                </div>
            </div>
                <div class="col-md-12  desabo-submit">
                    <input type="submit" value="Submit!" class="btn btn-primary" id="submitbtn">
                    <button type="button" class="btn btn-default" disabled="disabled" id="fakebtn">Envoyer <i class="fa fa-minus-circle"></i></button>
                </div>
            
                    </form>


Et un petit traitement que j ai fait pour lire le CSV


            $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);
            }[img]upload/1542030486-73234-screen.png[/img] 

Modifié par leacode22 (12 Nov 2018 - 14:48)
Salut

Donc si j'ai bien compris, tu arrive déjà à "lire" ton csv via le PHP ? sans erreur ?

Si c'est le cas, super.. il suffit simplement de préparer des requêtes avec PDO et d'insérer les values avec ce qui se trouve dans $data. Tu as juste besoin de faire le liens entre les champs de ta base et tes data.
Helloo Smiley lol

Yes merci pour ton conseil Smiley smile Mais avant j'aimerais pouvoir lire un fichier csv que je récupère dans input type file, et ca j y arrive pas Smiley bawling
Non pas pour le moment mais quand j essaye de récupérer un fichier via $_FILES et non par "test.csv" ca ne fonctionne plus Smiley ohwell
Quand tu téléverses (upload) un fichier sur un site Web, il est d'abord stocké dans un fichier temporaire. Il faut donc travailler avec ce fichier temporaire.
Pour voir ce que ton formulaire envoie au serveur crée un fichier "variables.php" et met le au même endroit que ton traitement du $_POST avec cette simple ligne :
<?php phpinfo(INFO_VARIABLES); ?>

Modifie l'attribut "action" dans <form> pour qu'il pointe sur ce fichier
Et regarde ce que contient la variable $_FILES.
Tu as un tuto plus détaillé ici avec le lien ci-dessous :
https://antoine-herault.developpez.com/tutoriels/php/upload/
Donc tu dois travailler avec le fichier $_FILES['fileup']['tmp_name'] et non avec 'test.csv' qui n'existe pas à ce stade.
Maintenant que t as retrouvé le fichier tu peux utiliser la fonction fgetcsv pour parser ton tableau :
http://php.net/manual/fr/function.fgetcsv.php
tu peux aussi ajouter à <form> accept="text/csv, */*" pour sélectionner directement les fichiers CSV.
Modifié par bazooka07 (12 Nov 2018 - 21:56)
Meilleure solution
Merci pour vos conseilles c est super de m'aider, je me sent moins seule face a mon problème Smiley langue J ai fait le var_dump($_POST) mais ça ne me retourne rien, quand je valide le formulaire j ai une " Fatal error: Call to undefined function Envoyer() in C:\wamp64\www\the-harbounce-project\fonction\action\action.php on line 10"

Ma fonction est appeler sur une autre page qui s appelle action.php qui contient ceci

if(isset($_GET['action'])){
    if($_GET['action']=="rechercher"){
        $search_hardbounce = SearchHardbounce($db, $_POST);
    }elseif ($_GET['action']=="ajouter") {
        AjouterHardbounce($db, $_POST);
    }elseif ($_GET['action']=="upload") {
        $envoyer = Envoyer($_FILES['fileup']['tmp_name'], $_POST['separateur']);
        
    }
}


Toutes les fonctions que j appelle dans ce fichier fonctionne sauf celle-ci .. Smiley decu

Je vous montre ma fonction avec mon formulaire:


                  
<form name="upload" method="post" action="index.php?action=upload&nav=Desabonnement.php" enctype="multipart/form-data" accept-charset="utf-8" class="form-desabo">
            <div class="row desabo-row">
                <div class="col-md-12 col-md-offset-3 center desabo-container">
                    <label for="sepateur">Choisissez le separateur ( , / ; - ..)</label><br>
                    <input type="text" name="separateur" id="separateur"><br>
                    <label for="sepateur">Choisissez le delimiteur ( " [ ] ; - ..)</label><br>
                    <input type="text" name="delimiteur" id="delimiteur"><br>
                    <label for="ignore">Nombre de ligne à ignorer</label><br>
                    <input type="text" name="ignore" id="ignore"><br>
                    <label for="import">N° champ a importer</label><br>
                    <select name="import" id="import">
                        <option value="1">1</option>
                        <option value="2">2</option>
                        <option value="3">3</option>
                        <option value="4">4</option>
                        <option value="5">5</option>
                        <option value="6">6</option>
                        <option value="7">7</option>
                        <option value="8">8</option>
                        <option value="9">9</option>
                        <option value="10">10</option>
                        <option value="11">11</option>
                        <option value="12">12</option>
                        <option value="13">13</option>
                        <option value="14">14</option>
                        <option value="15">15</option>
                    </select>
                    <div class="btn-container">
                        <h1 class="imgupload"><i class="fa fa-file-image-o"></i></h1>
                        <h1 class="imgupload ok"><i class="fa fa-check"></i></h1>
                        <h1 class="imgupload stop"><i class="fa fa-times"></i></h1>
                        <p id="namefile">Accepte les .txt /.csv </p>
                        <button type="button" id="btnup" class="btn btn-primary btn-lg">Posez-le ici!</button>
                        <input type="file" value="" name="fileup" id="fileup">
                    </div>
                </div>
            </div>
                <div class="col-md-12  desabo-submit">
                    <input type="submit" value="Submit!" class="btn btn-primary" id="submitbtn">
                    <button type="button" class="btn btn-default" disabled="disabled" id="fakebtn">Envoyer <i class="fa fa-minus-circle"></i></button>
                </div>
            
</form>

        function Envoyer($filecsv, $separateur){
            $row = 1;   
            var_dump($_POST);
            if (($handle = fopen($filecsv, "r")) !== FALSE) {
                while (($data = fgetcsv($handle, 1000, $separateur)) !== 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);
            }
        }     



Je suis vraiment pas caler pour ce genre de truc je n'avais jamais d'import de donnée sur une base de donnée au par avant ^^
Merci beaucoup pour vos conseille ca m as bien faite avancer !! Smiley lol

Voila ou j en suis:
J arrive a upload le fichier en csv et a la lire, reste plus qu as le mettre en BDD, faut-il que je fasse une requette INSERT et le tour est jouer ? Smiley smile

        <form name="upload" method="post" action="index.php?nav=Desabonnement.php" enctype="multipart/form-data" class="form-desabo">
            <div class="row desabo-row">
                <div class="col-md-12 col-md-offset-3 center desabo-container">
                    <label for="sepateur">Choisissez le separateur ( , / ; - ..)</label><br>
                    <input type="text" name="separateur" id="separateur"><br>
                    <label for="sepateur">Choisissez le delimiteur ( " [ ] ; - ..)</label><br>
                    <input type="text" name="delimiteur" id="delimiteur"><br>
                    <label for="ignore">Nombre de ligne à ignorer</label><br>
                    <input type="number" name="ignore" id="ignore"><br>
                    <label for="import">N° champ a importer</label><br>
                    <select name="import" id="import">
                        <option value="1">1</option>
                        <option value="2">2</option>
                        <option value="3">3</option>
                        <option value="4">4</option>
                        <option value="5">5</option>
                        <option value="6">6</option>
                        <option value="7">7</option>
                        <option value="8">8</option>
                        <option value="9">9</option>
                        <option value="10">10</option>
                        <option value="11">11</option>
                        <option value="12">12</option>
                        <option value="13">13</option>
                        <option value="14">14</option>
                        <option value="15">15</option>
                    </select>
                    <div class="btn-container">
                        <h1 class="imgupload"><i class="fa fa-file-image-o"></i></h1>
                        <h1 class="imgupload ok"><i class="fa fa-check"></i></h1>
                        <h1 class="imgupload stop"><i class="fa fa-times"></i></h1>
                        <p id="namefile">Accepte les .txt /.csv </p>
                        <button type="button" id="btnup" class="btn btn-primary btn-lg">Posez-le ici!</button>
                        <input type="file" value="" name="fileup" id="fileup">
                    </div>
                </div>
            </div>
                <div class="col-md-12  desabo-submit">
                    <input type="submit" value="Submit!" class="btn btn-primary" id="submitbtn">
                    <button type="button" class="btn btn-default" disabled="disabled" id="fakebtn">Envoyer <i class="fa fa-minus-circle"></i></button>
                </div>
            
                    </form>
    </div>
</div>
<?php
$dossier = 'upload/';
$fichier = basename($_FILES['fileup']['name']);
$taille_maxi = 1000000000000000000;
$taille = filesize($_FILES['fileup']['tmp_name']);
$extensions = array('.csv', '.txt');
$extension = strrchr($_FILES['fileup']['name'], '.'); 
//Début des vérifications de sécurité...
if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = '';
}
if($taille>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
    //On formate le nom du fichier ici...
    $fichier = strtr($fichier, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
     
    if(move_uploaded_file($_FILES['fileup']['tmp_name'], $dossier . $fichier)){
        
            $row = 1;   
            if (($handle = fopen("upload/".$fichier, "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);
            }
    echo '<span class="sucess_envoi">Upload effectué avec succès </span>!';
    
    
    }else{
          echo '<span class="echec_envoi">Echec de l\'upload !</span>';
     }
}
else
{
     echo $erreur;
}
?>
* Ca dépend !
Si c'est un nouvel enregistrerment, tu fais un "insert"
Si c'est une mise à jour (update) tu fais avec "update" en précisant la clé primaire.

Tu me fais bien rire avec ton "$taille_maxi"
Si avec un exaoctet, la fibre optique ne fond pas, tu auras de la chance Smiley lol
https://fr.wikipedia.org/wiki/Octet#Symboles

Sur le serveur recherche dans le fichier php.ini les valeurs suivantes :
* upload_max_filesize
* max_file_uploads
* post_max_size

Si tu arrives à jouer avec un fichier CSV de 60Mo, cela sera déjà bien.
Mdrrr je me suis un peut exister sur cette variable haha Smiley langue
C est juste pour un nouvel enregistrement Smiley smile J ai essayer de mettre ma requête dans ce schmilblick et ca ne fonctionne pas.. et le pire c est que j'ai même pas de notice d'erreur rien ^^
Je vois ou mettre ma requette Smiley decu

<?php
$dossier = 'upload/'; //* Je crée un dossier pour herberger mes fichier temporaire
$fichier = basename($_FILES['fileup']['name']);
$taille_maxi = 200000;
$taille = filesize($_FILES['fileup']['tmp_name']);
$extensions = array('.csv', '.txt'); //*Je crée mes extentions
$extension = strrchr($_FILES['fileup']['name'], '.'); 
//Début des vérifications de sécurité...
if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = '';
}
if($taille>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
    //On formate le nom du fichier ici...
    $fichier = strtr($fichier, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
     
    if(move_uploaded_file($_FILES['fileup']['tmp_name'], $dossier . $fichier)){

            // Je lis mon fichier csv
            $row = 1;   
            if (($handle = fopen("upload/".$fichier, "r")) !== FALSE) {
                $delimiteur = explode("_" , $fichier);
                while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
                    $num = count($data);     
                    $requette=$db->prepare("INSERT INTO `hardbounce_projet` VALUES ( :fileup ) ");
                    $requette->bindParam(':fileup',$_FILES['fileup']);
                    $requette->execute();
                    $resultat=$requette->fetchAll(PDO::FETCH_ASSOC);
                    print_r($resultat);
                    echo "<p> $num champs à la ligne $row: <br /></p>\n";
                    $row++;

                    for ($c=0; $c < $num; $c++) {
                        echo $data[$c] . "<br />\n";
                    }
                }
                fclose($handle);
            }
  echo '<div class="container-fluid">'
            . '<div class="row">'
            . '<div class="col-lg-12 sucess_envoi">'
            . '<span class="">Upload effectué avec succès</span>!'
            . '</div>'
            . '</div>'
       .'</div>';
    
    
    }else{
          echo '<span class="echec_envoi">Echec de l\'upload !</span>';
     }
}
else
{
     echo $erreur;
}
?>
Du coup c est bon j ai réussi a faire ce que je voulais ! Smiley smile
Merci beaucoup !!!!!! Smiley lol
J ai quelque autre soucis, si je trouve pas je ferais un autre sujet ! Smiley smile