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

PHP & Base de données Discussion :

Insert dans la base de données [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Par défaut Insert dans la base de données
    Bonjour,

    Avant toute chose, j'espère être dans la bonne section, si ce n'est le cas, je m'en excuse par avance.

    Je suis actuellement en stage et j'ai un projet à faire, je vous passe les détails mais en gros, je part d'un fichier csv et il doit finir en pdf, en passant par une base de données , donc il y a une étape qui consiste à insérer les données dans la bdd, à faire en php. les données sont du styles :



    La façon dont l'utilisateur va utilisé cette programme changera surement pour le rendre plus simple d'utilisation, c'est pour cela qu'on m'a demandé de passer d'un format csv à pdf. Je remets par la suite en forme pour qu'il utilise au mieux les données

    Je part donc d'un formulaire où l'utilisateur choisit son fichier et ensuite appuie sur le bouton submit, il est ensuite dirigé vers cette page.

    alors voila, le code ci-dessous fonctionne, seulement, j'ai un problème surement du à mes requêtes mysql.

    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
    <?php
    if (isset($_POST['submit'])) {
    	if(isset($_FILES['monfichier'])){
    		$dossier = 'upload/';
    		$fichier = basename($_FILES['monfichier']['name']);
    		if(move_uploaded_file($_FILES['monfichier']['tmp_name'], $dossier.$fichier)){
    			echo "Upload du fichier effectu&eacute; avec succ&egrave;s !";
    		}
    		else{
    			echo "Echec de l\'upload !";
    		}
    		echo "<br>Chemin du fichier : upload/".$_FILES['monfichier']['name']."<br><br>Resultat Import SQL : <br>";
    		mysql_connect('localhost','root','');
    		mysql_select_db('test');
    		mysql_query("SET NAMES UTF8");
    		//Le chemin d'acces au fichier sur le serveur
    		if(file_exists("upload/".$_FILES['monfichier']['name'])){
    			$fichier = fopen("upload/".$_FILES['monfichier']['name'], "r");
    			$i=0;
    			//tant qu'on est pas a la fin du fichier :
    			while (!feof($fichier)){
    				// On recupere toute la ligne
    				$uneLigne = addslashes(fgets($fichier));
    				if($i>0) // test pour ne pas lire la premiere ligne{
    					//On met dans un tableau les differentes valeurs trouvés (ici séparées par un ';')
    					$tableauValeurs = explode(';', $uneLigne);
    					$req="SELECT count(*) from compteurs"; 
    					$sql=mysql_query($req);
    					if($sql>=1){ // test si la base de donnée est vide ou pas
    						$sql1="DROP TABLE compteurs"; // detruit la table
    						mysql_query($sql1) or die (mysql_error()); // execution
    						$sql2="CREATE TABLE IF NOT EXISTS `compteurs` (`id_compteur` int(11) NOT NULL AUTO_INCREMENT,`nom_compteur` varchar(50) NOT NULL,`difference` varchar(50) NOT NULL,`consommation_precedente` varchar(50) NOT NULL,`consommation_actuel` varchar(50) NOT NULL,PRIMARY KEY (`id_compteur`))ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=18"; // creation de la table
    						mysql_query($sql2) or die (mysql_error()); // execution
    						$sql3="INSERT IGNORE INTO compteurs VALUES ('', '".$tableauValeurs[0]."','".$tableauValeurs[1]."','".$tableauValeurs[2]."','".$tableauValeurs[3]."')"; // insertion des données dans la table
    						$req3=mysql_query($sql3) or die (mysql_error()); // execution
    					}
    					else{
    						$sql3="INSERT IGNORE INTO compteurs VALUES ('', '".$tableauValeurs[0]."','".$tableauValeurs[1]."','".$tableauValeurs[2]."','".$tableauValeurs[3]."')"; // insertion des données dans la table
    						$req3=mysql_query($sql3) or die (mysql_error()); // execution
    					}
    				}
    				else{
    					$i++; // on incrémente pour ne pas lire la premiere ligne
    				}
    			}
    			//vérification et envoi d'une réponse à l'utilisateur
    			if ($req3){
    				echo "<h2>Ajout dans la base de donn&eacute;es effectu&eacute; avec succ&egrave;s</h2>";
    			}
    			else{
    				echo "Echec dans l'ajout dans la base de donn&eacute;es";
    			}
    		}
    	}
    }
    ?>
    Lorsque je l’exécute, il me dit que mon ajout est bon, ce qui est vrai d'un coté, seulement dans ma base de données les champs sont vides. Il ne me signale pas d'erreur seulement un notice :
    Undefined offset: 1 in C:\wamp\www\upload.php on line 50
    Undefined offset: 2 in C:\wamp\www\upload.php on line 50
    Undefined offset: 3 in C:\wamp\www\upload.php on line 50
    A savoir que lorsque je fais ma requête lorsque ma table est vide, j'ai toujours ce problème de Offset, mais la base est correctement remmpli, avec juste une ligne vide en trop.

    Je ne comprends pas d'où cela peut venir.

    J'ai regardé d'où cela pouvais venir mais apparemment un problème de tableau, mais j'ai pas bien compris au final.

    J'aurais donc besoin de vos lumières pour m'éclairer. Merci d'avance de vos réponses.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tes erreurs Notice sont dues a la ligne vide dans ton fichier CSV.
    A toi de contrôler qu'il ne s'agit pas d'une ligne vide avant de faire ton traitement.
    Par ailleurs il existe une fonction fgetcsv() pour t'éviter un explode().

    Egalement, $sql ne contient pas la valeur du COUNT de ta requête mais simplement le retour du mysql_query(). Il te faut une étape mysql_fetch_xxxxx().
    Tu pourrais vider ta table (et non pas la détruire) à chaque traitement plutôt que de contrôler si elle contient des données et la détruire et la reconstruire.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Par défaut
    Merci de ta réponse. J'ai essayé de faire ce que tu m'as conseillé.

    Citation Envoyé par sabotage Voir le message
    Tu pourrais vider ta table (et non pas la détruire) à chaque traitement plutôt que de contrôler si elle contient des données et la détruire et la reconstruire.
    Oui, je ne savais pas qu'on pouvais le faire, j'ai donc fais un TRUNCATE, et je pense que ça fonctionne.

    Citation Envoyé par sabotage Voir le message
    Egalement, $sql ne contient pas la valeur du COUNT de ta requête mais simplement le retour du mysql_query(). Il te faut une étape mysql_fetch_xxxxx().
    C'est obligatoire ? parce qu'en faite, dès l'instant où il y a quelque chose dedans, il va me retourné quelque chose, s'il n'y a rien dedans, ce n'est pas grave, je ne comprends pas pourquoi l'utiliser si tu pouvais me préciser un peu la chose.

    Citation Envoyé par sabotage Voir le message
    Tes erreurs Notice sont dues a la ligne vide dans ton fichier CSV.
    A toi de contrôler qu'il ne s'agit pas d'une ligne vide avant de faire ton traitement.
    Par ailleurs il existe une fonction fgetcsv() pour t'éviter un explode().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while (!feof($fichier)){
    	// On recupere toute la ligne
    	$uneLigne = addslashes(fgets($fichier));
    	if($i>0){ // test pour ne pas lire la premiere ligne
    		//On met dans un tableau les differentes valeurs trouvés (ici séparées par un ';')
    		$tableau = explode(';', $uneLigne);
    		$tableauValeurs = array_map(trim,$tableau);
    		$req="SELECT count(*) from compteurs"; 
    		$sql=mysql_query($req);
    		if($sql>=1){ // test si la base de donnée est vide ou pas
    			$sql1="TRUNCATE TABLE compteurs"; // vide la table
    			mysql_query($sql1) or die (mysql_error()); // execution
    j'ai pas encore remplacé fgets() par fgetcsv() parce que j'essaye d'abord de mettre avec un trim() pour supprimer les lignes vides comme tu m'as dit mais il me dit

    Use of undefined constant trim - assumed 'trim'
    j'ai essayé avec 'trim', ou alors je dois recréer la fonction carrément ?

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Étant donné que tu fais maintenant un TRUNCATE tu n'as plus besoin de contrôler le contenu de ta table.
    Ma remarque était que quand tu fais un SELECT COUNT, le résultat du COUNT n'est pas dans mysql_query() directement.

    Le problème de ligne vide n'est pas au niveau de $tableau mais au niveau de $uneLigne.
    Il faut contrôler si $uneLigne contient quelque chose ou non.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Par défaut
    J'ai fait le test de la ligne vide et je n'ai plus la notice sur le offset, mais dorénavant, il ne rentre plus qu'une seule ligne dans la bdd, de plus, j'ai des " qui sont devant compteur et un autre à la fin derrière le dernier caractère du dernier champ, mais ça j'ai dû m'embrouiller dans la requête avec tout les ' et ".

    En ce qui concerne le fgetcsv, si je l'utilise, la variable $tableau disparaît au profit de $uneLigne non ?

    Comme cela :

    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
    while (!feof($fichier)){
    	// On recupere toute la ligne
    	$uneLigne = fgetcsv($fichier,100,';');
    	if(strlen(trim($uneLigne))){
    		if($i>0){ // test pour ne pas lire la premiere ligne
    			//On met dans un tableau les differentes valeurs trouvés (ici séparées par un ';')
    			//$tableauValeurs = explode(';', $uneLigne);						
    			$req="SELECT count(*) from compteurs"; 
    			$sql=mysql_query($req);
    			if($sql>=1){ // test si la base de donnée est vide ou pas
    				$sql1="TRUNCATE TABLE compteurs"; // vide la table
    				mysql_query($sql1) or die (mysql_error()); // execution
    				$sql2="INSERT IGNORE INTO compteurs VALUES ('','".$uneLigne[0]."','".$uneLigne[1]."','".$uneLigne[2]."','".$uneLigne[3]."')"; // insertion des données dans la table
    			}
    			else{
    				$sql2="INSERT IGNORE INTO compteurs VALUES ('','".$uneLigne[0]."','".$uneLigne[1]."','".$uneLigne[2]."','".$uneLigne[3]."')"; // insertion des données dans la table
    parce qu'il va y avoir un problème au niveau de la conversion à mon avis, enfin la honnêtement, j'ai l'impression d'être totalement largué

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    fgetcsv renvoit un tableau PHP.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

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

Discussions similaires

  1. Parcours d'un fichier et insertion dans une base de données !
    Par condor_01 dans le forum Général Java
    Réponses: 2
    Dernier message: 24/04/2008, 09h24
  2. [paradox7] Problème d'insertion dans la base de données
    Par mouna201 dans le forum Bases de données
    Réponses: 4
    Dernier message: 01/02/2006, 09h47
  3. problème d'insertion dans une base de données
    Par belmansour tidjani dans le forum JDBC
    Réponses: 7
    Dernier message: 18/01/2006, 22h13
  4. [Hibernate] problème d'insertion dans la base de données
    Par Willy7901 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 18/08/2005, 13h19
  5. Probleme d'insertion dans la base de données
    Par PrinceMaster77 dans le forum ASP
    Réponses: 5
    Dernier message: 11/06/2004, 16h21

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