Page 1 sur 1

Pb avec fgetcsv()

Posté : 03 mai 2006, 11:52
par Brad
Bonjour,

Je teste un script qui ouvre un fichier csv et les données du fichier sont envoyées dans la base. Une vérification est faite pour savoir si ces informations ne sont pas dèjà présentes dans la base. Jusque là tout fonctionne. Voici le code:
<?php

include("config.inc.php");


$fichier = "example.csv";
$fic = fopen($fichier, 'rb');


while ($ligne=fgetcsv($fic, 1024, ";"))
{

  $select="SELECT titre FROM reference WHERE titre=\"$ligne[0]\"";
   
  $req= mysql_query($select);
  if(mysql_num_rows($req)>0)
  {
  print "Les données existent déjà";
  }
  else
  {
  $requete="INSERT INTO reference (titre,type,editeur,artiste,langue) VALUES (\"$ligne[0]\",\"$ligne[3]\",\"$ligne[2]\",\"$ligne[1]\",\"$ligne[4]\")";
  $execute= mysql_query($requete) or die(mysql_error());
  print "Les données ont été insérées";
  }
   
}
?>
Le problème est qu'il m'écrit autant de fois le message "Les données existent déjà" ou "Les données ont été insérées" qu'il n'y a de lignes dans mon fichier?

Est-ce que l'utilisation de fgetcsv() est la bonne méthode?

Merci pour votre aide.

Posté : 03 mai 2006, 12:00
par Ryle
Oui c'est la bonne méthode, celà dit, comme il boucle sur chaque ligne, il est normal tel que sont placés tes messages, qu'il te dise pour chaque ligne que celle ci existe déjà ou qu'elle a été insérée.

Pour éviter cela, au lieu d'un print du message dans le while, tu peux utiliser des "flags" ou des compteurs que tu incrémentes, pour savoir combien de lignes ont été insérées, ou étaient déjà existantes, et tu affiches le résultats une fois sorti de ta boucle while quand tu as obtenu les valeurs finales :)

Pb avec fgetcsv()

Posté : 03 mai 2006, 12:06
par Brad
Bonjour,

Je vais essayer avec un compteur en plus si il y a un doublon il vaut mieux renvoyé un message avec le nom du doublon afin qu'il soit enlevé du fichier. En revanche je ne sais pas ce qu'est un flag?

Merci.

Posté : 03 mai 2006, 12:29
par Ryle
Un flag c'est juste une variable qui te permet de savoir si quelque chose s'est produit ou non, en changeant de valeur. (à l'image de ces petits drapeaux que tu trouves sur les boites aux lettres et que les facteurs lèvent lorsqu'ils déposent du courrier. Ca évite aux gens de se déplacer pour rien et de sortir en robe de chambre et chaussons dans le froid pour arriver devant la boite aux lettres et découvrir qu'il n'y a pas de courrier ;))

Par exemple tu peux déclarer une variable $isErreur avec pour valeur "false" au début de ton script, tester dans ta boucle s'il y a une erreur la mettre à "true", et consulter une fois ta boucle terminée la valeur de ton flag :
Si $isErreur est encore à faux, c'est que le traitement c'est bien passé, s'il est à vrai, c'est qu'il y a eu une erreur, tu peux ainsi par exemple en avertir l'utilisateur pour qu'il recommence ou corrige quelque chose :)

Ceci dit, dans ton cas, je pense effectivement le compteur est plus pratique (le principe étant exactement le même, si tu comptes les lignes en erreur, 0 indiquera que tout c'est bien passé et > 0 qu'il y a eu des erreurs)

Pb fgetcsv()

Posté : 03 mai 2006, 15:04
par Brad
Je réussis à faire afficher mes messages une seule fois.

Mais je ne réussis pas à faire afficher une seule fois le message avec le nom de tous les doublons.
Si je fais afficher le nom des doublons dans le while, les données sont correctes mais je ne peux pas afficher une seule fois le message. Et si je sors de mon while je fais afficher le message une seule fois mais tous les doublons n'apparaissent pas.

Posté : 03 mai 2006, 16:21
par Ryle
Utilises un tableau pour stocker les noms de tes doublons dans ton while :)

Une fois sorti du while, tu peux compter le nombre d'éléments contenus dans le tableau (count() ou sizeOf()) pour savoir s'il y a eu des doublons, et boucler dessus (while(), for(), foreach()) pour les consulter :)

Pb fgetcsv()

Posté : 03 mai 2006, 16:32
par Brad
J'ai bien essayé mais cela ne fonctionne. A chaque fois que je stocke mes données dans un tableau et que je les sors de mon while, je n'ai plus les tous les doublons de signaler. Par exemple si j'ai 3 doublons, je n'ai plus que le dernier doublon de signaler.

Posté : 03 mai 2006, 16:40
par Ryle
c'est probablement parce que tu écrases à chaque fois la valeur précédente :)
$tabDoublon = array();
while (...) {
  ...
  if( doublon ) {
    array_push ($tabDoublon, $nomDuDoublon); // ajoute à la fin du tableau
    // ceci doit marcher également et revenir au même :
    // $tabDoublon[] = $nomDuDoublon;
  }
}

if(count($tabDoublon)>0) { // il y a au moins un doublon
  echo 'Il y a '.count($tabDoublon).' doublons : ';
  foreach($tabDoublon as $nomDuDoublon) {
    echo '<br>' . $nomDuDoublon ; // affiche chaque élément
  }
}

Pb fgetcsv()

Posté : 03 mai 2006, 17:05
par Brad
Merci pour ton aide!

Cela fonctionne. Je ne connaissais pas array_push!

Je remets tout le code:
<?php

include("config.inc.php");


$fichier = "example.csv";
$fic = fopen($fichier, 'rb');


//Insertion d'un fichier csv dans une table MYSQL
$doublons=array();

while ($ligne=fgetcsv($fic, 1024, ";"))
{

//On vérifie si les données existent déjà dans la base
  
  $select="SELECT titre FROM reference WHERE titre=\"$ligne[0]\"";
   
  $req= mysql_query($select);
  $count=mysql_num_rows($req);
  if ($count > 0)
  {
  $doublons[]=$ligne[0];
  }
  else
  {
  $requete="INSERT INTO reference (titre,type,editeur,artiste,langue) VALUES (\"$ligne[0]\",\"$ligne[3]\",\"$ligne[2]\",\"$ligne[1]\",\"$ligne[4]\")";
  $execute= mysql_query($requete) or die(mysql_error());
  
  }
   
}

 
if(count($doublons)>0)
{ // il y a au moins un doublon 
  echo 'Il y a '.count($doublons).' doublons : '; 
  foreach($doublons as $nomDuDoublon)
  { 
    echo '<br>' . $nomDuDoublon ; // affiche chaque élément 
  } 
} 

fclose( $fic ); 

?>

Posté : 03 mai 2006, 17:27
par Ryle
Juste deux petites remarques tant que j'y suis :

- Concernant tes requêtes sql, utilise plutôt des apostrophes (') au lieu des guillemets (") pour encadrer les chaines de caractères. Ca sera non seulement plus facile à lire, et de plus certains sgbd n'acceptent pas autre chose, c'est donc une bonne habitude à prendre :)
$requete="INSERT INTO reference (titre,type,editeur,artiste,langue) VALUES ('$ligne[0]','$ligne[3]','$ligne[2]','$ligne[1]','$ligne[4]')"; 
- Pour vérifier un doublon, au lieu de faire un "SELECT tonChamp ...", tu peux faire un "SELECT COUNT(*) ..." vu que tu n'utilises pas le résultat de la requête. Il sera plus rapidement exécuté et te répondra directement 0 ou 1 selon qu'il ait trouvé ou pas d'enregistrement identique :
$select="SELECT COUNT(*) AS nb FROM reference WHERE titre='$ligne[0]'"; 
$req= mysql_query($select) or die (mysql_error()); // p'tit complément d'info en cas d'erreur, ça fait pas de mal ;)
$count = mysql_result($query, 0, 'nb'); // retourne la valeur de nb, donc du count(*)

if ($count > 0) 
...

Pb fgetcsv()

Posté : 03 mai 2006, 17:42
par Brad
J'ai apporté des corrections au script car il ne fonctionnait pas comme il fallait. Même en présence de doublons, les données du fichiers étaient insérées. Maintenant, les données ne sont insérées que si l'on supprime les doublons du fichier.
<?php

include("config.inc.php");


$fichier = "example.csv";
$fic = fopen($fichier, 'rb');


//Insertion d'un fichier csv dans une table MYSQL
$doublons=array();

$requete=array();

while ($ligne=fgetcsv($fic, 1024, ";"))
{

//On vérifie si les données existent déjà dans la base
  
  $select="SELECT titre FROM reference WHERE titre=\"$ligne[0]\"";
  $req= mysql_query($select);

  $count=mysql_num_rows($req);
  if ($count > 0)
  {
  $doublons[]=$ligne[0];
  }

  $requete[]="INSERT INTO reference (titre,type,editeur,artiste,langue) VALUES (\"$ligne[0]\",\"$ligne[3]\",\"$ligne[2]\",\"$ligne[1]\",\"$ligne[4]\")";
     
}

 
if(count($doublons)>0)
{ // il y a au moins un doublon 
  echo 'Il y a '.count($doublons).' doublons : '; 
  foreach($doublons as $nomDuDoublon)
  { 
    echo '<br>' . $nomDuDoublon ; // affiche chaque élément 
  } 
} 
else
{
  foreach($requete as $requete1)
  {
  $execute= mysql_query($requete1) or die(mysql_error());
  }
  print "Les données ont été insérées";
}


fclose( $fic ); 

?>