IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Demande d'avis/conseil sur la façon de gérer les données issues d'une BDD


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Par défaut Demande d'avis/conseil sur la façon de gérer les données issues d'une BDD
    Bonjour à tous!

    Je suis débutant en développement Web et il y a une semaine j'ai débuté une petite application. Je me demendais donc si vous pouviez me dire si mon raisonnement est correct, vos avis, vos conseil ou comment il faudrait faire si ce n'est pas une façon correct de réaliser la chose.

    Je vais essayer de rapidement vous décrire son fonctionnement en mettant une numérotation comme ça si vous voulez aborder un point en particulier ce sera plus simple :
    Je possède une BDD avec beaucoup d'entrées que je souhaite afficher dans un tableau HTML.

    1 - Comme il y a beaucoup de données, je pense mettre un système de pagination comme celui-ci ://www.youtube.com/watch?v=dYMi89K1Bsg où à chaque page j'ai un tableau HTML avec un certain nombre d'entrées de ma BDD (20,50 ou 100).

    2 - Pour chaque page, je créais le tableau directement depuis ma fonction php (avec quelques conditions/ boucles car il y a des rowspans à générer).

    3 - Chaque ligne du tableau est sélectionnée en cliquant dessus pour ensuite effectuer des actions avec l'ensemble des lignes sélectionnées. Lorsqu'une ligne est sélectionnée, sa 1ere cellule de la ligne(qui correspond à la clé primaire de ma table dans la BDD) est mise dans un array qui est transmis à chaque changement de page de la pagination (pour ne pas perdre les données précédemment sélectionnées). (Est-ce réalisable? Je veux dire est-il possible, lors d'un clic sur le bouton pour aller sur la page suivante, d'envoyer l'array qui contient toutes les 1ere cellules des lignes sélectionnées (par un POST par exemple)?)

    4 - Après la sélection, lors du choix d'une action (suppression / export vers excel), je fais une nouvelle requête SQL avec comme condition l'array des lignes sélectionnées pour montrer une dernière fois la sélection à l'utilisateur avant qu'il ne valide l'action.

    (C'est la ma plus grosse question : est-ce correct de refaire une requête SQL avec comme condition l'array des selection où aurait-il mieux valu stocker entièrement les lignes sélectionnées dans des array d'array? Car pour moi refaire une requête est beaucoup plus simple que devoir gérer des array d'array mais je ne sais pas si c'est "correct" de faire comme cela...)

    Désolé pour ce post assez long mais je pense que les éléments dépendent les uns des autres et qu'il est plus pratique d'avoir une vue d'ensemble pour pouvoir donner son avis.

    Donc si vous pouviez me dire si ma façon de procéder est correct, mais aussi me donner votre avis, des conseils ou la façon dont vous auriez fait la chose. Car je suis débutant et j'ai tant de chose à apprendre=) !

    Merci .

  2. #2
    Modérateur
    Avatar de Kreepz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 681
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Pour ma part j'aurais plutôt avec JQuery, tu as de nombreux tutoriels disponibles pour le réaliser et en plus tu as un plugin pour JQuery qui te permet de gérer ton tableau.
    Pensez à regarder nos cours et tutoriels PHP ainsi que notre FAQ PHP avant de poser votre question!
    Un message vous a aidé, n'oubliez pas le

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Par défaut
    Citation Envoyé par Kreepz Voir le message
    Pour ma part j'aurais plutôt avec JQuery
    Vous parlez du tableau?

    Pour ce qui est de datatable, quelqu'un m'en a parlé mais étant débutant en JS et PHP, j'avoue que cela m'a l'air assez compliqué a mettre en place...

  4. #4
    Modérateur
    Avatar de Kreepz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 681
    Billets dans le blog
    1
    Par défaut
    Oui je parle du tableau, il faut que tu le fasse en Php et ensuite tu as seulement à appeler le plugin.

    Exemple: Ton tableau à l'id "Tab1"
    Dans cette même page tu créé une fonction Javascript comme celle-ci:

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $(function() {
            $("#Tab1").dataTable({
                columnDefs: [
                    {
                        type: 'date-eu',
                        targets: 4,
                        type: 'numeric-comma',
                        targets: 6
                    }
                ],
                "bPaginate": true,
                "bLengthChange": true,
                "bFilter": true,
                "bSort": true,
                "bInfo": true,
                "bAutoWidth": false
     
            });
     
        });

    Si tu sais faire ton tableau avec Php c'est tout bon! Mais si tu rencontre des problèmes rien ne t'empêche de passer par le forum pour demander un petit coup de main!
    Pensez à regarder nos cours et tutoriels PHP ainsi que notre FAQ PHP avant de poser votre question!
    Un message vous a aidé, n'oubliez pas le

  5. #5
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    voici un principe en PHP (si tu es débutant ou si tu veux apprendre, de mon côté j'aurais tendance à te déconseiller JQuery/Ajax, etc. mais la pagination complique pas mal le truc) :

    1 et 2) Tu passes en GET ou POST le start limit ou le numéro de page dans tes liens précédents/suivants puis tu fais une requête SQL en utilisant LIMIT

    3) Pour la sélection tu ne stockes que l'ID des enregistrements que tu peux effectivement passer en GET ou POST mais c'est la galère car tu dois les passer dans tous tes href, le plus simple est d'utiliser une session PHP
    Dans ton cas le mieux sans XHR semble de soumettre ton FORM au clic sur tes liens précédent/suivant en POST, ce qui veut dire que la sélection ne sera enregistrée/désenregistrée que si un utilisateur change de page ou clique sur un bouton d'action du type "Supprimer", etc. Le problème est qu'il faut vider le tableau des id lors de la désélection ce qui complique un peu.
    Si tu veux une sélection en temps réel et plus ergonomique tu peux utiliser XHR ou juste du JS.

    4) Oui ce qui se fait en général est une requête basée sur le tableau des IDs, ex. sans les tests de sécurité : WHERE id IN('.implode(',', $_SESSION['selection']).')';
    Je ne comprends pas bien ta notion d'array d'arrays, j'ai l'impression que tu pensais actuellement stocker tous les champs de chaque enregistrement dans des arrays ? Si oui, il vaut mieux partir sur le stockage uniquement des ID, la BDD sert justement à être interrogée, c'est pas ici que tu gagneras des perfs a priori

    5) Et finalement le plus ergonomique pour l'utilisateur est peut-être de ne pas conserver les ID de page en page mais d'effectuer les actions uniquement pour la page en cours, tout dépend de comment tu réalises ton point n°4, la preview de la sélection

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Par défaut
    @Kreepz
    Qu'entendez-vous par savoir faire un tableau en php?
    Pour l'instant pour la création de mon tableau, je passe par des boucles et des conditions comme je dois créer des rowspans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    //*******************************************************************************************************************
    //Import de la base de donnée
    function Import()
    {
    	global $bdd;
    	$nligne = 0;
    	$reponse = $bdd->prepare('SELECT * FROM voitures ORDER BY marque'); //On classe les résultats en fonction de la marque pour faciliter leur exploitation dans les boucles
    	$reponse->execute();//On lance la requéte
     
    	$data[0]=NULL;//Déclaration de Data pour ne pas avoir les notices 
    	while($donnees = $reponse->fetch())//Tant qu'on a des données qui arrive de la requéte
    	{	
    		//Test pour voir si c'est une nouvelle marque
    		if($data[0][0] == $donnees[0])//C'est la même marque que la ligne précédente
    		{	
    			array_push($data,$donnees);//On met la nouvelle ligne à la fin du tableau
    		}
    			else//Si c'est une nouvelle marque
    		{
    			Insertion_tableau($data,$nligne);
    			$nligne ++;
    			$data = array($donnees); //On écrase data avec les données d'une nouvelle disso
    		}
    	}
    	Insertion_tableau($data,$nligne); //On fait une insertion aprés la boucle pour la dérniére marque du tableau
    }
     
    //*******************************************************************************************************************
    //Création tableau HTML
    function Insertion_tableau(&$data, &$nligne)
    {
    	if($data[0] != NULL)//Condition pour la 1ere ligne (sinon rajoute ligne vide au début du tableau)
    	{				
    		$height = count($data); //On prend le nombre d'enregistrements dans data(qui representent le nb de voiture d'une même marque) pour calculer le rowspan
    		if($height==1) // Si il y a une seule ligne
    		{
    			echo '<tr class="ligne_'.$nligne.'"> <td class="col_marque">'.$data[0][0].'</td> <td>'.$data[0][1].'</td> <td>'.$data[0][2].'</td> <td>'.$data[0][3].'</td> </tr>'; //On ne met pas de rowspan s'il ya une seule ligne	
    		}
    		else //Si il y a plusieurs ligne
    		{
    			echo '<tr class="ligne_'.$nligne.'"> <td class="col_marque" rowspan="'.$height.'">'.$data[0][0].'</td> <td rowspan="'.$height.'">'.$data[0][1].'</td> <td>'.$data[0][2].'</td> <td>'.$data[0][3].'</td> </tr>'; //On place le rowpsan sur la 1ere ligne
     
    			for($i=1 ; $i<$height ; $i++) // On commence à 1 car la 1ere ligne a déjà été placé
    			{
    				echo '<tr class="ligne_'.$nligne.'"> <td>'.$data[$i][2].'</td> <td>'.$data[$i][3].'</td> </tr>';
    			}
    		}
    	}	
    }
    Le problème c'est de faire un rowspan avec datatable, d'aprés ce que j'en ai vu, ce n'est pas possible.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    3) Pour la sélection tu ne stockes que l'ID des enregistrements que tu peux effectivement passer en GET ou POST mais c'est la galère car tu dois les passer dans tous tes href, le plus simple est d'utiliser une session PHP
    Dans ton cas le mieux sans XHR semble de soumettre ton FORM au clic sur tes liens précédent/suivant en POST, ce qui veut dire que la sélection ne sera enregistrée/désenregistrée que si un utilisateur change de page ou clique sur un bouton d'action du type "Supprimer", etc. Le problème est qu'il faut vider le tableau des id lors de la désélection ce qui complique un peu.
    Je ne comprends pas cette partie. Si j'ai bien compris une session PHP est une sorte de variable "superglobale"? Donc je fais en sorte que les bouton pour naviguer dans mes pages soit des SUBMITS et que quand je clique dessus j'envoie mon array des champs selectionnés par POST vers la page où j'ai cliqué? Mais dans ce cas on ne se sert pas de la session?

    Citation Envoyé par Djakisback Voir le message
    Si tu veux une sélection en temps réel et plus ergonomique tu peux utiliser XHR ou juste du JS.
    Vous voulez dire quelque chose comme ça ? : https://jsfiddle.net/Flavors/nuzo8gn2/28/
    Admettons que ce soit un tableau qui se situe sur une des pages, je POST l'array des lignes selectionnés vers la page suivante ou precedente?

    Citation Envoyé par Djakisback Voir le message
    Je ne comprends pas bien ta notion d'array d'arrays, j'ai l'impression que tu pensais actuellement stocker tous les champs de chaque enregistrement dans des arrays ? Si oui, il vaut mieux partir sur le stockage uniquement des ID, la BDD sert justement à être interrogée, c'est pas ici que tu gagneras des perfs a priori
    Ce que je pensais faire c'était de récupérer la valeur du 1er champs de chaque ligne sélectionnée (https://jsfiddle.net/Flavors/nuzo8gn2/28/) et effectuer une requete avec la liste de ces champs. Si j'ai bien compris, c'est cette méthode qu'il faut adopter?
    Pour ce qui est des array d'array, je ne savais pas si le fait de réinterrogé la BDD est considéré comme correct, c'est pour quoi je me demander s'il ne fallait pas mieux faire un array des lignes sélectionnées(et non pas du 1er champs uniquement). Mais la 1ere solution m'est beaucoup plus pratique donc si elle est correcte tant mieux!
    Citation Envoyé par Djakisback Voir le message
    5) Et finalement le plus ergonomique pour l'utilisateur est peut-être de ne pas conserver les ID de page en page mais d'effectuer les actions uniquement pour la page en cours, tout dépend de comment tu réalises ton point n°4, la preview de la sélection
    Le problème, c'est que l'utilisateur pourrait vouloir sélectionner des lignes qui sont sur des pages différentes. C'est pour cela que je voulais garder la liste des 1er champs des lignes selectionnées, comme ça si l'utilisateur avance dans les pages, il peut en ajouter et si il revient en arrière, il peut deselectionner celle qu'il avait selectionné

    En tout cas merci à vous deux d'avoir pris le temps de me répondre et désolé si mes questions ou mes réponses peuvent paraître bizares, je ne suis qu'un newbi.

  8. #8
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Oui les sessions permettent de stocker des données sur le serveur et les passer de script en script. De toute façon même en passant en XHR il me semble que c'est la solution à adopter pour le stockage des Ids.
    Oui aussi, je pensais à soumettre le formulaire en POST mais il faut tout de même sauvegarder les IDs de page en page dont soit les passer par exemple dans un input hidden, soit les stocker en session.
    Le problème est la déselection couplé au découpage en pagination car un POST de checkbox non cochée n'est pas envoyée. Voici un exemple fonctionnel :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    <?php
    // Simulation données SQL
    $sqlData = range(0, 300);
     
     
     
    // Config/initialisation
    $nbPerPage = 30;
    if(!isset($_SESSION['selection']))	{
    	$_SESSION['selection'] = array();
    	$_SESSION['lastStart'] = 0;
    }
     
     
     
     
    $start = 0;
    if(isset($_POST['start']))	{
    	$start = intval($_POST['start']);
     
    	// Tests aux bornes
    	if($start < 0)	{
    		$start = 0;
    	}
    	if($start > count($sqlData) - $nbPerPage)	{
    		$start = (count($sqlData) - $nbPerPage);
    	}
     
    	// Traitement de la sélection postée
    	// Suppression de tous les id non sélectionnés pour la tranche actuelle
    	for($i = $_SESSION['lastStart'], $c = $i + $nbPerPage; $i < $c; $i++)	{
    		if(isset($_SESSION['selection'][$i]))	{
    			unset($_SESSION['selection'][$i]);
    		}
    	}
    	$_SESSION['lastStart'] = $start;
     
    	// Ajout de la sélection courante
    	if(isset($_POST['selection']) && is_array($_POST['selection']))	{
    		for($i = 0; $i < count($_POST['selection']); $i++)	{
    			$_SESSION['selection'][intval($_POST['selection'][$i])] = '';
    		}
    	}
     
    	// Affichage de la sélection courante
    	echo 'Sélection en session<pre>';
    	var_dump($_SESSION['selection']);
    	echo '</pre>';
    }
     
     
     
    ?>
     
     
    <form method="POST">
    <?php
    $i = 0;
    for($i = $start, $c = $i + $nbPerPage; $i < $c; $i++)	{
    	echo $sqlData[$i];
    	?>
     <input type="checkbox" name="selection[]" value="<?php echo $sqlData[$i];?>"<?php echo isset($_SESSION['selection'][$sqlData[$i]]) ? ' checked' : '';?>><br>
    	<?php
    }
    ?>
    <input type="hidden" name="select">
    <input type="submit" name="start" value="<?php echo $i - $nbPerPage * 2; ?>">
    <input type="submit" name="start" value="<?php echo $i; ?>">
    </form>

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Par défaut
    Merci beaucoup pour vote aide.

    Ok je pense que j'y vois de plus en plus clair. Néanmoins je ne pense pas avoir compris grand chose à votre code><.

    Quand vous parlez de stockage des IDs, vous parlez des 1er champs des lignes qui ont été sélectionné?
    Je ne comprends pas le POST de checkbox. Les checkbox sont juste là pour simuler la sélection qu'il y aurait dans un tableau?

    D'aprés ce que j'ai compris, vous générez les IDs sous forme de checkbox pour la page actuel?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for($i = $start, $c = $i + $nbPerPage; $i < $c; $i++)	{
    	echo $sqlData[$i];
    	?>
     <input type="checkbox" name="selection[]" value="<?php echo $sqlData[$i];?>"<?php echo isset($_SESSION['selection'][$sqlData[$i]]) ? ' checked' : '';?>><br>
    	<?php
    }
    Puis vous effacer toute la sélection précédente?
    Vous marquez "Suppression de tous les id non sélectionnés" mais même les IDs selectionnés sont supprimés puisque vous bouclez de $lastPage à $lastPage + $nbPerPage?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Suppression de tous les id non sélectionnés pour la tranche actuelle 
    	for($i = $_SESSION['lastStart'], $c = $i + $nbPerPage; $i < $c; $i++)	{
    		if(isset($_SESSION['selection'][$i]))	{
    			unset($_SESSION['selection'][$i]);
    Ici vous ajoutez les "selection" POSTé à l'array "selection" de SESSION?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Ajout de la sélection courante
    	if(isset($_POST['selection']) && is_array($_POST['selection']))	{
    		for($i = 0; $i < count($_POST['selection']); $i++)	{
    			$_SESSION['selection'][intval($_POST['selection'][$i])] = '';
    		}
    	}
    En fait ce que je ne comprend pas c'est la partie suppression des IDs non sélectionnées.

    Je pars ce soir et serais absent ce we et n'aurais donc pas accès à mon ordinateur jusqu'à dimanche soir.
    Malheureusement je n'ai pas eu le temps de bien étudier le code dans le détail. Sera-t-il possible de vous reposer d’éventuelles questions lundi?

    Merci encore.
    Passez un bon week-end.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CV] Demande d'avis, conseils
    Par Dia_FR dans le forum CV
    Réponses: 7
    Dernier message: 25/01/2017, 20h28
  2. Réponses: 2
    Dernier message: 12/05/2015, 16h49
  3. [XL-2007] comparer les données reçues sur un mois et completer les données manquantes par une macro.
    Par wisemanvsfatboy dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/11/2010, 18h16
  4. Réponses: 4
    Dernier message: 27/01/2009, 14h34
  5. [Avis] Conseil sur un élement WEB
    Par Delphy113 dans le forum Webdesign & Ergonomie
    Réponses: 3
    Dernier message: 29/01/2007, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo