Tableau double entrée. [Résolu]

anthony428 102 Messages postés vendredi 18 août 2006Date d'inscription 29 mai 2012 Dernière intervention - 3 août 2009 à 10:29 - Dernière réponse : anthony428 102 Messages postés vendredi 18 août 2006Date d'inscription 29 mai 2012 Dernière intervention
- 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.
Afficher la suite 

9 réponses

Répondre au sujet
anthony428 102 Messages postés vendredi 18 août 2006Date d'inscription 29 mai 2012 Dernière intervention - 5 août 2009 à 15:18
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de anthony428
anthony428 102 Messages postés vendredi 18 août 2006Date d'inscription 29 mai 2012 Dernière intervention - 3 août 2009 à 16:07
0
Utile
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 ?
Commenter la réponse de anthony428
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 3 août 2009 à 19:11
0
Utile
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 -
Commenter la réponse de kohntark
anthony428 102 Messages postés vendredi 18 août 2006Date d'inscription 29 mai 2012 Dernière intervention - 4 août 2009 à 09:11
0
Utile
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
Commenter la réponse de anthony428
anthony428 102 Messages postés vendredi 18 août 2006Date d'inscription 29 mai 2012 Dernière intervention - 4 août 2009 à 09:37
0
Utile
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.
Commenter la réponse de anthony428
anthony428 102 Messages postés vendredi 18 août 2006Date d'inscription 29 mai 2012 Dernière intervention - 4 août 2009 à 10:16
0
Utile
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 ?
Commenter la réponse de anthony428
anthony428 102 Messages postés vendredi 18 août 2006Date d'inscription 29 mai 2012 Dernière intervention - 4 août 2009 à 16:53
0
Utile
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.
Commenter la réponse de anthony428
kohntark 3708 Messages postés lundi 5 juillet 2004Date d'inscription 27 avril 2012 Dernière intervention - 5 août 2009 à 18:37
0
Utile
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 -
Commenter la réponse de kohntark
anthony428 102 Messages postés vendredi 18 août 2006Date d'inscription 29 mai 2012 Dernière intervention - 6 août 2009 à 15:15
0
Utile
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.
Commenter la réponse de anthony428

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.