Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problèmes avec requêtes SQL

Sujet résolu
    18 mars 2019 à 15:17:41

    Bonjour,

    ce forum fait suite à ma précédente intervention

    https://openclassrooms.com/forum/sujet/creation-de-tables

    J'ai suivi les conseils de Benzouye pour la bdd mais maintenant j'ai vraiment du mal à comprendre comment mettre les données (d'un fichier csv) dans cette base et dans quel ordre. J'aimerais votre avis sur ce point.

    /* Ouvertre du fichier csv en mode lecture */
    $f = fopen($dossier. '/' . $fichier, 'r+') ;
    
    /* Contrôle de l'ouverture */
    if(is_resource($f)) {
                                
      fgetcsv($f, 4096, ";"); // lis la première ligne dans le vide
                                
    
    
      /* Boucle sur chaque ligne */
                                
      while(($d = fgetcsv($f, 4096, ";")) !== FALSE) {                              
     
      /* Création de la requete SQL */
                                    
      //on remplit la table vm
      $req1 = $bdd->prepare('INSERT INTO vm(nom) VALUES(:nom)');
    
      //on recupère l'id vm 
      $req2 = $bdd->prepare('SELECT id_vm FROM vm WHERE nom=:nom_vm');
    
      //
      $req3 = $bdd->prepare('INSERT INTO () VALUES()');
    
      //
      $req4 = $bdd->prepare('INSERT INTO mesure(date_heure, valeur, id_vm, id_indicateur) VALUES(:date_heure, :valeur, :id_vm, :id_indicateur)');
    
                                    
      for ($i=0; $i < count($d); $i++) { 
                                        
        if ($i >= 0 && $i < count($d) - 1) {
          echo substr($d[$i], 2, strlen($d[$i])-4) . ';';
        }
                                        
        elseif ($i == count($d) - 1) {
          echo substr($d[$i], 2, strlen($d[$i]) - 6);
          echo "<br />";
        }
    
        $nom_vm = substr($d[1], 2, strlen($d[1])-4);
        $valeur = substr($d[3], 2, strlen($d[3])-4);                
                                        
        /* Insertion dans la base de donnée */
        $req1->execute(array(
          'nom' => $nom_vm
        ));
    
        $req2->execute(array(
          'nom' => $nom_vm
        ));
    
        $req3->execute(array(
          '' => $
        ));
                                                                          
        $req4->execute(array(
          'date_heure' => $date2, 
          'valeur' => $valeur, 
          'id_vm' => $id_vm, 
          'id_indicateur' => $id_indicateur
        ));  
                                    
      }

     

    Respectueusement

    -
    Edité par Benzouye 18 mars 2019 à 15:32:27

    • Partager sur Facebook
    • Partager sur Twitter
      18 mars 2019 à 15:30:37

      Bonjour,

      Peux-tu nous donner des exemples de lignes de ton fichiers CSV ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        18 mars 2019 à 15:41:28

        Bonjour,

        Voici comment est composé mon fichier csv :

        "VMHost";"Name";"Folder";"PowerState";"MemoryGB"
        "XXXXXXXXXXXXXXXXXXX";"XXXXXXXXXXX";"XX";"XXXXXXXXXX";"X"
        "YYYYYYYYYYYYYYYYYYYYY";"YYYYYYYYYYYYYYY";"YY";"YYYYYYYYYY";"Y"

        Pour plus d'informations :

        J'ai plusieurs dossiers/fichiers dans un dossier. J'arrive à les lister (de façon récursive) ainsi que leur contenu (délimité par un ; ) (sur une page web).

        Dans ce contenu je dois extraire certaines informations.

        1 - je pensais remplir la table vm en extrayant les noms des vms

        2 - je pensais selectionner l'id_vm par rapport à celui dans le contenu et celui dans la table afin de l'insérer dans la table mesure

        3 - je n'ai pas bien compris comment manipuler la table indicateur afin d'avoir l'id_indicateur

        4 - je pensais remplir la table mesure

        -
        Edité par P5eud0 18 mars 2019 à 15:43:01

        • Partager sur Facebook
        • Partager sur Twitter
          18 mars 2019 à 16:44:28

          Chaque fichier a la même structure ?

          Ne connais-tu pas la liste exhaustive de tes VM à l'avance ? Seul le nom les distingue ?

          Ne connais-tu pas la liste des indicateurs à l'avance ? Comment détermines-tu de quel indicateur il s'agit ?

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            18 mars 2019 à 17:41:34

            Chaque fichier a la même structure ?

            Pour l'instant oui, je vais utiliser 2 types de fichiers différents avec cette même structure.

            Ne connais-tu pas la liste exhaustive de tes VM à l'avance ? Seul le nom les distingue ?

            Non pas de liste exhaustive, benzouye m'a proposé l'@IP mais elle n'est pas dans les csv donc oui que le nom (ça craint ?)

            Ne connais-tu pas la liste des indicateurs à l'avance ? Comment détermines-tu de quel indicateur il s'agit ?

            Si les indicateurs, je les connais, j'ai rempli cette table manuellement (elle ne me prends que 5-6 lignes pour l'instant). En fonction de l'emplacement dans le fichier csv, je détermine l'indicateur.

            • Partager sur Facebook
            • Partager sur Twitter
              18 mars 2019 à 18:19:49

              AlibabaCathy2.0 a écrit:

              je vais utiliser 2 types de fichiers différents avec cette même structure

              Ils sont différents mais avec la même structure ? Je ne comprends pas :p

              AlibabaCathy2.0 a écrit:

              Non pas de liste exhaustive [...] donc oui que le nom

              Donc il faut que ton programme commence par vérifier si le nom existe dans la table des VMs.

              SELECT id_vm FROM vm WHERE nom = ...

              Assure-toi au passage d'avoir mis une contrainte UNIQUE sur la colonne vm.nom.

              Si le nom existe tu récupères un id_vm, si le nom n'existe pas alors tu fais un INSERT INTO et tu récupères le dernier id créé avec lastInsertId().

              Une fois que tu as l'id de la VM, tu dois déterminer l'id de l'indicateur. Il semble être lié à la colonne du fichier CSV que tu parcoures, je dirais donc qu'il doit être saisi en dur dans le code en fonction du type de fichier CSV que tu traites.

              Exemple de code approximatif et minimaliste :

              <?php
              $bdd = new PDO( ... );
              
              $f = fopen($dossier. '/' . $fichier, 'r+') ;
              
              if( is_resource($f) ) {
              	// On passe la première ligne
              	fgetcsv($f, 4096, ";");
              	
              	// On boucle sur les lignes suivantes
              	while( $d = fgetcsv($f, 4096, ";") ) {
              		
              		// On initialise les variables
              		$id_vm = 0;
              		$id_indicateur = 0;
              		$nom_vm = substr($d[1], 2, strlen($d[1])-4);
              		$valeur = substr($d[3], 2, strlen($d[3])-4);
              		$date = ...;
              		
              		try {
              			// On recherche le nom
              			$requete = $bdd->prepare('SELECT id_vm FROM vm WHERE nom = :nom ;');
              			$requete->execute( array( 'nom' => $nom_vm ) );
              			$id_vm = $requete->fetchColumn();
              			
              			// Si le nom n'existe pas
              			if( !$id ) {
              				// On le crée et on récupère son id
              				$requete = $bdd->prepare('INSERT INTO vm(nom) VALUES(:nom) ;');
              				$requete->execute( array( 'nom' => $nom_vm ) );
              				$id = $bdd->lastInsertId();
              			}
              			
              			// On détermine id_indicateur
              			// Là je ne sais pas comment tu dois faire
              			// C'est à toi de le déterminer
              			$id_indicateur = ...;
              			
              			// On insère la valeur
              			$requete = $bdd->prepare('
              				INSERT INTO mesure ( date_heure, valeur, id_vm, id_indicateur )
              				VALUES( :date_heure, :valeur, :id_vm, :id_indicateur ) ;'
              			);
              			$requete->execute( array(
              				'date_heure' => $date,
              				'valeur' => $valeur,
              				'id_vm' => $id_vm,
              				'id_indicateur' => $id_indicateur
              			));
              		}
              		catch( Exception $e ) {
              			var_dump( $e );
              		}
              		
              	}
              }

              Attention ! Cette manière de faire peut être très lente dans le cas de fichiers CSV longs ...

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                19 mars 2019 à 14:39:06

                OK merci,

                Pour répondre à ta questions : Tous les fichiers ont la même structure.

                J'ai réussi à adapter ce que tu m'as donné à mon code, il ne me manque plus qu'à récupérer l'id_indicateur pour avoir un enregistrement complet.

                Donc pour l'id_indicateur, tu pense que ça doit se faire en dur dans le code ?

                PS : Pourquoi s'assurer qu'une contrainte unique est mise sur la colonne vm.nom alors que la clé primaire est l'id_vm ?

                -
                Edité par P5eud0 19 mars 2019 à 14:46:17

                • Partager sur Facebook
                • Partager sur Twitter
                  19 mars 2019 à 14:59:04

                  AlibabaCathy2.0 a écrit:

                  Pourquoi s'assurer qu'une contrainte unique est mise sur la colonne vm.nom

                  Pour ne pas pouvoir enregistrer deux fois le même nom de VM dans la table ... Sinon, tu pourras avoir deux id_vm différents pour le même nom et là ce sera le foutoir ...

                  AlibabaCathy2.0 a écrit:

                  pour l'id_indicateur, tu pense que ça doit se faire en dur dans le code ?

                  Je ne sais pas ... Comment vas-tu déterminer quel indicateur est concerné par la ligne CSV que tu importes ? C'est un fichier par indicateur ? C'est une valeur du CSV qui le détermine ? Il faut que tu précises ce point, je ne peux pas deviner, et PHP et MySQL ne le pourront pas non plus :)

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    19 mars 2019 à 15:14:50

                    D'acc

                    Pour l'indicateur, la première ligne que j'ai passée pourrait aider puisque c'est dans celle-ci que sont marqués les indicateurs dans le fichier csv ?

                    "VMHost";"Name";"Folder";"PowerState";"MemoryGB"
                    "XXXXXXXXXXXXXXXXXXX";"XXXXXXXXXXX";"XX";"XXXXXXXXXX";"X"
                    "YYYYYYYYYYYYYYYYYYYYY";"YYYYYYYYYYYYYYY";"YY";"YYYYYYYYYY";"Y"

                    -
                    Edité par P5eud0 19 mars 2019 à 15:15:26

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 mars 2019 à 15:26:49

                      Que représentent ces 5 noms de colonnes ?

                      VMHost va contenir quelle information ?

                      Name, c'est le nom de la VM ?

                      Floder, PowerState et MemoryGB sont les indicateurs ?

                      Ces trois dernières colonnes sont-elles variables d'un fichier à l'autre ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        19 mars 2019 à 15:29:30

                        Ces noms de colonne représente mes indicateurs ( sauf nom_vm )

                        VMHost va contenir le nom du serveur auquel appartient la vm

                        Pour l'instant non, j'ai des fichiers avec la même structure

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 mars 2019 à 15:35:12

                          AlibabaCathy2.0 a écrit:

                          j'ai des fichiers avec la même structure

                          Donc seulement 4 indicateurs ? Toujours dans la même colonne du fichier CSV ?

                          Tu as créé ces 4 indicateurs dans la table indicateur, chacun avec un id ?

                          Exemple de code :

                          <?php
                          $bdd = new PDO( ... );
                           
                          $f = fopen($dossier. '/' . $fichier, 'r+') ;
                           
                          if( is_resource($f) ) {
                              // On passe la première ligne
                              fgetcsv($f, 4096, ";");
                               
                              // On boucle sur les lignes suivantes
                              while( $d = fgetcsv($f, 4096, ";") ) {
                                   
                                  // On initialise les variables
                                  $id_vm = 0;
                                  $nom_vm = substr($d[1], 2, strlen($d[1])-4);
                                   
                                  try {
                                      // On recherche le nom
                                      $requete = $bdd->prepare('SELECT id_vm FROM vm WHERE nom = :nom ;');
                                      $requete->execute( array( 'nom' => $nom_vm ) );
                                      $id_vm = $requete->fetchColumn();
                                       
                                      // Si le nom n'existe pas
                                      if( !$id ) {
                                          // On le crée et on récupère son id
                                          $requete = $bdd->prepare('INSERT INTO vm(nom) VALUES(:nom) ;');
                                          $requete->execute( array( 'nom' => $nom_vm ) );
                                          $id = $bdd->lastInsertId();
                                      }
                                       
                                      // On insère les valeurs
                                      $requete = $bdd->prepare('
                                          INSERT INTO mesure ( date_heure, valeur, id_vm, id_indicateur )
                                          VALUES( NOW(), :valeur, :id_vm, :id_indicateur ) ;'
                                      );
                                      $requete->execute( array(
                                          'valeur' => $d[0],
                                          'id_vm' => $id_vm,
                                          'id_indicateur' => 1 // 1 étant id indicateur VMHost
                                      ));
                                      $requete->execute( array(
                                          'valeur' => $d[2],
                                          'id_vm' => $id_vm,
                                          'id_indicateur' => 2 // 2 étant id indicateur Folder
                                      ));
                                      $requete->execute( array(
                                          'valeur' => $d[3],
                                          'id_vm' => $id_vm,
                                          'id_indicateur' => 3 // 3 étant id indicateur PowerState
                                      ));
                                      $requete->execute( array(
                                          'valeur' => $d[4],
                                          'id_vm' => $id_vm,
                                          'id_indicateur' => 4 // 4 étant id indicateur MemoryGB
                                      ));
                                  }
                                  catch( Exception $e ) {
                                      var_dump( $e );
                                  }
                                   
                              }
                          }

                          -
                          Edité par Benzouye 19 mars 2019 à 16:42:46

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            19 mars 2019 à 16:03:10

                            OK super, ça a bien inséré les enregistrements dans la table mesure.

                            Il reste tout de même un petit point que j'aimerais soulever. J'obtiens des erreurs Undefined offset:2 (3 et 4) aux lignes 44, 49 et 54 de ton code.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 mars 2019 à 16:47:21

                              AlibabaCathy2.0 a écrit:

                              ça a bien inséré les enregistrements dans la table mesure

                              AlibabaCathy2.0 a écrit:

                              J'obtiens des erreurs Undefined offset

                              Si tu as cette erreur l'insertion n'a pas pu fonctionner correctement ... ou à insérer 0 en valeur ...

                              Je vais te laisser débugger un peu le code ... où te laisser poster dans le forum PHP ... Je t'ai déjà bien mâcher le boulot là non ?

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                20 mars 2019 à 10:49:16

                                Non je t'assure, les enregistrements sont complets et n'ont pas l'air d'avoir d'erreurs.

                                Haha oui, merci beaucoup !!

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  20 mars 2019 à 11:17:56

                                  AlibabaCathy2.0 a écrit:

                                  J'obtiens des erreurs Undefined offset

                                  Aux lignes 44, 49 et 54 de mon code il n'y a pas de tableau, donc pas d'offset ... donc je ne comprends pas l'erreur ... Peux-tu poster exactement le code exécuté et exactement l'erreur retournée ?

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                    20 mars 2019 à 15:22:12

                                    <?php
                                    require_once("./menu.php");
                                    $menu = affiche_menu();
                                    ?>
                                    
                                    <head>
                                        <meta charset="utf-8" />
                                        <title>XXX</title>
                                        <link href="style.css" type="text/css" rel="stylesheet" />
                                    </head>
                                    
                                    <?php
                                    echo $menu;
                                    
                                    //header('Content-type: text/html; charset=iso-8859-1'); // Accents
                                    
                                    function listeDossier($dossier) // Fonction qui liste un dossier de façon récursive
                                    {
                                    	if (is_dir($dossier))
                                        {
                                            if($dossierOuvert=opendir($dossier))
                                            {
                                                echo "<ul>";
                                                while(($fichier=readdir($dossierOuvert))!== false)
                                                {
                                                    if ($fichier==".." || $fichier=="." || $fichier=="index.php")
                                                    {
                                                        continue;
                                                    }
                                                    else
                                                    {
                                                         
                                                        if(is_dir("$dossier/$fichier"))
                                                        {
                                                            echo "<li>$fichier</li>";
                                                            listeDossier("$dossier/$fichier");
                                                        }
                                                        else
                                                        {
                                                            echo "<li><a href='$dossier/$fichier'>$fichier</a></li>";
                                                            
                                                            //Affichage de la date
                                    
                                                            if ($fichier[0] == 'v') {
                                                                //Date format récupéré
                                                                $datefichier = substr($fichier, -20, -4);
                                                                //Découpage
                                                                list( $jour, $mois, $annee, $heure, $min) = sscanf( $datefichier, "%d.%d.%d.%d.%d" );
                                                                $sec = '00';
                                                            }
                                                            
                                                            elseif ($fichier[0] == 'E') {
                                                                //Date format récupéré
                                                                $datefichier = substr($fichier, -23, -4);
                                                                //Découpage
                                                                list( $jour, $mois, $annee, $heure, $min, $sec) = sscanf( $datefichier, "%d.%d.%d.%d.%d.%d" );
                                                            }
                                                            
                                                            else {
                                                                echo "erreur 1";
                                                            }
                                     
                                                            $datefichier2 = $annee .'-'. $mois .'-'. $jour .' '. $heure .':'. $min .':' . $sec;
                                                            echo $datefichier2;
                                    
                                                            echo "<br />";
                                    
                                                            try
                                    					    {
                                    					        $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
                                    					    }
                                    					    catch(Exception $e)
                                    					    {
                                    					        die('Erreur : '.$e->getMessage());
                                    					    }
                                    
                                                            //Affichage des valeurs
                                                            
                                                            /* Ouvertre du fichier csv en mode lecture */
                                                            $f = fopen($dossier. '/' . $fichier, 'r+') ;
                                    
                                                            /* Contrôle de l'ouverture */
                                                            if(is_resource($f)) {
                                                                
                                                                /* lis la première ligne dans le vide */
                                                                fgetcsv($f, 4096, ";");
                                    
                                                                /* Boucle sur chaque ligne */
                                                                while(($d = fgetcsv($f, 4096, ";")) !== FALSE) {
                                                                	// On initialise les variables
                                    						        $id_vm = 0;
                                    						        $id_indicateur = 0;
                                    
                                                                    $nom_vm = substr($d[1], 2, strlen($d[1])-4);
                                    
                                    						        try {
                                    						            // On recherche le nom
                                    						            $requete = $bdd->prepare('SELECT id_vm FROM vm WHERE nom = :nom ;');
                                    						            $requete->execute( array( 'nom' => $nom_vm ) );
                                    						            $id_vm = $requete->fetchColumn();
                                    						             
                                    						            // Si le nom n'existe pas
                                    						            if( !$id_vm ) {
                                    						                // On le crée et on récupère son id
                                    						                $requete = $bdd->prepare('INSERT INTO vm(nom) VALUES(:nom) ;');
                                    						                $requete->execute( array( 'nom' => $nom_vm ) );
                                    						                $id_vm = $bdd->lastInsertId();
                                    						            }
                                    
                                                                        /*debug*/
                                                                        //print_r($d);
                                                                        //echo "<br />";
                                    
                                    						            // On insère les valeurs
                                    						            $requete = $bdd->prepare('
                                    						                INSERT INTO mesure (date_heure, valeur, id_vm, id_indicateur) VALUES( :datefichier2, :valeur, :id_vm, :id_indicateur ) ;'
                                    						            );
                                    						            $requete->execute( array(
                                    						            	'datefichier2' => $datefichier2,
                                    						                'valeur' => $valeur = $d[0],
                                    						                'id_vm' => $id_vm,
                                    						                'id_indicateur' => 1 // 1 étant id indicateur VMHost
                                    						            ));
                                    						            $requete->execute( array(
                                    						                'datefichier2' => $datefichier2,
                                    						                'valeur' => $valeur = $d[2],
                                    						                'id_vm' => $id_vm,
                                    						                'id_indicateur' => 2 // 2 étant id indicateur Folder
                                    						            ));
                                    						            $requete->execute( array(
                                    						            	'datefichier2' => $datefichier2,
                                    						                'valeur' => $valeur = $d[3],
                                    						                'id_vm' => $id_vm,
                                    						                'id_indicateur' => 3 // 3 étant id indicateur PowerState
                                    						            ));
                                    						            $requete->execute( array(
                                    						            	'datefichier2' => $datefichier2,
                                    						                'valeur' => $valeur = $d[4],
                                    						                'id_vm' => $id_vm,
                                    						                'id_indicateur' => 4 // 4 étant id indicateur MemoryGB
                                    						            ));
                                    
                                    					        	}
                                    					        	catch( Exception $e ) {
                                    					            	var_dump( $e );
                                    					        	}
                                    
                                                            	}
                                    
                                                            	/* Fermeture du fichier csv */
                                    	                        fclose($f);
                                    
                                    					    }
                                    
                                                        }
                                    
                                                   	}
                                                        
                                                }
                                    
                                            }
                                            echo "</ul>";
                                        }
                                        
                                        else
                                        {
                                            echo "Erreur, le paramètre précisé dans la fonction n'est pas un dossier!";
                                        }
                                    
                                    }
                                    
                                    listeDossier('uploads');
                                    
                                    include("pied_de_page.php");
                                    ?>

                                    Ci-dessus le code que j'exécute et ci-dessous l'erreur que j'obtiens pour chaque fichier

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      20 mars 2019 à 15:33:05

                                      Ce n'est pas sur les mêmes lignes que tu as l'erreur ... ça me paraissait vraiment bizarre ...

                                      Le problème se trouve sur ta variable $d, elle ne semble pas comporter les éléments attendus ... du coup je ne vois pas comment la colonne valeur de ta table mesure pourrait contenir les bonnes données ... ça ne colle pas ... $d[2] $d[3] et $d[4] n'existant pas, la colonne valeur doit contenir 0 ou être vide ...

                                      Il faudrait que tu rajoutes un var_dump( $d ) à la ligne 90 pour essayer de comprendre ce qui se passe.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                        20 mars 2019 à 15:43:38

                                        ok désolé, je me suis mal exprimé

                                        qu'est-ce que je dois comprendre de vardump, c'est une sorte de print_r un peu plus détaillé.

                                        Peut-être que la dernière ligne est vide et c'est là que l'undefine offset apparait mais ça n'explique pas pourquoi il y a deux fois undefine offset : 1 (je dis ça parce que je n'ai l'air d'avoir de  problème au niveau de l'insertion dans la bdd).

                                        ///////////////////////////////////////////////////////////

                                        Oui c'est ça, voici le dernier vardump sur chaque fichier

                                        -
                                        Edité par P5eud0 20 mars 2019 à 15:47:44

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          20 mars 2019 à 15:55:50

                                          AlibabaCathy2.0 a écrit:

                                          ça n'explique pas pourquoi il y a deux fois undefine offset : 1

                                          Ligne 94 de ton code tu appelles 2 fois $d[1], donc l'erreur est affichée 2 fois :

                                          $nom_vm = substr($d[1], 2, strlen($d[1])-4);

                                          AlibabaCathy2.0 a écrit:

                                          vardump, c'est une sorte de print_r un peu plus détaillé

                                          Oui, tu as notamment les types de données, très utiles dans certains cas ...

                                          AlibabaCathy2.0 a écrit:

                                          Peut-être que la dernière ligne est vide et c'est là que l'undefine offset apparait

                                          Oui ce doit être ça, du coup tu dois avoir des erreurs PDO, mais comme tu ne les as pas activé ... A la ligne 70 :

                                          $pdoOptions[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
                                          $bdd = new PDO('mysql:host=localhost;dbname=test;charset=UTF8', 'root', '', $pdoOptions);

                                          -
                                          Edité par Benzouye 20 mars 2019 à 15:59:10

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                            20 mars 2019 à 15:57:52

                                            OK super, j'enlève les erreur de la page grâce à ça merci
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              21 mars 2019 à 15:58:34

                                              Salut, j'ai deux petits problèmes sur ce code

                                              1 -

                                              $pdoOptions[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;

                                              Que fait cette ligne ? Elle configure un attribut PDO de rapport d'erreurs émettant une exception ? (這是什麼中文?)

                                              2 -

                                              //Affichage des valeurs
                                                                      
                                              /* Ouvertre du fichier csv en mode lecture */
                                              $f = fopen($dossier. '/' . $fichier, 'r+') ;
                                              
                                              /* Contrôle de l'ouverture */
                                              if(is_resource($f)) {
                                                                          
                                                /* lis la première ligne dans le vide */
                                                fgetcsv($f, 4096, ";");
                                              
                                                /* Boucle sur chaque ligne */
                                                while(($d = fgetcsv($f, 4096, ";")) !== FALSE) {
                                                                          	
                                                  /*debug*/
                                                  //var_dump($d);
                                                                              
                                                  // On initialise les variables
                                                  $id_vm = 0;
                                                  $id_indicateur = 0;
                                              
                                                  $nom_vm = substr($d[1], 2, strlen($d[1])-4);
                                              
                                                  try {
                                                    $sql1->execute( array( 'nom' => $nom_vm ) ); // On recherche le nom
                                                    $id_vm = $sql1->fetchColumn();
                                              						             
                                                    if( !$id_vm ) {	// Si le nom n'existe pas                
                                                      $sql2->execute( array( 'nom' => $nom_vm ) ); // On le crée et on récupère son id
                                                      $id_vm = $bdd->lastInsertId();
                                                    }
                                                                                  
                                                    for ($i=0; $i < 5; $i++) { // On insère les valeurs
                                                      if ($i == 0) {
                                                        $sql3->execute( array( // On recherche l'enregistrement
                                                          'datefichier2' => $datefichier2,
                                                          'valeur' => $valeur = $d[$i],
                                                          'id_vm' => $id_vm,
                                                          'id_indicateur' => $i + 1 // 1 étant id indicateur VMHost
                                                        ));
                                                        $id_mesure = $sql3->fetchColumn();
                                                                                          
                                                        if( !$id_mesure ) {
                                                          $sql4->execute( array(
                                                            'datefichier2' => $datefichier2,
                                                            'valeur' => $valeur = $d[$i],
                                                            'id_vm' => $id_vm,
                                                            'id_indicateur' => $i + 1 // 1 étant id indicateur VMHost
                                                          ));
                                                        }
                                                      }
                                                      elseif ($i == 1) {
                                                      # code...
                                                      }
                                                      else {
                                                        $sql3->execute( array( // On recherche l'enregistrement
                                                          'datefichier2' => $datefichier2,
                                                          'valeur' => $valeur = $d[$i],
                                                          'id_vm' => $id_vm,
                                                          'id_indicateur' => $i // 2, 3 et 4 étants id indicateur Folder, PowerState et MemoryGB
                                                         ));
                                                        $id_mesure = $sql3->fetchColumn();
                                              
                                                        if( !$id_mesure ) {
                                                          $sql4->execute( array(
                                                            'datefichier2' => $datefichier2,
                                                            'valeur' => $valeur = $d[$i],
                                                            'id_vm' => $id_vm,
                                                            'id_indicateur' => $i // 2, 3 et 4 étants id indicateur Folder, PowerState et MemoryGB
                                                          ));
                                                        }
                                                      }
                                                    }                 
                                                  }
                                                  catch( Exception $e ) {
                                                    var_dump( $e );
                                                  }
                                                }
                                              
                                                /* Fermeture du fichier csv */
                                                fclose($f);
                                              
                                                /* Copie du fichier csv dans repertoire tmp + changement de nom */
                                                //rename($dossier. '/' . $fichier, '/temp/' . $fichier);
                                              }

                                              J'ai essayé de faire la même chose que tu as faite (en cherchant si le nom existait déjà), mais cette fois avec les enregistrements mais je n'ai pas réussi, aucun enregistrement n'est inséré. Je n'arrive pas à trouver l'erreur.

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                21 mars 2019 à 17:19:50

                                                Pour la première question, oui cette option permet à PDO de lever des erreurs propres et donc te permet de mieux comprendre ce qui plante ...

                                                Pour la deuxième question ... Le code n'est pas complet et est très bordélique ...

                                                On ne voit pas où sont instanciés les objets $sql1, 2, 3 et 4 et on ne voit pas l'objet PDO de départ non plus (erreurs activées ?).

                                                Ligne 41 et 62, c'est quoi ces fetchColumn ?

                                                Globalement tu as grandement besoin de travailler ton PHP avant d'aller dans ce genre de complexité ... là je pense que tu n'es pas assez armé pour réussir sans perdre trop de temps ...

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                  22 mars 2019 à 9:32:06

                                                  D'acc désolé, le code entier donne ça :
                                                  <?php
                                                  require_once("./menu.php");
                                                  $menu = affiche_menu();
                                                  ?>
                                                  
                                                  <head>
                                                      <meta charset="utf-8" />
                                                      <title>Import xxxxx</title>
                                                      <link href="style.css" type="text/css" rel="stylesheet" />
                                                  </head>
                                                  
                                                  <?php
                                                  echo $menu;
                                                  
                                                  //header('Content-type: text/html; charset=iso-8859-1'); // Accents
                                                  
                                                  function listeDossier($dossier) // liste un dossier de façon récursive
                                                  {
                                                  	if (is_dir($dossier)) // vérifie que le paramètre précisé dans la fonction est un dossier
                                                      {
                                                          if($dossierOuvert=opendir($dossier)) // ouverture ?
                                                          {
                                                              echo "<ul>";
                                                              while(($fichier=readdir($dossierOuvert))!== false)
                                                              {
                                                                  if ($fichier==".." || $fichier=="." || $fichier=="index.php")
                                                                  {
                                                                      continue;
                                                                  }
                                                                  else
                                                                  {
                                                                       
                                                                      if(is_dir("$dossier/$fichier"))
                                                                      {
                                                                          echo "<li>$fichier</li>";
                                                                          listeDossier("$dossier/$fichier");
                                                                      }
                                                                      else
                                                                      {
                                                                          echo "<li><a href='$dossier/$fichier'>$fichier</a></li>";
                                                                          
                                                  /*--------------------------------------------------------------------------------------------------------------------------------*/
                                                                          //On détermine la date en fonction du nom du fichier (plus flexible avec un switch)
                                                                          
                                                                          /*switch ($fichier[0]) {
                                                                              case 'v':
                                                                                  //Date format récupéré
                                                                                  $datefichier = substr($fichier, -20, -4);
                                                                                  //Découpage
                                                                                  list( $jour, $mois, $annee, $heure, $min) = sscanf( $datefichier, "%d.%d.%d.%d.%d" );
                                                                                  $sec = '00';
                                                                                  break;
                                                  
                                                                              case 'E':
                                                                                  //Date format récupéré
                                                                                  $datefichier = substr($fichier, -23, -4);
                                                                                  //Découpage
                                                                                  list( $jour, $mois, $annee, $heure, $min, $sec) = sscanf( $datefichier, "%d.%d.%d.%d.%d.%d" );
                                                                                  break;
                                                                              
                                                                              default:
                                                                                  # code...
                                                                                  break;
                                                                          }*/
                                                                          
                                                                          if ($fichier[0] == 'v') {
                                                                              //Date format récupéré
                                                                              $datefichier = substr($fichier, -20, -4);
                                                                              //Découpage
                                                                              list( $jour, $mois, $annee, $heure, $min) = sscanf( $datefichier, "%d.%d.%d.%d.%d" );
                                                                              $sec = '00';
                                                                          }
                                                                          
                                                                          elseif ($fichier[0] == 'E') {
                                                                              //Date format récupéré
                                                                              $datefichier = substr($fichier, -23, -4);
                                                                              //Découpage
                                                                              list( $jour, $mois, $annee, $heure, $min, $sec) = sscanf( $datefichier, "%d.%d.%d.%d.%d.%d" );
                                                                          }
                                                                          
                                                                          else {
                                                                              echo "erreur date";
                                                                          }
                                                   
                                                                          $datefichier2 = $annee .'-'. $mois .'-'. $jour .' '. $heure .':'. $min .':' . $sec;
                                                                          echo $datefichier2 . "<br />";
                                                  
                                                  
                                                  /*--------------------------------------------------------------------------------------------------------------------------------*/
                                                  
                                                  
                                                                          $pdoOptions[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
                                                                          require_once("./connect.php");
                                                  
                                                  
                                                                          //Différentes requêtes pour récupérer les informations de la base de données
                                                                          $sql1 = $bdd->prepare('SELECT id_vm FROM vm WHERE nom = :nom ;'); // On recherche le nom
                                                                          $sql2 = $bdd->prepare('INSERT INTO vm(nom) VALUES(:nom) ;'); // On le crée et on récupère son id
                                                                          $sql3 = $bdd->prepare('SELECT id_mesure FROM mesure WHERE date_heure = :datefichier2, valeur = :valeur, id_vm = :id_vm, id_indicateur = :id_indicateur;'); // On recherche l'enregistrement
                                                                          $sql4 = $bdd->prepare('INSERT INTO mesure (date_heure, valeur, id_vm, id_indicateur) VALUES( :datefichier2, :valeur, :id_vm, :id_indicateur ) ;'); // On insère les valeurs
                                                  
                                                  
                                                                          //Affichage des valeurs
                                                                          
                                                                          /* Ouvertre du fichier csv en mode lecture */
                                                                          $f = fopen($dossier. '/' . $fichier, 'r+') ;
                                                  
                                                                          /* Contrôle de l'ouverture */
                                                                          if(is_resource($f)) {
                                                                              
                                                                              /* lis la première ligne dans le vide */
                                                                              fgetcsv($f, 4096, ";");
                                                  
                                                                              /* Boucle sur chaque ligne */
                                                                              while(($d = fgetcsv($f, 4096, ";")) !== FALSE) {
                                                                              	
                                                                                  /*debug OP*/
                                                                                  //var_dump($d);
                                                                                  
                                                                                  // On initialise les variables
                                                  						        $id_vm = 0;
                                                  						        $id_indicateur = 0;
                                                  
                                                                                  /* /!\ Undefined offset*/
                                                                                  $nom_vm = substr($d[1], 2, strlen($d[1])-4);
                                                  
                                                  						        try {
                                                  						            $sql1->execute( array( 'nom' => $nom_vm ) ); // On recherche le nom
                                                  						            $id_vm = $sql1->fetchColumn();
                                                  						             
                                                  						            if( !$id_vm ) {	// Si le nom n'existe pas                
                                                  						                $sql2->execute( array( 'nom' => $nom_vm ) ); // On le crée et on récupère son id
                                                  						                $id_vm = $bdd->lastInsertId();
                                                  						            }
                                                                                                                  
                                                                                      /*for ($i=0; $i < 5; $i++) { // On insère les valeurs
                                                                                          if ($i == 0) {
                                                                                              $sql3->execute( array( // On recherche l'enregistrement
                                                                                                  'datefichier2' => $datefichier2,
                                                                                                  'valeur' => $valeur = $d[$i],
                                                                                                  'id_vm' => $id_vm,
                                                                                                  'id_indicateur' => $i + 1 // 1 étant id indicateur VMHost
                                                                                              ));
                                                                                              $id_mesure = $sql3->fetchColumn();
                                                                                              
                                                                                              if( !$id_mesure ) {
                                                                                                  $sql4->execute( array(
                                                                                                      'datefichier2' => $datefichier2,
                                                                                                      'valeur' => $valeur = $d[$i],
                                                                                                      'id_vm' => $id_vm,
                                                                                                      'id_indicateur' => $i + 1 // 1 étant id indicateur VMHost
                                                                                                  ));
                                                                                              }
                                                                                          }
                                                                                          elseif ($i == 1) {
                                                                                              # code...
                                                                                          }
                                                                                          else {
                                                                                              $sql3->execute( array( // On recherche l'enregistrement
                                                                                                  'datefichier2' => $datefichier2,
                                                                                                  'valeur' => $valeur = $d[$i],
                                                                                                  'id_vm' => $id_vm,
                                                                                                  'id_indicateur' => $i // 2, 3 et 4 étants id indicateur Folder, PowerState et MemoryGB
                                                                                              ));
                                                                                              $id_mesure = $sql3->fetchColumn();
                                                  
                                                                                              if( !$id_mesure ) {
                                                                                                  $sql4->execute( array(
                                                                                                      'datefichier2' => $datefichier2,
                                                                                                      'valeur' => $valeur = $d[$i],
                                                                                                      'id_vm' => $id_vm,
                                                                                                      'id_indicateur' => $i // 2, 3 et 4 étants id indicateur Folder, PowerState et MemoryGB
                                                                                                  ));
                                                                                              }
                                                                                          }
                                                                                      }*/
                                                  
                                                  					        	}
                                                  					        	catch( Exception $e ) {
                                                  					            	var_dump( $e );
                                                  					        	}
                                                                          	}
                                                  
                                                                          	/* Fermeture du fichier csv */
                                                  	                        fclose($f);
                                                  
                                                                              /* Copie du fichier csv dans repertoire tmp + changement de nom */
                                                                              //rename($dossier. '/' . $fichier, '/temp/' . $fichier);
                                                  					    }
                                                                      }
                                                                 	}
                                                              }
                                                          }
                                                          echo "</ul>";
                                                      }
                                                      
                                                      else
                                                      {
                                                          echo "Erreur, le paramètre précisé dans la fonction n'est pas un dossier!";
                                                      }
                                                  
                                                  }
                                                  
                                                  listeDossier('uploads');
                                                  
                                                  include("pied_de_page.php");
                                                  ?>         

                                                  et connect.php

                                                  <?php
                                                  
                                                  try
                                                  {
                                                  	if (empty($pdoOptions)) {
                                                      	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
                                                      }
                                                      else {
                                                      	$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '', $pdoOptions);
                                                      }
                                                  }
                                                  catch(Exception $e)
                                                  {
                                                  	die('Erreur : '.$e->getMessage());
                                                  }
                                                  
                                                  ?>

                                                  Les objets $sql1, 2, 3 et 4 sont instanciés en haut du code, j'ai pensé que ce serait plus clair comme ça. Pareil pour l' l'objet PDO de départ, je l'ai déplacé dans un fichier connect.php.

                                                  Les fetchColumn Ligne 41 et 62, j'ai essayé de refaire la même requête que toi, c'est à dire, je vérifie si l'enregistrement existe en comparant les différents champs de la table mesure avec les variables récupérées de la ligne, s'il existe je récupère l'id sinon j'ajoute l'enregistrement et je récupère l'id.

                                                  Je t'assure que j'ai travaillé avant de commencer ce projet, j'ai suivi le tutoriel de mateo21 sauf que ce que je fais, ce n'est pas tout à fait la même chose mais je me sers de son cours, c'est sûr.

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    22 mars 2019 à 14:00:00

                                                    AlibabaCathy2.0 a écrit:

                                                    Les fetchColumn Ligne 41 et 62, j'ai essayé de refaire la même requête que toi, c'est à dire, je vérifie si l'enregistrement existe en comparant les différents champs de la table mesure avec les variables récupérées de la ligne, s'il existe je récupère l'id sinon j'ajoute l'enregistrement et je récupère l'id.

                                                    Cela signifie que ton programme peut essayer d'insérer plusieurs fois la même mesure ? Bon ... OK ...

                                                    Apparemment tu ne souhaites pas insérer deux fois le même couple vm/indicateur/date/valeur. Dans ce cas ce n'est pas cette logique qu'il faut adopter. Il te faut plutôt mettre en place une contrainte UNIQUE sur la table en question pour ce couple, et faire un INSERT IGNORE. Ainsi MySQL va essayer d'insérer, et si il trouve une donnée identique il ignorera l'insertion sans lever d'erreur et ton programme continuera.

                                                    Après, tu as commenté la partie du code qui est sensée faire les insertions (lignes 136 à 176) ... du coup je ne sais plus où est ton problème ?

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                      22 mars 2019 à 15:06:49

                                                      OK ça devrait le faire, par contre, je ne sais pas comment mettre en place une contrainte UNIQUE sur la table. Je vais tester ça :


                                                      ALTER TABLE mesure
                                                      ADD CONSTRAINT UC_mesure UNIQUE (date_heure, valeur, id_vm, id_indicateur)
                                                      https://www.w3schools.com/sql/sql_unique.asp

                                                      -
                                                      Edité par P5eud0 22 mars 2019 à 15:13:36

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        22 mars 2019 à 15:11:23

                                                        ALTER TABLE mesure
                                                        ADD CONSTRAINT unique_valeur UNIQUE( valeur, id_vm, id_indicateur, date );
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                          22 mars 2019 à 16:17:35

                                                          OK ben super merci beaucoup, j'arrête de t'embêter maintenant. Merci beaucoup pour ton aide.

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Problèmes avec requêtes SQL

                                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                          • Editeur
                                                          • Markdown