Bonjour à tous,

Je suis nouveau sur le forum.
Depuis peu j'ai décidé de me lancer dans un projet ambitieux (pour moi novice en PHP,MySQL,HTML et CSS).

L'objectif de ce projet est :

1- extraire la ou les pièce(s) jointe(s)(.xlsx ou .xls) provenant d'un expéditeur en particulier et l'enregistrer dans un répertoire en particulier

2- Mettre en base ces données: monter un tableau identique à celui issue des pièces jointes et y enregistrer toutes les informations provenant de celles-ci.

Ainsi la première pièce jointe va permettre de remplir le tableau initialement vide puis les pièces jointes suivantes (comportant entre autres les mêmes informations que la pièce jointe précédente) apporteront des nouvelles données.

3- Afficher ce tableau sur une page WEB

Pour ce faire, seul l'usage des langages suivants est souhaité: HTML, CSS, PHP, MySQL.

J'ai suivis les tutoriels Grafikart afin de me familiariser avec ces différents langages.

Cependant, je reste bloqué sur la première partie: l'extraction.
En effet j'arrive à avoir accès au contenu de ma boîte mail mais je ne parviens pas à réaliser un filtre pour ne sélectionner que les mails provenant d'un expéditeur X, ni d'extraire une pièce jointe.

Touts les scripts traitant du sujet sur internet sont réalisés en python ou vba ! :/

Quelqu'un aurait une idée de comment faire?

( tentative de code qui au final ne fait rien...! :()

Cordialement

Elysium

14 réponses


Losthil
Auteur
Réponse acceptée

Projet terminé merci à tous en tout cas pour votre aide ! :)

Déjà est-ce que tes tableaux ont tous le même format?

Car si tu veux le mettre dans une base MySQL soit ils ont tous le même format, donc là c'est assez simple à intégrer, sinon tu devras avoir plusieurs colonnes, et pour tu joins chaque ligne de chaque colonne ensemble en mettant un caractère spéciale pour parser ensuite.

Losthil
Auteur

"Cependant, je reste bloqué sur la première partie: l'extraction.
En effet j'arrive à avoir accès au contenu de ma boîte mail mais je ne parviens pas à réaliser un filtre pour ne sélectionner que les mails provenant d'un expéditeur X, ni d'extraire une pièce jointe."

C'est bon problème résolu, j'arrive désormais à filtrer en fonction de l’expéditeur ainsi qu'en fonction du nom de la pièce jointe et d'extraire la pièce jointe dans le dossier que je souhaite ! :)

@Nairolf (florian)

Tous les tableaux sont structurés de la même manière (même nombre champs).
Cependant j'aimerai rajouter sur mon tableau finale (base de donnée) 2 champs supplémentaires.
Il me faut donc rédiger un programme qui, une fois la pièce jointe enregistrée, va devoir collecter les données de celle-ci, les comparer (pour voir si certaines informations ne sont pas déjà renseignées) aux données déjà présentes sur la tableau MySQL et les enregistrer dans ce fameux tableau.

Losthil
Auteur

Des idées pour réaliser la mise en base de fichiers excels sans utiliser de formulaire?

Salut,
Ne connaissant pas forcement bien la librairie PHPExcel, j'aurais procéder de la facon suivante.
Fonction qui converti le XLS en CSV => http://hayageek.com/convert-xls-to-csv-in-php/
Puis l'utilisation de fgetcsv pour lire le csv => http://www.php.net/manual/en/function.fgetcsv.php
Après tu boucle sur chaque ligne ou sur chaque index de ton tableau (il me semble que tu peu mettre le contenu du csv en array)
Et suite à ca tu fait une requête pour verifier que l'entrée n'existe pas et si c'est le cas un insert en base

Par contre tu doit pouvoir faire ceci avec un script shell, ce qui serait plus performant qu'en PHP

Je comprends pas bien pourquoi vous ne voulez pas utiliser directement une fonction MySQL pour ca http://dev.mysql.com/doc/refman/5.1/en/load-data.html

LOAD DATA LOCAL INFILE 'file.csv'
    INTO TABLE table
    FIELDS TERMINATED BY ';'
    LINES TERMINATED BY '\n'        
(champ1, champ2, ...);

A priori rien ne sera plus efficace, et surement pas une boucle PHP ni meme en shell.

Ensuite, d'expérience, je suggerais de demander un fichier texte directement (csv ou txt), et non pas un fichier excel (xls, ou xlsx). L'erreur typique sera le mec qui va uploader un fichier avec 10 feuillets différents, en pensant que le serveur va naturellement savoir que c'est le feuillet #3 qu'il faut regarder. En outre il me semble bien que l'encodage d'un fichier xls est différent suivant la version d'excel.
Excel sait enregistrer au format texte sans que ce soit compliqué pour l'utilisateur, et c'est le meilleur moyen de garantir qu'il sait ce qu'il fait.

Vallyan sauf que sur un serveur de prod normalement configurer la fonction infile n'est pas activé (d'ailleurs par default en tout cas sur la dernière version de MySQL elle n'est pas activé).
J'ai eu le problème justement hier aprem et j'ai du l'activé mais d'après ce que j'ai lu c'est pas conseillé de l'activé sur un serveur de prod après...

Concernant le format il est clair que le format xls n'est pas top pour ce genre de tâche mais a t'il le choix?

Edit : d'ailleurs quid du LOAD DATA LOCAL INFILE, quand un duplicate entry est détecter, le script s'arréte t'il ?

Il y a l'instruction [REPLACE | IGNORE] (cf. la doc) qui permet de [remplacer une entrée par une nouvelle | d'ignorer l'ajout d'une entrée] lorsqu'il y a duplication d'ID. Il suffit ensuite de mettre une clé unique sur la bonne combinaison de champs (ou sur tous les champs si besoin).

Je ne sais pas si c'est déconseillé de le mettre en prod, ni pourquoi exactement, mais envoyer a la suite 10 000 requetes SQL si le fichier a 10 000 lignes ne me parait pas être une trop bonne idée.
Eventuellement, pour s'assurer de ne pas mettre n'importe quoi dans la table (si c'est le risque), il est a mon avis encore préferrable de générer, en PHP, un fichier input_propre.txt "propre" a partir de l'input de l'utilisateur, et d'importer ce fichier input_propre.txt dont on est sur avec un LOAD DATA.

Losthil
Auteur

J'ai créé un fichier permettant la conversion d'un fichier .xls ou .xlsx en .csv, maintenant, il m'est possible d'utiliser vos 2 méthodes !
Cependant, est-il possible de réaliser des comparaisons entre un élément du fichier excel et un élément de la base de donnée, si on applique la solution de Vallyan ? (Je n'y connais pas encore grand chose en SQL).

  • Si ta comparaison va plus loin que la vérification de duplicats: non

  • Si ta comparaison vise uniquement a ne pas avoir de duplicats: oui
    Dans ce cas il faut que tu détermines quelle combinaison de champs de ta table doit etre unique (nom et prenom, par exemple, ou nom et prenom et date de naissance, ou marque d'une voiture et modele de la voiture et annee de construction ... ca peut meme etre tous les champs ensemble), et tu dois décider si, lorsqu'il y a un duplicat, MySQL doit metre a jour ou ignorer

Pour résumer: la méthode de Fredix (ligne par ligne) a l'avantage de te donner beaucoup de controle sur ce que tu fais et quand tu le fais. Elle a l’inconvénient de devenir très très lourde pour un grand nombre de lignes.
La mienne est la plus puissante / efficace / rapide, mais laisse peu de place a la customisation.

Je ne pense pas qu'il y ait de meilleure solution en soit, c'est en fonction de ce que tu t'attends a avoir a gérer que tu dois choisir.

Losthil
Auteur

D'accord, je vous expose clairement ce que je souhaite faire avec cette base de donnée:

Je dois, comme vous le savez, comparez la table de la base de donnée existante avec celle de la nouvelle pièce jointe.

De plus, la table de la nouvelle pièce jointe sera tout d'abord comparée à certaines autre tables (elles fixes) avant de pouvoir importer leur valeurs dans la table de la base de donnée.

Voilà un exemple schématisant mon projet:

Une pharmacie décide de répertorier les médicaments délivrés pour chacun de leurs clients.
Les médecins envoient à la pharmacie les informations correspondant aux médicaments prescrits pour chaque patient (pièce jointe excel dans mon cas). A chaque nouvelle prescription, un mail est envoyé à la pharmacie

Ainsi on a une liste de cette forme ci:

10h***********************Patient C***********************Médicament X
9h***********************Patient B***********************Spasfon
8h***********************Patient A***********************Dilprane
...

La base de donnée de la pharmacie compare les informations déjà présente dans sa table avec les nouvelles et n'ajoute que les nouvelles prescriptions.

La table de la base de donnée possède 1 champs supplémentaire aux pièces jointes envoyée: Statut de la commande

Tant que le pharmacien n'a pas délivré les médicaments au client, le statut de la commande est "En attente".

Dans le cas où le medecin a bien fait son travail, lorsque le pharmacien délivre les médicaments au client celui-ci signale par l’intermédiaire d'un interface WEB, par liste déroulante, le statut "Delivré".

Cependant (admettons que le médecin soit mauvais), sur la fiche correspondant au client, il est mentionné que le patient B est allergique au Spasfon. Automatiquement, un email est envoyé au medecin pour l'alerter!

Question: Est-il possible d'allier commandes SQL et php dans un même script? (bien que je pense savoir que oui, je demande confirmation).
Cela permettrait une plus grande aisance

Losthil
Auteur

HELP ! :/

Salut, juste pour répondre a ta question oui c'est possible de combiner sql et php

Je me doute que ce ne soit pas la réponse a laquelle tu t'attendais mais comme tu explique pas clairement quel partie tu bloque ca va etre difficile de t'aider

Losthil
Auteur

Ma fonction conversion fonctionne! Ainsi, j'ai un fichier .csv correspondant au contenu de mon fichier excel (.xlsx)
Ensuite, lorsque je rédige les lignes de codes suivantes:

LOAD DATA LOCAL INFILE 'file.csv'
    INTO TABLE table
    FIELDS TERMINATED BY ';'
    LINES TERMINATED BY '\n'       
(champ1, champ2, ...);

Un message d'erreur figure :

PDO::query(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''id', 'date_envoi',