IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MkFramework Discussion :

Importer dans deux tables de ma base mysql depuis csv


Sujet :

MkFramework

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Par défaut Importer dans deux tables de ma base mysql depuis csv
    Bonjour Imikado et autres utilisateurs.

    Il y a trois ans j'ai fait une application de gestionnaire d'évaluation des élèves sur l'utilisation de machines dangereuse.
    Imikado m'a beaucoup aidé et je le remercie à nouveau.

    Pour charger la base de mes nouveaux élèves et des nouvelles classes en Sept un collègue le fait via les formulaires.
    Comme c'est un peu long pour les élèves je le fais directement via phpmyadmin en sql.

    j'aimerai que ce soit possible en import d'un fichier CSV. pour rendre l'application plus facile d'utilisation par d'autres.

    J'aimerai savoir s'il existe un plugin dans MKframework qui fait ça?
    Si ce n'est pas le cas, pouvez-vous me conseiller vers quelle librairie, script m'orienter et facile d'utilisation?

    En fait j'ai deux table à charger en même temps: "user" et "classes". Au moment de charger il faut éviter les doublons. En effet, certains élèves continues leur formation dans une autre classe et bénéficies des évaluations déjà faites.

    Encore bravo pour le travail que vous faite. Je constate que le framework a bien évolué depuis la dernière fois, et qu'il n'a pas fini de surprendre. Je vous félicite.
    Cordialement

  2. #2
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Billets dans le blog
    17
    Par défaut
    Bonjour,

    Imaginons que votre fichier csv est de la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nom;prenom;classe;
    hugo;victor;class A;
    et qu'il est stoqué ici /tmp/import.csv

    Imaginons que vous ayez deux classes model: model_eleve.php et model_classe.php relative aux deux tables suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    eleve
    -id
    -nom
    -prenom
     
    classe
    -id
    -eleve_id
    -nom
     
    une troisieme classe d'une table permettant de faire le lien entre un eleve et une classe non ?
    par exemple 
     
    eleve_classe
    -id
    -eleve_id
    -classe_id
    Vous pouvez ajouter à votre classe model_eleve une methode pour verifier que l'eleve n'existe pas et ne pas le creer deux fois

    1. Ajoutons dans model_eleve une methode findByNameAndLastName()
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function findByNameAndLastName($sName,$sLastname){
    	return $this->findOne('SELECT * FROM eleve WHERE prenom=? and nom=?',$sName,$sLastname);
     
    }

    2.meme chose pour model_classe
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function findByName($sName){
     
    	return $this->findOne('SELECT * FROM classe WHERE nom=?',$sName);
    }

    3. creer un module d'import avec une action _import:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    public function _import(){
     
    	$sFilename='/tmp/import.csv';
     
    	$tLine=file($sFilename);
    	//boucle sur le fichier csv
    	foreach($tLine as $i => $sLine){
     
    		if($i==0){
    			//on ignore la premiere ligne si c'est l'entete 
    			continue;
    		}
    		//pour chaque ligne on découpe avec le caractère ";" pour recuperer nos 3 colonnes dans des variables:
    		list($sName,$sLastname,$sClassname)=explode(';',trim($sLine));
     
    		//ensuite on passe au traitement
     
    		//on verifie si l'eleve existe deja
    		$oEleveInDatabase=model_eleve::getInstance()->findByNameAndLastName($sName,$sLastname );
    		if($oEleveInDatabase){
    			$id_eleve=$oEleveInDatabase->id;
    		}else{
    			//l'eleve existe pas : on le cree
    			$oEleve=new row_eleve();
    			$oEleve->prenom=$sName;
    			$oEleve->nom=$sLastname;
    			$oEleve->save();
     
    			//sous mysql et sql server, le champ de l'id va etre mis a jour dans l'objet
    			$id_eleve=$oEleve->id;
    		}
     
    		//on verifie si la classe existe
    		$oClasseInDatabase=model_classe::getInstance()->findByName($sClassname);
    		if($oClasseInDatabase){
    			$id_classe=$oClasseInDatabase->id;
    		}else{
    			//la classe n'existe pas on la cree
    			$oClasse=new row_classe;
    			$oClasse->nom=$sClassname;
    			$oClasse->save();
    		}
     
     
    		//on ajoute le lien entre l'eleve et la classe
    		$oEleveClasse=new row_eleve_classe;
    		$oEleveClasse->eleve_id=$id_eleve;
    		$oEleveClasse->classe_id=$id_classe;
    		$oEleveClasse->save();
     
     
    	}
     
    }
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  3. #3
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Par défaut
    Merci Imikado,

    J'ai tout fait comme il faut mais j'ai oublié de préciser que je suis amateur débutant pas très à l'aise.
    pour la méthode findByNameAndLastName() tu écris
    WHERE prenom=? and nom=?',$sName,$sLastname) le nom et prénom sont inversé est-ce normal? C'est pas plutôt
    WHERE nom=? and prenom=?',$sName,$sLastname) ?

    Après avoir ajouté correctement compléter mes modéles, j'ai créer mon module importcsv avec main.php comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <?php 
    class module_importcsv extends abstract_moduleembedded{
    	public function before(){
    		$this->oLayout=new _layout('template1');
     
    		$this->oLayout->addModule('menu','menu::left');
    	}
     
    	/* #debutaction#
    	public function _exampleaction(){
    	
    		$oView=new _view('examplemodule::exampleaction');
    		
    		$this->oLayout->add('main',$oView);
    	}
    	#finaction# */
     
     
    	public function _import(){ 
    	$sFilename='/tmp/import.csv';
     
    	$tLine=file($sFilename);
    	//boucle sur le fichier csv
    	foreach($tLine as $i => $sLine){
     
    		if($i==0){
    			//on ignore la premiere ligne si c'est l'entete 
    			continue;
    		}
    		//pour chaque ligne on découpe avec le caractère ";" pour recuperer nos 3 colonnes dans des variables:
    		list($sName,$sLastname,$sClassname)=explode(';',trim($sLine));
     
    		//ensuite on passe au traitement
     
    		//on verifie si l'eleve existe deja
    		$oEleveInDatabase=model_eleve::getInstance()->findByNameAndLastName($sName,$sLastname );
    		if($oEleveInDatabase){
    			$id_eleve=$oEleveInDatabase->id;
    		}else{
    			//l'eleve existe pas : on le cree
    			$oEleve=new row_eleve();
    			$oEleve->prenom=$sName;
    			$oEleve->nom=$sLastname;
    			$oEleve->save();
     
    			//sous mysql et sql server, le champ de l'id va etre mis a jour dans l'objet
    			$id_eleve=$oEleve->id;
    		}
     
    		//on verifie si la classe existe
    		$oClasseInDatabase=model_classe::getInstance()->findByName($sClassname);
    		if($oClasseInDatabase){
    			$id_classe=$oClasseInDatabase->id;
    		}else{
    			//la classe n'existe pas on la cree
    			$oClasse=new row_classe;
    			$oClasse->nom=$sClassname;
    			$oClasse->save();
    		}
     
     
    		//on ajoute le lien entre l'eleve et la classe
    		$oEleveClasse=new row_eleve_classe;
    		$oEleveClasse->eleve_id=$id_eleve;
    		$oEleveClasse->classe_id=$id_classe;
    		$oEleveClasse->save();
     
     
    	}
     
    	}
    }
    et dans mon fichier view.php je suis perdu car je ne sais pas quoi écrire:

    En fait il faudrait un formulaire pour télécharger le fichier sur tmp/
    Et que l'action d'import se fasse dans la foulé.
    Si ensuite, que le fichier reste sur tmp, c'est pas mal. Comme ça on garde une trace de l'import.

    J'ai vu qu'il existe un plugin pour les" form" mais j'avoue ma faiblesse incompétente pour comprendre comment faire.

    Je vous remercie d'avance pour votre aide.
    Cordialement

  4. #4
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Billets dans le blog
    17
    Par défaut
    Lastname c'est "nom de famille", pour être clair, il aurait fallu utiliser firstname et lastname

    Pour la suite, oui on peut faire une méthode ainsi:
    en se basant sur ce tutoriel: http://mkframework.com/tutoriaux.html#upload

    Ca pourrait donner:

    View:
    view/upload.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <form action="" method="POST" enctype="multipart/form-data">
    Fichier <input type="file" name="importFile" />
     
     
    <input type="submit" value="Charger"/>
     
    </form>
    main.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    public function _import(){ 
     
    		$this->processImport();
     
    		$oView=new _view('importcsv::upload');
     
    		$this->oLayout->add('main',$oView);
    	}
     
    	public function processImport(){
     
    		if(!_root::getRequest()->isPost() ){ //si ce n'est pas une requete POST on ne soumet pas
    			return null;
    		}
     
    		$sColumn='importFile';
    		$oPluginUpload=new plugin_upload($sColumn);
     
    		if($oPluginUpload->isValid()){
    		$sFilename='data/upload/'.$sColumn.'_'.date('Ymdhis');
     
    		$oPluginUpload->saveAs($sFilename);
     
     
    		$tLine=file($sFilename);
    		//boucle sur le fichier csv
    		foreach($tLine as $i => $sLine){
     
    			if($i==0){
    				//on ignore la premiere ligne si c'est l'entete 
    				continue;
    			}
    			//pour chaque ligne on découpe avec le caractère ";" pour recuperer nos 3 colonnes dans des variables:
    			list($sName,$sLastname,$sClassname)=explode(';',trim($sLine));
     
    			//ensuite on passe au traitement
     
    			//on verifie si l'eleve existe deja
    			$oEleveInDatabase=model_eleve::getInstance()->findByNameAndLastName($sName,$sLastname );
    			if($oEleveInDatabase){
    				$id_eleve=$oEleveInDatabase->id;
    			}else{
    				//l'eleve existe pas : on le cree
    				$oEleve=new row_eleve();
    				$oEleve->prenom=$sName;
    				$oEleve->nom=$sLastname;
    				$oEleve->save();
     
    				//sous mysql et sql server, le champ de l'id va etre mis a jour dans l'objet
    				$id_eleve=$oEleve->id;
    			}
     
    			//on verifie si la classe existe
    			$oClasseInDatabase=model_classe::getInstance()->findByName($sClassname);
    			if($oClasseInDatabase){
    				$id_classe=$oClasseInDatabase->id;
    			}else{
    				//la classe n'existe pas on la cree
    				$oClasse=new row_classe;
    				$oClasse->nom=$sClassname;
    				$oClasse->save();
    			}
     
     
    			//on ajoute le lien entre l'eleve et la classe
    			$oEleveClasse=new row_eleve_classe;
    			$oEleveClasse->eleve_id=$id_eleve;
    			$oEleveClasse->classe_id=$id_classe;
    			$oEleveClasse->save();
     
     
    		}
     
    	}
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  5. #5
    Rédacteur
    Avatar de imikado
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 239
    Billets dans le blog
    17
    Par défaut
    Attention: pourquoi avez vous utilisé un module embarqué ? les modules embarqués sont a utiliser dans des cas particulier

    Ici un module "normal" fera tres bien l'affaire

    Et pour le plugin_form, je vous invite à generer un module CRUD, vous pourrez ainsi voir son utilisation dans les vue edit.php et show.php
    Framework php sécurisé et simple à prendre en main avec générateur web http://mkframework.com/ (hebergé sur developpez.com)
    Mes cours/tutoriaux

  6. #6
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2013
    Messages : 201
    Par défaut
    Ce serait trop beau si ça marchait du premier coup

    Dans le module menu j'ai ajouté un bouton vers "securite/public/index.php?:nav=importcsv::upload"
    $tLink['IMPORTER ELEVES']='importcsv::upload';
    en cliquant dessus j'ai une page blanche avec erreur 500 "...ne fonctionne pas Impossible de traiter cette demande via..."

    Attention: pourquoi avez vous utilisé un module embarqué ?
    Je ne sais pas ce que ça veux dire "embarqué". J'ai pris un fichier dans un autre module pour me servir d'exemple et j'ai copier collé en adaptant au mieux.

    Mon module main.php qui est dans module/importcsv j'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    <?php 
    class module_importcsv extends abstract_moduleembedded{
    	public function before(){
    		$this->oLayout=new _layout('templateAdmin');
     
    		$this->oLayout->addModule('menu','menu::left');
    	}
     
    	public function _index(){
    	    $this->_import();
    	}
     
     
    public function _import(){ 
     
    		$this->processImport();
     
    		$oView=new _view('importcsv::upload');
     
    		$this->oLayout->add('main',$oView);
    	}
     
    	public function processImport(){
     
    		if(!_root::getRequest()->isPost() ){ //si ce n'est pas une requete POST on ne soumet pas
    			return null;
    		}
     
    		$sColumn='importFile';
    		$oPluginUpload=new plugin_upload($sColumn);
     
    		if($oPluginUpload->isValid()){
    		$sFilename='data/upload/'.$sColumn.'_'.date('Ymdhis');
     
    		$oPluginUpload->saveAs($sFilename);
     
     
    		$tLine=file($sFilename);
    		//boucle sur le fichier csv
    		foreach($tLine as $i => $sLine){
     
    			if($i==0){
    				//on ignore la premiere ligne si c'est l'entete 
    				continue;
    			}
    			//pour chaque ligne on découpe avec le caractère ";" pour recuperer nos 3 colonnes dans des variables:
    			list($sName,$sLastname,$sClassname)=explode(';',trim($sLine));
     
    			//ensuite on passe au traitement
     
    			//on verifie si l'eleve existe deja
    			$oEleveInDatabase=model_eleve::getInstance()->findByNameAndLastName($sName,$sLastname );
    			if($oEleveInDatabase){
    				$id_eleve=$oEleveInDatabase->id;
    			}else{
    				//l'eleve existe pas : on le cree
    				$oEleve=new row_eleve();
    				$oEleve->prenom=$sName;
    				$oEleve->nom=$sLastname;
    				$oEleve->save();
     
    				//sous mysql et sql server, le champ de l'id va etre mis a jour dans l'objet
    				$id_eleve=$oEleve->id;
    			}
     
    			//on verifie si la classe existe
    			$oClasseInDatabase=model_classe::getInstance()->findByName($sClassname);
    			if($oClasseInDatabase){
    				$id_classe=$oClasseInDatabase->id;
    			}else{
    				//la classe n'existe pas on la cree
    				$oClasse=new row_classe;
    				$oClasse->nom=$sClassname;
    				$oClasse->save();
    			}
     
     
    			//on ajoute le lien entre l'eleve et la classe
    			$oEleveClasse=new row_eleve_classe;
    			$oEleveClasse->eleve_id=$id_eleve;
    			$oEleveClasse->classe_id=$id_classe;
    			$oEleveClasse->save();
     
     
    		}
     
    	}
     
    }
    ?>
    Puis dans view j'ai un fichier upload.php avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <form action="" method="POST" enctype="multipart/form-data">
    Fichier <input type="file" name="importFile" />
     
     
    <input type="submit" value="Charger"/>
     
    </form>
    Dans /plugin je n'avais pas le plugin_form.php je l'ai installé.
    Et pour le plugin_form, je vous invite à generer un module CRUD, vous pourrez ainsi voir son utilisation dans les vue edit.php et show.php
    Je ne comprend pas. J'en ai plein de module CRUD qui ont été generé au début de la création de l'application.

    En essayant de comprendre avec d'autres modules, j'ai fait plein de test sans pouvoir parvenir à quoi que ce soit d'autre que cette page idiote
    Je suis sur qu'après un bref coup d’œil amusé, vous avez vu le problème.
    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/02/2014, 01h30
  2. Réponses: 0
    Dernier message: 28/06/2013, 19h10
  3. Réponses: 9
    Dernier message: 07/06/2011, 23h24
  4. Insertion croisée dans deux tables mysql
    Par tiger33 dans le forum Requêtes
    Réponses: 6
    Dernier message: 19/09/2006, 08h55
  5. Jointure de tables sur 2 base MySQL, si poussible??
    Par nerik38 dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/11/2005, 20h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo