Bonjours ,

Voici mon problème :

  • Lors de l'importation d'une ligne excel (la deuxième) :

![http://imagizer.imageshack.us/a/img924/1680/jhiKn3.png]

  • J'obtiens ceci dans ma base de donnée :

![http://imageshack.com/a/img924/4120/3iIvBG.png]

-Je réimporte ma ligne et j'obtiens ceci :

![http://imageshack.com/a/img923/7898/ZdFbQB.png]

[color=#00FF80]Pour l’instant tous va pour le mieux ! La catégorie et le grade on étais ajoutés ![/color]

  • Maintenant lorsque je modifie le nom d'usage donc bob6 au lieu de bob5 :

![http://imageshack.com/a/img924/7163/wW7UHG.png]

  • J'obtiens ma nouvelle ligne comme voulu car le nom d'usage n'est pas le même :

![http://imageshack.com/a/img922/811/jcraeZ.png]

[color=#FF0000][b]Et là le problème arrive ![/b]
[/color]

  • Lorsque je réimporte cette ligne excel avec le nom différent .

![http://imageshack.com/a/img922/2874/zNIe7H.png]

  • Il me recréer une nouvelle ligne ... (donc une nouvelle personne)

Il n'a donc pas modifier la ligne bob6 comme bob5...

J'ai donc chercher et j'ai trouvé en affichant
$getData[0] -> (voir code plus bas pour information)

et
$nom_dusage -> (idem)


echo "<br>";
      echo "$getData[0]";
      echo "<br>";
      echo "$nom_dusage";
      echo "<br>";
      echo "$getData[1]";
      echo "<br>";
      echo "$prenom";
      echo "<br>";
      echo "$getData[2]";
      echo "<br>";
      echo " $nom_de_famille";
      echo "<br>";
      echo "$getData[3]";
      echo "<br>";
      echo " $date_de_naissance";
      echo "<br>";

J'ai donc remarqué que "$prenom" gardé bob5 et ne prenez pas bob6 ... ?

voici mon code :

Sa ne change rien avec le foreach $nom_dusage reste toujours sur bob6 alors qu'il devrait être à bob7

<?php

if(isset($_POST["Import"])){

  $bdd = new PDO('mysql:host=localhost;dbname=gestion_compte;charset=utf8', 'root', '');

  $reponse = $bdd->query('SELECT * FROM conge');
  $donnees = $reponse->fetchAll();

  if($_FILES["file"]["size"] > 0)
  {

    $file = fopen($_FILES["file"]["tmp_name"], "r");
    fgetcsv($file, 767, ";");
    while (($getData = fgetcsv($file, 767, ";")) !== FALSE)
    {

     $existe = false;
     foreach($donnees as $entree) {
      if ($getData[0] == $entree['nom_dusage'] AND $getData[1] == $entree['prenom'] AND $getData[2] == $entree['nom_famille'] AND $getData[3] == $entree['date_naissance']) {
        $existe = true;

        echo "<script type=\"text/javascript\">
        alert(\"Votre fichier CSV a bien été importé.\");
        window.location = \"test.php\"
      </script>";

      $nb_modifs = $bdd->exec('UPDATE conge SET categorie = "'.$entree['categorie'].'\n \n'.$getData[4].'  "');
      $nb_modifs = $bdd->exec('UPDATE conge SET grade = "'.$entree['grade'].'\n \n'.$getData[5].'"');
    }
    else
    {
        $nom_dusage = $entree['nom_dusage'];
        $prenom = $entree['prenom'];
        $date_de_naissance = $entree['date_naissance'];
        $nom_de_famille = $entree['nom_famille'];

      echo "<br>";
      echo "$getData[0]";
      echo "<br>";
      echo "$nom_dusage";
      echo "<br>";
      echo "$getData[1]";
      echo "<br>";
      echo "$prenom";
      echo "<br>";
      echo "$getData[2]";
      echo "<br>";
      echo " $nom_de_famille";
      echo "<br>";
      echo "$getData[3]";
      echo "<br>";
      echo " $date_de_naissance";
      echo "<br>";
      echo "<script type=\"text/javascript\">
      alert(\"Votre fichier CSV a bien été importé.\");
      window.location = \"test.php\"
    </script>";

    $nb_modifs = $bdd->exec("INSERT into conge (nom_dusage,prenom,nom_famille,date_naissance,categorie,grade) values ('".$getData[0]."','".$getData[1]."','".$getData[2]."','".$getData[3]."','".$getData[4]."','".$getData[5]."')");
  }
}
}
fclose($file);
}
}

Merci de votre aide :) !

22 réponses


C'est moi ou ton else se trouve dans ta boucle while ?
Si c'est le cas, alors ton code n'est pas bon.

Ton $entree contient les données en base, si tu as fait une modif dans ton CSV (excel) tu dois faire une comparaison avec la base pour ensuite faire un UPDATE, chose que je ne vois pas dans ton exemple.

Je te conseil de faire une comparaison entre les données de ta bases et ton CSV, pour ensuite faire un update si besoin.
Regarde du coté de la fonction in_array, tu peux faire pas mal de chose avec

Ok je vais regarder sa , je vous tiens au jus lundi car actuellement j'ai des problémes ! :)

Bonjours,
Voici mon programme aprés modification le probléme etant j'obtiens cette erreur "Erreur avec la base de données"...

<?php
if(isset($_POST['Import'])) {
 try {
  $pdo_extraParams = array(
         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,    // rapport d'erreurs sous forme d'exceptions
         PDO::ATTR_PERSISTENT => true,             // Connexions persistantes
         PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"  // encodage UTF-8
         );
      // Instancie la connexion
  if(!isset($_FILES['file'])) throw new RuntimeException('Formulaire erronné');
  if($_FILES['file']['error'] !== 0) throw new RuntimeException("Erreur à la réception du fichier");
  $pdo = new PDO('mysql:host=localhost;dbname=gestion_compte;charset=utf8', 'root', '', $pdo_extraParams);
  $pdo->beginTransaction();

  $file = fopen($_FILES["file"]["tmp_name"], "r");
  fgetcsv($file, 767, ";");

  $stmt_insert = $pdo->prepare('INSERT INTO conge(nom_dusage, prenom, nom_famille, date_naissance, categorie, grade) VALUES (:nom, :prenom, :famille, :naissance, :categorie, :grade);');
  $stmt_update = $pdo->prepare('UPDATE conge SET categorie = :categorie AND grade = :grade WHERE nom_dusage = :nom AND prenom = :prenom AND nom_famille = :famille AND date_naissance = :naissance;');
  foreach([$stmt_insert, $stmt_update] as $stmt) {
   $stmt->bindParam(':nom', $nom, PDO::PARAM_STR);
   $stmt->bindParam(':prenom', $prenom, PDO::PARAM_STR);
   $stmt->bindParam(':famille', $famille, PDO::PARAM_STR);
   $stmt->bindParam(':naissance', $naissance, PDO::PARAM_STR);
         $stmt->bindParam(':categorie', $categorie, PDO::PARAM_STR); // ou PDO::PARAM_INT par exemple, si plus adapté
         $stmt->bindParam(':grade', $grade, PDO::PARAM_STR); // idem que categorie
       }
       while (($getData = fgetcsv($file, 767, ";")) !== FALSE) {
         //echo '<p>ligne : '  . implode(';', $getData) . '</p>';
         list($nom, $prenom, $famille, $naissance, $categorie, $grade) = $getData;
         $stmt_update->execute();
         if($stmt_update->rowCount() == 0) $stmt_insert->execute();
       }
       $pdo->commit();
       fclose($file);
       $msg = 'Succès';
     }
     catch(PDOException $ex) {
      if(isset($pdo) and ($pdo instanceof PDO) and $pdo->inTransaction())
       $pdo->rollBack();
     error_log($ex->getMessage());
     $msg = "Erreur avec la base de données";
   }
   catch(RuntimeException $ex) {
    $msg = $ex->getMessage();
  }
}
?>

Affiche plutôt le $ex->getMessage() au lieu de ton echo $msg = "Erreur avec la base de données";.

voici le message :
ah non ! j'obtiens plutot ceci : SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'bob7-gzegz25hhtrerhe64-gze54eg' for key 'nom_unique'

et j'ai fait plusieurs et j'observe ceci , je precise que ma base est vide afin de tester dans de bonne conditions :

1) L'insertion est un succès, il ajoute donc bien ma ligne excel (donc la personne) $msg = Succès

2) J'exécute à nouveau et $msg est encore égale à Succès donc il fait "l'update" le seul bémol est que dans la base de données il modifie "categorie" qui passe de "greger" (ce qui est dans mon excel ) à 0 (je ne sais pas pourquoi)

3) Puis j'exécute à nouveau et obtient "Erreur avec la base de données"

Une erreur de syntax peux perturber aussi tous ça.
Je vois dans ta boucle while que tu fais toujours un update, et tu vérifie juste après si celà retourne des lignes qui si j'ai bien compris te permet de savoir si il s'agit d'un insert plutôt qu'un update.
Rien que ça, c'est déjà pas une bonne méthode pour les perfs, j'ai du mal à comprendre d'ailleurs comment tu récupères $nom, $prenom...
Je ne dis pas ça pour être chiant, mais je pense qu'il faut revoir la manière dont tu devrais gérer t'a problématique et éviter toute erreur de syntax, même si ça na pas avoir avec ton problème, ça t'évide d'être submergé.

Je sais mais je ne fait que de changer, changer et rechanger de programme pour au final en avoir aucun de fonctionnel ...

Je compati :/

Merci ^^

J'aimerais juste s'avoir pourquoi categorie passe à 0 ...

Tu as fais des var_dump au fur et à mesure pour voir si t'a variable $categorie retourne pas rien ?
Par ailleurs, tu n'utilises pas la librairie PHPExcel pour gérer t'es fichiers excel ?

Je me pose comme question, pourquoi veux tu mettre à jour des fichiers excels via la base de données si dans tout les cas tu dois charger un fichier php ? Autant faire un export des dernière mise à jour en cas de besoin non ?

J'utilise la librairie PHPExcel pour faire l'export et je cherche pas à les mettres à jour :

Tous simplement , j'ai plusieurs dossier excell donc non c'est de l'importation de plusieurs dossier que j'obtiendrais par exemple chaque jours
ENSUITE c'est excell contienne des informations sur des personnes : chaque ligne, 1 personnes .

Pourquoi passer par un fichier Excell ?aroundPourquoi ne pas modifier directement en BdD, avec une interface de type "admin" ?

Je sais mais le choix est restreint et je suis obligé de plus j'ai une autre fonctions qui me permet de faire sortir ma bdd en excel.

Enfin, du coup, à quoi sert la base de données ?

Elle me permettra de stocker chaque individu et de pouvoir accéder aus informations très simplement et de façons rapide via plusieurs interface mais cela est déjà fait il ne me reste plus que l'importation excell

Voila tous ... si vous avez encore des question je suis à disposition Fukotaku

D'accord, c'est juste que je crois qu'il est possible de lire un fichier excel avec cette librairie, du coup pour la récupération des lignes pour les inserer en base (ou modifier) serai peut-être plus simple ?

Personnellement j'ai utiliser cette librairie que pour l'export, la documentation est pauvre je trouve...
Je comprend très bien pourquoi tu fais ça et c'est toujours interressant d'un point de vue technique.

Ton erreur viens uniquement en cas d'update si je me souviens bien, du faite que categorie passe à 0.
Tu ne m'as toujours pas dit si tu avais vérifié que ta variable $categorie été vide ou non au moment du update, car si ça modifie un champ avec une valeur vide, tout dépend de ta colonne en base, si c'est un INT ou un VARCHAR. Mais je pense qu'il s'agit d'un INT ou d'un TINYINT ?

le débug pas à pas est très important, n'hésite vraiment pas à le faire avec des var_dump() et des die(), tu trouveras sans doute l'anomalie a un moment donné, ce qui nous donneras une piste.

Voici l'endroit de mes var_dump

<?php
if(isset($_POST['Import'])) {
 try {

  $pdo_extraParams = array(
         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,    // rapport d'erreurs sous forme d'exceptions
         PDO::ATTR_PERSISTENT => true,             // Connexions persistantes
         PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"  // encodage UTF-8
         );
      // Instancie la connexion
  if(!isset($_FILES['file'])) throw new RuntimeException('Formulaire erronné');
  if($_FILES['file']['error'] !== 0) throw new RuntimeException("Erreur à la réception du fichier");
  $pdo = new PDO('mysql:host=localhost;dbname=gestion_compte;charset=utf8', 'root', '', $pdo_extraParams);
  $pdo->beginTransaction();

  $file = fopen($_FILES["file"]["tmp_name"], "r");
  fgetcsv($file, 767, ";");

  $stmt_insert = $pdo->prepare('INSERT INTO conge(nom_dusage, prenom, nom_famille, date_naissance, categorie, grade) VALUES (:nom, :prenom, :famille, :naissance, :categorie, :grade);');
  $stmt_update = $pdo->prepare('UPDATE conge SET categorie = :categorie AND grade = :grade WHERE nom_dusage = :nom AND prenom = :prenom AND date_naissance = :naissance;');
  foreach([$stmt_insert] as $stmt) {
   $stmt->bindParam(':nom', $nom, PDO::PARAM_STR);
   $stmt->bindParam(':prenom', $prenom, PDO::PARAM_STR);
   $stmt->bindParam(':famille', $famille, PDO::PARAM_STR);
   $stmt->bindParam(':naissance', $naissance, PDO::PARAM_STR);
   $stmt->bindParam(':categorie', $categorie, PDO::PARAM_STR); 
   $stmt->bindParam(':grade', $grade, PDO::PARAM_STR); 
   var_dump($categorie);                                                                          **********ICI**********
 }
 foreach([$stmt_update] as $stmt) {
  $est = "test";    
  $stmt->bindParam(':nom', $nom, PDO::PARAM_STR);   
  $stmt->bindParam(':prenom', $prenom, PDO::PARAM_STR);        
  $stmt->bindParam(':naissance', $naissance, PDO::PARAM_STR);        
  $stmt->bindParam(':categorie', $est, PDO::PARAM_STR); 
  $stmt->bindParam(':grade', $grade, PDO::PARAM_STR); 
  var_dump($categorie);                                                                          **********ICI**********
}
while (($getData = fgetcsv($file, 767, ";")) !== FALSE) {
         //echo '<p>ligne : '  . implode(';', $getData) . '</p>';
 list($nom, $prenom, $famille, $naissance, $categorie, $grade) = $getData;
 $stmt_update->execute();
 if($stmt_update->rowCount() == 0) $stmt_insert->execute();
}
$pdo->commit();
fclose($file);
$msg = 'Succès';
var_dump($categorie);                                                                                **********ICI**********
}
catch(PDOException $ex) {
  if(isset($pdo) and ($pdo instanceof PDO) and $pdo->inTransaction())
   $pdo->rollBack();
 error_log($ex->getMessage());

}
catch(RuntimeException $ex) {
  $msg = $ex->getMessage();
}
var_dump($categorie);                                                                         **********ICI**********
echo $ex->getMessage();

}

J'obtiens ceci : NULL NULL string(6) "greger" string(6) "greger"

Ta variable $categorie vos bien null au moment ou tu ajoute celle-ci avec tes bindPram de ta boucle foreach avant l'update, du coup ça enregistre 0 sur ta table, si c'est un champ de type INT et par valeur défaut 0.

Ha , ok mais cela ne le fait que a categorie alors que dans ma base categorie est bien un varchar...
5 categorie varchar(100) latin1_swedish_ci Non Aucune

et j'ai trouver un programme pour importer avec la librairie je vais faire quelque recherche et je te redis sa :

Voici le code actuelle :


<?php

  include('/../Classes/PHPExcel/IOFactory.php');

  //Use whatever path to an Excel file you need.
  $inputFileName = 'test.csv';

  try {
    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
    $objPHPExcel = $objReader->load($inputFileName);
  } catch (Exception $e) {
    die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME) . '": ' . 
        $e->getMessage());
  }

  $sheet = $objPHPExcel->getSheet(0);
  $highestRow = $sheet->getHighestRow();
  $highestColumn = $sheet->getHighestColumn();

  for ($row = 2; $row <= $highestRow; $row++) { 
    $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, 
                                    null, true, false);

    //Prints out data in each row.
    //Replace this with whatever you want to do with the data.
    echo '<pre>';
      print_r($rowData);

    echo '</pre>';

  }

il me resort ceci :
Array
(
[0] => Array
(
[0] => bob7;gzegz25hhtrerhe64;greh54;gze54eg;greger;gzegz
)

)
je pense donc que sa va être plus simple avec des arrays maintenant :)

Si je me trompe pas il me les places en colonnes ici ?

Ton array content les colonnes d'une ligne, séparé par des ; ?

Oui mais je pense que c'est parceque mon excel est en csv (séparateur point-virgule)

Voila en format basique j'obtiens ceci qui est nettement mieux :)

Array
(
[0] => Array
(
[0] => bob7
[1] => gzegz25hhtrerhe64
[2] => greh54
[3] => gze54eg
[4] => greger
[5] => gzegz
)

)

Donc tu vas tester avec cette methode ?
Ce sera plus facile à débuguer en tout cas :)

Oui :) Ce sera plus simple. Je reviendrais pour t'informais dans la soirée

Bonjours ,

Je me suis repencher sur ce programme (explication plus bas du pourquoi)

J'ai reussis tous fonctionne parfaitement à une seul erreur qui est que categorie passe toujours à 0 lors de l'update...

<?php
if(isset($_POST['Import'])) {
 try {

  $pdo_extraParams = array(
         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,    // rapport d'erreurs sous forme d'exceptions
         PDO::ATTR_PERSISTENT => true,             // Connexions persistantes
         PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"  // encodage UTF-8
         );
      // Instancie la connexion
  if(!isset($_FILES['file'])) throw new RuntimeException('Formulaire erronné');
  if($_FILES['file']['error'] !== 0) throw new RuntimeException("Erreur à la réception du fichier");
  $pdo = new PDO('mysql:host=localhost;dbname=gestion_compte;charset=utf8', 'root', '', $pdo_extraParams);
  $pdo->beginTransaction();

  $file = fopen($_FILES["file"]["tmp_name"], "r");
  fgetcsv($file, 767, ";");

  $stmt_select = $pdo->prepare('SELECT COUNT(*) FROM conge  WHERE nom_dusage = :nom AND prenom = :prenom AND date_naissance = :naissance;');
  $stmt_insert = $pdo->prepare('INSERT INTO conge(nom_dusage, prenom, nom_famille, date_naissance, categorie, grade) VALUES (:nom, :prenom, :famille, :naissance, :categorie, :grade);');
  $stmt_update = $pdo->prepare('UPDATE conge SET categorie = :categorie AND grade = :grade WHERE nom_dusage = :nom AND prenom = :prenom AND date_naissance = :naissance;');
  foreach([$stmt_select, $stmt_update, $stmt_insert] as $k => $stmt) {

   $stmt->bindParam(':nom', $nom, PDO::PARAM_STR);
   $stmt->bindParam(':prenom', $prenom, PDO::PARAM_STR);
   $stmt->bindParam(':naissance', $naissance, PDO::PARAM_STR);
   if($k == 0) continue;
   elseif($k == 2)
     $stmt->bindParam(':famille', $famille, PDO::PARAM_STR);
   $stmt->bindParam(':categorie', $categorie, PDO::PARAM_STR);
   $stmt->bindParam(':grade', $grade, PDO::PARAM_STR);
 }
 while (($getData = fgetcsv($file, 767, ";")) !== FALSE) {
         //echo '<p>ligne : '  . implode(';', $getData) . '</p>';
   list($nom, $prenom, $famille, $naissance, $categorie, $grade) = $getData;
   $stmt_select->execute();
   if($stmt_select->fetchColumn())
    $stmt_update->execute();
  else
    $stmt_insert->execute();
}
$pdo->commit();
fclose($file);
$msg = 'Succès';
}
catch(PDOException $ex) {
  if(isset($pdo) and ($pdo instanceof PDO) and $pdo->inTransaction())
   $pdo->rollBack();
 error_log($ex->getMessage());
 $msg = "Erreur dans la base de données";
}
catch(RuntimeException $ex) {
  $msg = $ex->getMessage();
}
echo $msg;
}

Explication : Je suis passer à celui ci car pour l'autre j'avais besoin de dé-sérialiser puis comparer chaque ligne.