Page 1 sur 1

Lecture 2 csv 1 tableau

Posté : 20 oct. 2013, 23:22
par eiffel74
Bonjour,

J'ai un csv avec 2 colonnes (IdCategorie;Nom) et un 2ie csv avec 6 colonnes (#Item;Titre;Catégorie;Âge visé;Multi-joueurs;IdPhoto).

La colonne Catégorie du 2ie csv correspond à la colonne IdCategorie du premier csv.

J'aimerais pouvoir afficher un tableau avec les colonnes du 2ie csv mais en remplaçant la colonne Catégorie par le Nom de celle-ci.

Présentement j'y arrive, mais ce n'est pas très beau:
 <?php 

$fpitems = fopen($_SERVER["DOCUMENT_ROOT"]."/frimousse/Item.csv", 'r');
// Headrow
$headitems = fgetcsv($fpitems, 4096, ';', '"');
 
// Rows
while($columnitems = fgetcsv($fpitems, 4096, ';', '"'))
{

    $columnitems = array_combine($headitems, $columnitems);
	if ($columnitems['Catégorie'] == "1") {
    $cat = "Jeu de motricité";
} elseif ($columnitems['Catégorie'] == "2") {
    $cat = "Jeu d'habileté/rapidité";
	} elseif ($columnitems['Catégorie'] == "3") {
    $cat = "Jeu sensoriel";
	} elseif ($columnitems['Catégorie'] == "4") {
    $cat = "Jeu de rôles";
	} elseif ($columnitems['Catégorie'] =="5") {
    $cat = "Jeu de hasard";
	} elseif ($columnitems['Catégorie'] == "6") {
    $cat = "Jeu de construction/assemblage";
	} elseif ($columnitems['Catégorie'] == "7") {
    $cat = "Jeu de créativité/artistique";
	} elseif ($columnitems['Catégorie'] == "8") {
    $cat = "Jeu de stratégie/réflexion";
	} elseif ($columnitems['Catégorie'] == "9") {
    $cat = "Jeu de vocabulaire";
	} elseif ($columnitems['Catégorie'] == "10") {
    $cat = "Jeu mathématique";
	} elseif ($columnitems['Catégorie'] == "11") {
    $cat = "Jeu d'apprentissage/connaissance";
	} elseif ($columnitems['Catégorie'] == "12") {
    $cat = "Jeu de mémoire";
	} elseif ($columnitems['Catégorie'] == "13") {
    $cat = "Jeu de plein air";
	} elseif ($columnitems['Catégorie'] == "14") {
    $cat = "Livre avec dessins seulement";
	} elseif ($columnitems['Catégorie'] == "15") {
    $cat = "Livre avec textes et dessins";
	} elseif ($columnitems['Catégorie'] == "16") {
    $cat = "Livre avec textes seulement";
	} elseif ($columnitems['Catégorie'] == "17") {
    $cat = "Livre de bricolages";
	} elseif ($columnitems['Catégorie'] == "18") {
    $cat = "Livre destiné aux parents";
	} elseif ($columnitems['Catégorie'] == "19") {
    $cat = "Cassette vidéo - Dessins animés";
	} elseif ($columnitems['Catégorie'] == "20") {
    $cat = "Cassette vidéo - Film";
	} elseif ($columnitems['Catégorie'] == "21") {
    $cat = "Cassette audio";
	} elseif ($columnitems['Catégorie'] == "22") {
    $cat = "CD-Rom audio";
	} elseif ($columnitems['Catégorie'] == "23") {
    $cat = "CD-Rom informatique";
} else {
}

?>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td style="width:100px"><?php echo $columnitems['Titre']?></td>
    <td style="width:100px"><?php echo $cat ?></td>
    <td  style="width:100px"><?php
if (empty($columnitems['IdPhoto']))
{
 
} else {
?>
<img src="<?php $_SERVER['DOCUMENT_ROOT'];?>/frimousse/dataimg/i<? echo $columnitems['IdPhoto']?>.jpg">

<?php 
 }
 ?>
 </td>
  </tr>
</table>
<?php }
?>
J'aimerais aussi avoir un select m'affichant la catégorie et en soumettant que la page affiche que les items de la catégorie demandé. Présentement j'ai ça:
<form method="post" action="items.php" onsubmit="return validateForm()">
<select name="Categorie">
<?php 


$fp = fopen($_SERVER["DOCUMENT_ROOT"]."/frimousse/Categorie.csv", 'r');
// Headrow
$head = fgetcsv($fp, 4096, ';', '"');
 
// Rows
while($column = fgetcsv($fp, 4096, ';', '"'))
{
    $column = array_combine($head, $column);
	
?>

<option name="categorieNom" value="<?php echo $column['Nom']?>"><?php echo $column['Nom']?></option>
<?php
 }

?>
</select>
<input name="" type="submit" />
</form>
Mais je n'arrive pas à faire afficher que les items de la catégorie demandé.

Merci de votre aide.

Re: Lecture 2 csv 1 tableau

Posté : 21 oct. 2013, 07:38
par xTG
while($columnitems = fgetcsv($fpitems, 4096, ';', '"'))
{

  if( $_POST['categorieNom'] == $columnitems[2] )
  {
    // on affiche
  }
  else
  {
    // on affiche pas
  }
}
:)

Re: Lecture 2 csv 1 tableau

Posté : 21 oct. 2013, 15:16
par eiffel74
Merci, ça marche.

J'ai commencé par changer la valeur de mon select (j'y ai mis le id qui correspond $columnitems['Catégorie']) par la suite j'ai ajouté :
if( $_POST['categorieNom'] == $columnitems[2] )
ce que je faisait de mal c'est que j'inversait $post avec $colomnitems.

Maintenant comment faire une pagination? Si vous pouviez m'aider.

Merci encore

Re: Lecture 2 csv 1 tableau

Posté : 21 oct. 2013, 19:28
par moogli
salut,

pour la pagination c'est pas super complexe, mais il te faut deux données :
- le nombre d’élément maximum que tu va afficher (donc soit le nombre de ligne de ton csv soit le nombre de ligne correspondant à ton tri.
- le nombre d’élément par page :)

le nombre de page c'est relativement simple : nbpage = nbligne / nb ligne par page (je te laisse regarder la doc de la fonction ceil pour voir et comprendre pourquoi tu va devoir l'utiliser ;))/

ensuite le passage entre les pages. Pour cela il te faut un lien précédent et un suivant.
il y a deux écoles, ceux qui passe le numéro de la page suivante et ceux qui passe une valeur remarquable.
dans ton cas tu affiche des lignes d'un fichier qui ne devrait pas trop bouger passer le numéro de passe est la bonne idée, tu pourras ainsi déterminer facilement la première ligne à afficher sur la page suivante ou précédente.
comment ?
sachant que l'on a X ligne par page et que l'on est à la page Y. qu'elle est le premier élément a afficher ?
tatonnons :
X * Y : le nombre de ligne total sur Y page
X* (Y-1) : le nombre de ligne total Y- 1 page
(X * (Y-1)) +1 : le nombre de ligne total jusqu’à la fin de la précédente + 1, donc la première ligne de la page Y ;)

comment afficher une page ?
si je connais la première ligne à afficher et le nombre de ligne à afficher une simple boucle for suffit
for( $i = $premièreLigne, $i < $dernièreLigne, $i++) {}
avec $dernièreLigne = $premièreLigne + $nbLigneParPage;
pourquoi ne pas mettre le calcul dans la boucle for ?
parce ce que tu veux afficher 50 lignes tu va faire 50 fois ce calcul, alors que la tu ne fait qu'une fois.
on a donc "gagné" (ou plutôt économisé) 49 fois ce calcul, tu multiplie par le nombre de page vu ça fait pas mal de calcul pour rien d'éviter ;) ).

tu as à peux prêt tout, sauf une chose : comment gérer avec les lignes souhaitées pour utiliser la boucle for ?
le plus simple serait d'utiliser la fonction file pour monter le tableau en mémoire. Mais si le fichier est très volumineux (disons plusieurs dizaine de méga octet) tu risque de saturer la mémoire que php peux utiliser pour ton script et l’arrêter en court de route.
c'est une bonne solution si tu maîtrise la taille du fichier (genre 1Mo max).

une autre solution serait de lire le fichier au file de l'eau comme tu le fait et "compter" les saut de ligne, lorsque tu arrive a la première ligne à afficher tu remplis en tableau avec les infos dont tu as besoin et tu arrête a la dernière ligne dont tu as besoin (break).

une fois que tu as un beaux tableau avec tes données tu l'utilise dans la boucle for.

le problème de ces solutions c'est qu'elles sont lentes et vraiment pas pratique.
peux être devrait tu songer a utiliser une base de donnée. Suivant les besoin une base comme SQlite est suffisante.
si tu part sur cette voir tu n'as qu'une seule fois à réaliser l'insertion des données en base et les requêtes seront plus simple (à chaque mise à jour du fichier il faut rejouer la mise à jour de la base bien sur ;) ).

@+

Re: Lecture 2 csv 1 tableau

Posté : 21 oct. 2013, 19:42
par eiffel74
J'avais pensé à la base de données, le problème c'est que j'ai une base de données Access protégée (*.mde) et que la seule exportation possible est en csv.

Sinon, ce serais de lire mon fichier csv et de le sauver dans une base mysql sauf que je ne sais pas comment.

Pour ce qui est de savoir le nombre d’élément maximum, j'ignore le nombre de ligne de mon fichier csv, donc il faudrait compter le nombre de ligne du fichier et par la suite lui dire d'afficher que le nombre d’élément par page.

J'ai vu et essayé plusieurs script de pagination mais je n'y arrive pas.

Re: Lecture 2 csv 1 tableau

Posté : 21 oct. 2013, 20:12
par moogli
commence par régler le coup de l'accès ensuite c'est relativement simple.

si tu utiliser une base de données (accèssible) tu va y gagner en souplesse d'utilisation et en performance (tu va pas te taper 50Mo de fichier pour afficher la dernière page).

l'insertion de fichier CSV dans mysql se fait avec load data ou au pire avec un script php c'est simple, tu parse le fichier comme tu le fait actuellement et dans le while tu fait un insert en base ;).

il y a un exemple de pagination ici basé sur une base mysql.

@+