Tableau double entrée.

Résolu
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012 - 3 août 2009 à 10:29
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012 - 6 août 2009 à 15:15
Bonjour à tous,
je viens de nouveau soliciter votre aide car je n'arrive pas à faire mon tableau à double entrée si c'est réellement la bonne solution.

En fait, j'ai un script php qui doit parcourir un fichier Excel et récupérer toutes les valeurs ligne par ligne pour les mettre dans ma base de données.

 $nom = $data->sheets[0]['cells'][2][1];
 $prenom = $data->sheets[0]['cells'][2][2];
 $adresse = $data->sheets[0]['cells'][2][3];
 $CP = $data->sheets[0]['cells'][2][4];
 $ville = $data->sheets[0]['cells'][2][5];
 $pseudo = $data->sheets[0]['cells'][2][6];
 $site = $data->sheets[0]['cells'][2][7];


ce scrip me récupère donc les valeurs de la seconde ligne et des cellules 1 à 7 de cette seconde ligne.
Comment lui dire de stocker dans un tableau double entrée toutes les valeurs de chacune des lignes tant qu'il y en a ??
Je coince.
Merci de m'aider à résoudre ce problème.

9 réponses

anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
5 août 2009 à 15:18
OK j'ai trouvé la solution à mon problème tout seul.

En fait ma seconde boucle était en trop, celle contenant for ($c=0; $c < $num; $c++) {}. Je l'ai donc enlevé.

Puis connaissant le nombre exacte de cellules sur une ligne, j'ai pu intégrer directement les valeurs du fichier directement dans mon tableau en saisissant manuellement l'indice.
Ex :
 $nom = $data[0];
 $prenom = $data[1]; 
 $adresse = $data[2];
 $cp = $data[3];
 $ville = $data[4];
 $pseudo = $data[5];
 $site = $data[6];


Ensuite, j'ai ajouté mon script de connexion à la base de données.
Puis j'ai utiliser ma requete INSERT INTO table...
pour implémenter ma base de données.

J'ai ensuite créé une autre requête qui me permettait de sélectionner la première ligne du fichier csv, celle qu'on ne veut pas ajouter à la base, à savoir la ligne qui s'appelle :
Nom Prénom Adresse CP Ville Pseudo Site.

J'ai fait la requete suivante :
"Delete from table Where monchamp = 'Nom'";

Tout simplement. Je suis sûr qu'il n'y aura pas d'autre enregistrements supprimés en même temps à moins qu'il y ait un mec qui s'appelle "Nom" ce dont je doute fort.

Enfin voila, mon script n'est peut être pas optimisé, certainement pas d'ailleurs, mais en tout cas, il fonctionne et ça fait plaisir car ça fait un moment que je cherchais.
J'espère que ce quasi monopost pourra en aider d'autres.
Bon courage à tous.
3
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
3 août 2009 à 16:07
Je continue de chercher. Je pense qu'il me faudrait une fonction php capable de me retourner le nombre de lignes présentes dans mon fichier.
Ainsi pour 0 à nombre de ligne max, je rempli mon tableau.

Le problème est que je n'arrive pas à retourner le nombre de ligne de mon fichier csv.

j'utilise le code suivant :
$data-> read('import/fichier.csv', filesize ('import/fichier.csv'));
echo count(file('import/fichier.csv'));


et ce code me retourne la valeur de 355 alors que je n'ai que deux lignes dans mon fichier.
Quelqu'un peut il m'aider ?
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
3 août 2009 à 19:11
Salut Anthony,

Sans avoir d'infos sur la class que tu utilises il n'est pas possible de t'aider.
Cependant jette un oeil sur la fonction fgetcsv Il y a un exemple sur la manière de parcourir un fichier csv qui devrait t'intéresser.


Cordialement,


Kohntark -
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
4 août 2009 à 09:11
Salut,
merci pour l'info. En fait, j'avais trouvé la fonction fgetcsv et j'essais de l'utiliser depuis hier avec différents morceaux de code que j'ai trouvé.
L'ennui est que ces codes me retournes bien des valeurs mais ils m'affichent une multitudes de caractères spéciaux (carrés avec point d'intérrogation...) et de plus, ils m'affichent beaucoup plus d'enregistrement que je n'en ai dans mon fichier.
Je pense que je dois avoir un problème d'encodage quelque part. Dans ma base, mes champs sont en utf8_unicode et dans mes fichiers, j'utilisait utf8_encode ou decode pour pallier à ces problèmes. mais là, rien n'y fait.

voici mon script sans la partie traitement :
<?php
session_start(); 
require_once '/reader.php';

if(!empty($_FILES['parcourir']['tmp_name']) AND is_uploaded_file($_FILES['parcourir']['tmp_name'])) //si le fichier existe et qu'il a été uploadé correctement, on commence le traitement.
{
if(move_uploaded_file($_FILES['parcourir']['tmp_name'], 'import/fichier.csv'))
{
//Le fichier a été uploadé correctement

$row = 1;
$handle = fopen("import/fichier.csv", "r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    $num = count($data);
    echo " $num champs à la ligne $row: 

\n";
    $row++;
    for ($c=0; $c < $num; $c++) {
        echo $data[$c] . "
\n";
    }
}
fclose($handle);
}
else
{
//Erreur
echo "<script>alert("Erreur lors de la copie du fichier, veuillez contacter votre administrateur.")</script>";
}
}else{
echo "<script>alert("Le fichier est endommagé, veuillez contacter votre administrateur.")</script>";
}


?>



et voici mon fichier :

Test,
Enregistrement ligne 2,


Et voici l'affichage du résultat :

1 champs à la ligne 1:
ࡱá����������������>��þÿ �������������������������1������þÿÿÿ��������ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿ3��������������������� ���

2 champs à la ligne 2:
��� ��� ��������������������������������������������������������� ���!���"���#���$���%���&���'���(���)���*���+���
-���.���/���0���þÿÿÿþÿÿÿ4���þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿR�o�o�t� �E�n�t�r�y�����������������������������������������������ÿÿÿÿÿÿÿÿ��� �����À������F����ê‡.ìÊ`}ó@ÑÊ2���€

1 champs à la ligne 3: .......

Alors voila mon problème, si tu avais la solution,ça serait génial car ça fait un moment que je galère là dessus.
Si quelqu'un d'autre à la solution, je ne crache pas dessus non plus.
Merci de vous intéresser à mon problème
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
4 août 2009 à 09:37
en fait, je viens de trouver une partie de la réponse.
Je ne sais pour quelle raison, mon fichier .csv n'en était en réalité pas vraiment un car j'ai testé en créant un fichier .txt que j'ai renommé en .csv.
J'y ai ajouté mon contenu et il s'affiche nickel. je ne comprend pas pourquoi ça buggé avant mais je suis content que ça fonctionne maintenant.
Il ne me reste plus qu'à placer les infos au bon endroit dans mon tableau et à les importer dans ma base.
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
4 août 2009 à 10:16
Je retrouve donc maintenant mon problème réél de tableau.

dans le script qui parcours mon fichier csv, mon tableau récupère toutes les infos :

$row = 1;
$handle = fopen("import/fichier.csv", "r");
while (($data = fgetcsv($handle, 2000, ";")) !== FALSE) {  
    $num = count($data); //$num compte le nombre de champs à ajouter à la base par ligne.
    echo " $num champs à la ligne $row: 

\n";
    $row++;
    for ($c=0; $c < $num; $c++) {
        echo $data[$c] . "
\n";//ce tableau retourne donc toutes les valeurs que je dois entrer dans ma base
    }
}
fclose($handle);

Le problème est le suivant, sans mon compteur, je récupérais mes variables comme suit :
$nom = $data->sheets[0]['cells'][2][1];
$prenom = $data->sheets[0]['cells'][2][2];
$adresse = $data->sheets[0]['cells'][2][3];
$CP = $data->sheets[0]['cells'][2][4];
$ville = $data->sheets[0]['cells'][2][5];
$pseudo = $data->sheets[0]['cells'][2][6];
$site = $data->sheets[0]['cells'][2][7];


Comment puis je trouver la valeur de mon tableau correspondant à $nom puis à $prenom... et les ajouter à mes variables correspondantes ?
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
4 août 2009 à 16:53
Si je comprend bien le fonctionnement de ma boucle et de mon tableau.
Dans ma boucle WHILE, on compte le nombre de champs pleins à ajouter à la base de données pour une ligne donnée.
Tant qu'il y a un enregistrement à ajouter, on l'écrit dans le tableau $data[$c].
Une fois tous les enregistrements passés, on incrémente le compteur $row de 1 pour passer à la ligne de dessous et on répète l'opération autant de fois qu'il y a de champs pleins.

Ce qui veut dire que tous les éléments dont j'ai besoin se trouvent dans cette boucle là. Je dois donc ajouter mon script de connexion à la base de données et ma requete SQL d'import dans cette boucle, pendant que mon tableau contient l'enregistrement de la ligne et avant de passer à la ligne de dessous.

Je pense être sur la bonne piste mais ce n'est pas évident.
Je vous tiens au courant et continue dans ma réflexion. mais je me sens un peu seul quand même.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
5 août 2009 à 18:37
Je n'ai re parcouru ton script que très rapidement, cependant :
"Delete from table Where monchamp 'Nom'";
> c'est à mon avis une mauvaise idée :
- on a le droit de s'appeler Monsieur Nom, non ?
- ça fait 1 requête inutile de plus

J'aurai plutôt supprimé la première ligne dans le while, du style :
$i = 1;
while (($data = fgetcsv($handle, 2000, ";")) !== FALSE) {
    if ($i == 1) continue;
    $num = count($data); //$num compte le nombre de champs à ajouter à la base par ligne.
    [...]
    $i++;
}


Je ne sais pour quelle raison, mon fichier .csv n'en était en réalité pas vraiment un car j'ai testé en créant un fichier .txt que j'ai renommé en .csv.

=> Ca reste à voir, mais j'ai plus l'impression que ton fichier était bien un csv, le problème étant que l'encodage utilisé pour le créer n'était pas le bon. Le fait de le ré écrire dans un autre programme (??) l'a encodé correctement et de ce fait tout rentre dans l'ordre, mais je peux, comme toujours , me tromper.


Cordialement,

Kohntark -
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
6 août 2009 à 15:15
Salut Kohntark,
merci pour tes réponses, j'attends toujours tes commentaires avec impatience...
Il est vrai qu'une personne peut s'appeler "Nom" mais ça va être très dur pour lui dans la vie !!!
Non, sérieusement, je vais essayer d'adapter mon code pour que celui ci soit quand même plus sécurisé et plus cohérent.
En tout cas merci pour ton aide, j'espère seulement pouvoir un jour te rendre l'appareil, même si je doute que ce soit pour un problème de codage php.
0
Rejoignez-nous