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

  1. #1
    Membre régulier
    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
    Points : 119
    Points
    119
    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 : 31
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 681
    Points : 1 458
    Points
    1 458
    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 régulier
    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
    Points : 119
    Points
    119
    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 : 31
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 681
    Points : 1 458
    Points
    1 458
    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 émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    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
    Vive les roues en pierre

  6. #6
    Membre régulier
    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
    Points : 119
    Points
    119
    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 régulier
    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
    Points : 119
    Points
    119
    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 émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    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>
    Vive les roues en pierre

  9. #9
    Membre régulier
    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
    Points : 119
    Points
    119
    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.

  10. #10
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Citation Envoyé par flavors Voir le message
    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é?
    En fait je parle ici de l'identifiant unique qui permet de singulariser un enregistrement dans une table de BDD. D'une manière générale quand on a besoin de manipuler des enregistrements dans une BDD il faut pouvoir les identifier de manière unique et de façon simple.
    Pour des actus par exemple, on pourrait les identifier en fonction de leur titre, qui pourrait être unique, mais ce n'est pas pratique et source d'erreurs. C'est une des raisons pour lesquelles dans une table on ajoute souvent un identifiant unique, un champ de type entier, auto-incrémenté à chaque nouvelle insertion, ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a_id | a_titre
    1 | une news
    2 | une autre news
    3 | etc
    C'est notamment grâce à ces IDs qu'on peut manipuler facilement des enregistrements via une interface Web.

    Citation Envoyé par flavors Voir le message

    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?
    Non c'est pour la sélection basée sur les IDs qui seront stockés en session à chaque POST. La seule simulation dans le code est $sqlData qui représente le tableau des IDs récupérés depuis la BDD.


    Citation Envoyé par flavors Voir le message

    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]);
    Tous les IDs de la page/tranche courante sont effectivement effacés puis ceux cochés via les checkbox et passés en POST sont réajoutés.

    Citation Envoyé par flavors Voir le message

    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.

    Oui c'est bien ça, après avoir viré ceux de la tranche courante/précédente les nouveaux postés sont sauvés en session et donc récupérable sur n'importe quelle page/script, dont les futures preview/éditons/suppression/export, etc.
    Ce qui est un peu "tricky" c'est que quand on clique par exemple sur suivant, quand on arrive sur la nouvelle page, c'est la sélection de la page précédente qui est postée et traitée.
    A+
    Bon we


    Citation Envoyé par flavors Voir le message

    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.


    [EDIT] Gasp, il manque un truc essentiel dans le code que j'ai posté, la création de la session ! Il faut ajouter session_start() au début :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    session_start();
    // Simulation données SQL
    $sqlData = range(0, 300);
    Vive les roues en pierre

  11. #11
    Membre régulier
    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
    Points : 119
    Points
    119
    Par défaut
    Bonjour et merci encore Djakisback pour vos explication (03h19 ! Vous ne dormez jamais ?^^).

    Ca y est je pense avoir compris.
    Donc dans votre exemple, vous sélectionnez les IDs de la page courante au travers des checkboxs que vous traitez une fois qu'ils sont posté. Dans mon cas, je passe par un tableau où la sélection d'une ligne met son ID correspondant dans une liste. Dans ce cas, il suffirait de faire comme vous : au lieu de transmettre les checkboxs par POST, je transmet ma liste de la même manière que je met dans la liste $SESSION[selection] ? Puis je navigue de page en page comme dans votre exemple en complétant à chaque changement de page ma liste $SESSION[selection].
    ex : 1ere page je sélectionne 1 et 5 dans mon tableau, je change de page donc j'envoie le POST j'ai $SESSION[selection] = 1,5.
    Dans la page où je viens d'arriver, je sélectionne 40, 45et 47, au changement de page, j'ai $SESSION[selection] = 1,5,40,45,47 ?

    IL reste encore un point dont je ne suis pas sûr d'avoir saisie le sens.
    Citation Envoyé par Djakisback Voir le message
    Tous les IDs de la page/tranche courante sont effectivement effacés puis ceux cochés via les checkbox et passés en POST sont réajoutés.
    Si vous supprimez tous les ID précédents, alors on est obligé de faire les actions que pour la page que l'on vient de quitter? Si on on revient sur la page précédente, on aura perdu toutes la sélection qui lui est associée?

    Encore merci de prendre le temps de me répondre et je suis désolé si mes question peuvent paraître un peu "neuneu".

  12. #12
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Citation Envoyé par flavors Voir le message
    Bonjour et merci encore Djakisback pour vos explication (03h19 ! Vous ne dormez jamais ?^^).

    Ca y est je pense avoir compris.
    Donc dans votre exemple, vous sélectionnez les IDs de la page courante au travers des checkboxs que vous traitez une fois qu'ils sont posté. Dans mon cas, je passe par un tableau où la sélection d'une ligne met son ID correspondant dans une liste. Dans ce cas, il suffirait de faire comme vous : au lieu de transmettre les checkboxs par POST, je transmet ma liste de la même manière que je met dans la liste $SESSION[selection] ? Puis je navigue de page en page comme dans votre exemple en complétant à chaque changement de page ma liste $SESSION[selection].
    ex : 1ere page je sélectionne 1 et 5 dans mon tableau, je change de page donc j'envoie le POST j'ai $SESSION[selection] = 1,5.
    Dans la page où je viens d'arriver, je sélectionne 40, 45et 47, au changement de page, j'ai $SESSION[selection] = 1,5,40,45,47 ?
    Oui sans doute, je n'ai pas compris de quel tableau et liste tu parles, de tableaux/listes PHP ou HTML/JS ?

    Citation Envoyé par flavors Voir le message
    IL reste encore un point dont je ne suis pas sûr d'avoir saisie le sens.

    Si vous supprimez tous les ID précédents, alors on est obligé de faire les actions que pour la page que l'on vient de quitter? Si on on revient sur la page précédente, on aura perdu toutes la sélection qui lui est associée?

    Encore merci de prendre le temps de me répondre et je suis désolé si mes question peuvent paraître un peu "neuneu".

    Oui on ne fait bien les actions que pour la page que l'on vient de quitter mais on ne supprimer pas tous les Ids, seulement ceux liés à cette page/tranche.
    Vive les roues en pierre

  13. #13
    Membre régulier
    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
    Points : 119
    Points
    119
    Par défaut
    En fait je parlais du tableau que j'avais donné en lien : https://jsfiddle.net/Flavors/nuzo8gn2/28/
    C'est un tableau qui suit le même exemple mais en plus gros. C'est un tableau HTML issue d'une BDD et affiché avec une fonction PHP. La sélection, deselections et traitement de la liste se fait en JS.
    Ce que je souhaiterais, c'est que ma liste de selection soit toujours en mémoire de sorte à ce que si jamais je reviens sur les pages précédentes, les lignes qui avaient été sélectionné se reselectionnent toutes seules et l'utilisateur peut ainsi les deselectionners.

  14. #14
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Si tu utilises cet exemple et/ou JQuery/JS c'est un plus complexe mais tu peux faire à peu près la même chose à savoir créer un FORM que tu postes au clic sur suivant/précédent, comme dans le code PHP que j'ai posté.
    En revanche vu que tu utilises déjà JQuery/JS autant aller jusqu'au bout et tu pourrais donc aussi mettre à jour ta SESSION à chaque clic en Ajax, voici un principe :

    Pour chaque ligne de ton tableau tu ajoutes une attribut "id" qui correspond à l'ID unique dans ta base de données, ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <tr id="1">...</tr>
    <tr id="2">...</tr>
    A chaque clic, dans ta fonction onclick tu postes via Ajax l'ID de la ligne sélectionnée avec le type d'action (ajouter ou supprimer), ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // pour ajout
    $.post( "selection.php", { action: "add", id: $(this).attr('id')} );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // pour suppr
    $.post( "selection.php", { action: "rem", id: $(this).attr('id') } );
    Tu crées une page pour gérer ta session et ta sélection vers laquelle tu vas envoyer le POST, ex. selection.php :


    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
    <?php
    session_start();
    f(!isset($_SESSION['selection']))	{
    	$_SESSION['selection'] = array();
    }
     
     
    if(isset($_POST['action']) && isset($_POST['id'])){
    	if($_POST['action'] == 'add') {
    		$_SESSION['selection'][intval($_POST['id']))] = '';
    	}
    	else	{
    		unset($_SESSION['selection'][intval($_POST['id']))]);
    	}
    }
     
     
    ?>


    Pour récupérer ta sélection lors de l'arrivée sur une nouvelle page tu peux faire un truc du style lors de la création de tableau comme ton JS détecte la sélection d'une ligne par le passage à class="selected" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    session_start();
    f(!isset($_SESSION['selection']))	{
    	$_SESSION['selection'] = array();
    }
    ?>
    ...
    <tr id="<?php echo $id; ?>" class="<?php echo isset($_SESSION['selection'][$id]) ? 'selected' : 'taclassenormale' ; ?>">...</tr>
    ..
    Est-ce que tu vois le principe ?
    Vive les roues en pierre

  15. #15
    Membre régulier
    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
    Points : 119
    Points
    119
    Par défaut
    Désolé pour un nouveau message assez long. J'ai essayé de faire court pourtant><.
    Surtout si vous n'avez pas le courage de tout lire, dites le moi, j’essaierai de le réduire encore.
    Aussi j'ai tendance à me perdre dans mes explications, donc si ce elles ne sont pas claires dites le moi aussi.
    Citation Envoyé par Djakisback Voir le message

    Pour chaque ligne de ton tableau tu ajoutes une attribut "id" qui correspond à l'ID unique dans ta base de données, ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <tr id="1">...</tr>
    <tr id="2">...</tr>
    Ok. Par contre est-il obligé de passer par un attribut ID ou est il possible de passer par une classe?
    Je m'explique en faisant l'analogie avec mon tableau en exemple :
    Mon tableau est en fait constitué de plusieurs tables issues de ma BDD (je fais une requête avec des INNER JOIN). Le "point central" est la table des "Marques" avec la clé primaire "Id_Marque". Je fais donc un rowspan sur cet "Id_Marque" et j'ai ajouté une class "ligne_x" à chaque ligne ayant cet "Id_Marque" (dans la BDD) pour pouvoir changer le style CSS sur l'ensemble des éléments de la marque. Mes actions sont donc effectuées par rapport à l'"Id_Marque" mais compte tenu du rowspan, cet Id n'est présent que sur la 1ere ligne du rowspan (ex : sur l'ensemble des lignes ayant la classe "ligne_2" seule la 1ere à l'Id_Marque). L’intérêt que j'ai à vouloir passer par une classe et non un id est de pouvoir, en cliquant sur n'importe quelle ligne au niveau du rowspan, récuperer la valeur "Id_Marque" par un petit script JS.
    Est-ce donc gênant de récupérer la valeur de l'Id de la BDD au travers d'un attribut class et non d'un attribut id?

    A chaque clic, dans ta fonction onclick tu postes via Ajax l'ID de la ligne sélectionnée avec le type d'action (ajouter ou supprimer), ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // pour ajout
    $.post( "selection.php", { action: "add", id: $(this).attr('id')} );
    Ici, je pense bien avoir compris avec vos annotations, vous faites le poste en ajax pour la suppression ou l'ajout dans la liste de $SESSION:
    J'ai 2 questions par rapport à cela.

    - La 1ere dépend de la réponse à la question du dessus (Désolé ça fait encore beaucoup de questions et de texte ><)
    Si je peux utiliser les attribut de classe pour ma recherche d'id est-ce que je peux placer le POST en ajax ainsi dans mon code ?
    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
     
    //Fonction JS pour selectionner les lignes
    $('tbody').on( 'click', 'tr', function () //Lors d'un clic sur une ligne du tableau mais pas sur l'en-tête
    {
    	$classe = $(this).attr('class')//On recupére le nom de la classe de la ligne sur laquelle on a cliqué (plusieur lignes peuvent avoir la même classe elles sont rangées dans l'ordre croissant des "ligne_x") la classe des lignes a été mise en place pour la selection avec rowspan
    	if($(this).hasClass('selected')) 
    	{
    		Suppr_Liste($classe);
    		$('tr[class="'+$classe+'"]').removeClass('selected');//On enleve la classe "selected" aux élément ayant la même classe que la ligne cliquée
    	}
    	else
    	{
    		$('tr[class="'+$classe+'"]').addClass('selected');//On ajoute la classe "selected" aux élément ayant la même classe que la ligne cliquée
    		Ajout_Liste();
    	}
    });
    //Fonction JS pour Mettre à jour la liste des elements selectionnes
    function Suppr_Liste($classe)
    {	
    	var search = $('tr[class="'+$classe+'"]').find('.col_marque').text();
    	$.post( "selection.php", { action: "rem", id: search } );
     
    }
    (Comme on est dans le forum PHP, je suis désolé pour le code JS)

    - Ma 2éme question est aussi en rapport avec l'ajax mais sur cette partie :
    Citation Envoyé par Djakisback Voir le message
    Tu crées une page pour gérer ta session et ta sélection vers laquelle tu vas envoyer le POST, ex. selection.php :
    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
    <?php
    session_start();
    f(!isset($_SESSION['selection']))	{
    	$_SESSION['selection'] = array();
    }
     
     
    if(isset($_POST['action']) && isset($_POST['id'])){
    	if($_POST['action'] == 'add') {
    		$_SESSION['selection'][intval($_POST['id']))] = '';
    	}
    	else	{
    		unset($_SESSION['selection'][intval($_POST['id']))]);
    	}
    }
     
    ?>
    J'ai fais quelque recherches sur AJAX et donc si j'ai bien compris votre code, on fait un POST sur la page "selection.php", ce qui fait qu'on peut y envoyer notre Id , y utiliser les fonctions et plus tard récupérer (en AJAX toujours) notre liste $SESSION sans avoir à recharger la page actuel contrairement à un POST basique? (c'est magique?^^).

    Citation Envoyé par Djakisback Voir le message
    Pour récupérer ta sélection lors de l'arrivée sur une nouvelle page tu peux faire un truc du style lors de la création de tableau comme ton JS détecte la sélection d'une ligne par le passage à class="selected" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    session_start();
    f(!isset($_SESSION['selection']))	{
    	$_SESSION['selection'] = array();
    }
    ?>
    ...
    <tr id="<?php echo $id; ?>" class="<?php echo isset($_SESSION['selection'][$id]) ? 'selected' : 'taclassenormale' ; ?>">...</tr>
    ..
    Là je j'ai compris(YOUHOU). Dans mon cas par exemple si je voudrais faire un suppression de plusieurs éléments dans ma BDD, lors d'un clique sur un bouton "supprimer", je pourrais me rediriger vers une page au début de laquelle, je récupère ma liste $SESSION comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    session_start();
    if(!isset($_SESSION['selection']))	{
    	$_SESSION['selection'] = array();
    }
    et je peux faire une requête vers ma BDD pour afficher cette liste sous la même forme que mon ancien tableau. Enfin après confirmation de l'utilisateur, je fais une requête de suppression toujours avec cette liste.

    Citation Envoyé par Djakisback Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <tr id="<?php echo $id; ?>" class="<?php echo isset($_SESSION['selection'][$id]) ? 'selected' : 'taclassenormale' ; ?>">...</tr>
    Super! Je ne l'avais pas compris directement, mais cela sert par exemple si je reviens dans les pages précédentes pour reselectionner automatiquement les ligne qui l'avait été ?
    Citation Envoyé par Djakisback Voir le message
    Est-ce que tu vois le principe ?
    Du coup oui maintenant j'y vois beaucoup plus clair! Mis à part pour mes petits doutes pour savoir si on à le droit d'utiliser class au lieu d'id.

    Vous êtes super et vos explication vraiment bien.
    Merci beaucoup.

  16. #16
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Citation Envoyé par flavors Voir le message
    Ok. Par contre est-il obligé de passer par un attribut ID ou est il possible de passer par une classe?
    Je m'explique en faisant l'analogie avec mon tableau en exemple :
    Mon tableau est en fait constitué de plusieurs tables issues de ma BDD (je fais une requête avec des INNER JOIN). Le "point central" est la table des "Marques" avec la clé primaire "Id_Marque". Je fais donc un rowspan sur cet "Id_Marque" et j'ai ajouté une class "ligne_x" à chaque ligne ayant cet "Id_Marque" (dans la BDD) pour pouvoir changer le style CSS sur l'ensemble des éléments de la marque. Mes actions sont donc effectuées par rapport à l'"Id_Marque" mais compte tenu du rowspan, cet Id n'est présent que sur la 1ere ligne du rowspan (ex : sur l'ensemble des lignes ayant la classe "ligne_2" seule la 1ere à l'Id_Marque). L’intérêt que j'ai à vouloir passer par une classe et non un id est de pouvoir, en cliquant sur n'importe quelle ligne au niveau du rowspan, récuperer la valeur "Id_Marque" par un petit script JS.
    Est-ce donc gênant de récupérer la valeur de l'Id de la BDD au travers d'un attribut class et non d'un attribut id?
    Ce serait possible de récupérer l'id en splittant en JS les chaînes de caractères de type "ligne_1" sur le caractère "_", voir split(). C'est pas super propre mais ça marche, faudrait aussi faire attention au fait qu'une ligne sélectionnée passe en class="ligne_1 selected"

    Citation Envoyé par flavors Voir le message
    - La 1ere dépend de la réponse à la question du dessus (Désolé ça fait encore beaucoup de questions et de texte ><)
    Si je peux utiliser les attribut de classe pour ma recherche d'id est-ce que je peux placer le POST en ajax ainsi dans mon code ?
    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
     
    //Fonction JS pour selectionner les lignes
    $('tbody').on( 'click', 'tr', function () //Lors d'un clic sur une ligne du tableau mais pas sur l'en-tête
    {
    	$classe = $(this).attr('class')//On recupére le nom de la classe de la ligne sur laquelle on a cliqué (plusieur lignes peuvent avoir la même classe elles sont rangées dans l'ordre croissant des "ligne_x") la classe des lignes a été mise en place pour la selection avec rowspan
    	if($(this).hasClass('selected')) 
    	{
    		Suppr_Liste($classe);
    		$('tr[class="'+$classe+'"]').removeClass('selected');//On enleve la classe "selected" aux élément ayant la même classe que la ligne cliquée
    	}
    	else
    	{
    		$('tr[class="'+$classe+'"]').addClass('selected');//On ajoute la classe "selected" aux élément ayant la même classe que la ligne cliquée
    		Ajout_Liste();
    	}
    });
    //Fonction JS pour Mettre à jour la liste des elements selectionnes
    function Suppr_Liste($classe)
    {	
    	var search = $('tr[class="'+$classe+'"]').find('.col_marque').text();
    	$.post( "selection.php", { action: "rem", id: search } );
     
    }
    (Comme on est dans le forum PHP, je suis désolé pour le code JS)
    Oui a priori ça devrait marcher mais il faudra un traitement supplémentaire pour extraire l'id de "ligne_1" ou "ligne_1 selected", du coup il vaudrait mieux supprimer le selected AVANT l'ajax :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		$('tr[class="'+$classe+'"]').removeClass('selected');//On enleve la classe "selected" aux élément ayant la même classe que la ligne cliquée
    		Suppr_Liste($(this).attr('class'));
    Puis faire un split du type :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function Suppr_Liste($classe)
    {	
    	var search = $classe.split("_");
    	$.post( "selection.php", { action: "rem", id: search[1] } );
     
    }
    (pas super propre mais effectivement le rowSpan complique...)

    Citation Envoyé par flavors Voir le message
    - Ma 2éme question est aussi en rapport avec l'ajax mais sur cette partie :

    J'ai fais quelque recherches sur AJAX et donc si j'ai bien compris votre code, on fait un POST sur la page "selection.php", ce qui fait qu'on peut y envoyer notre Id , y utiliser les fonctions et plus tard récupérer (en AJAX toujours) notre liste $SESSION sans avoir à recharger la page actuel contrairement à un POST basique? (c'est magique?^^).
    Oui c'est bien ça


    Citation Envoyé par flavors Voir le message
    Là je j'ai compris(YOUHOU). Dans mon cas par exemple si je voudrais faire un suppression de plusieurs éléments dans ma BDD, lors d'un clique sur un bouton "supprimer", je pourrais me rediriger vers une page au début de laquelle, je récupère ma liste $SESSION comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    session_start();
    if(!isset($_SESSION['selection']))	{
    	$_SESSION['selection'] = array();
    }
    et je peux faire une requête vers ma BDD pour afficher cette liste sous la même forme que mon ancien tableau. Enfin après confirmation de l'utilisateur, je fais une requête de suppression toujours avec cette liste.


    Super! Je ne l'avais pas compris directement, mais cela sert par exemple si je reviens dans les pages précédentes pour reselectionner automatiquement les ligne qui l'avait été ?
    Oui c'est bien ça aussi
    A priori avec WHERE id IN(...) en SQL.
    Vive les roues en pierre

  17. #17
    Membre régulier
    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
    Points : 119
    Points
    119
    Par défaut
    C'est encore moi je viens vous embêter une dernière fois (c'est promis).

    Citation Envoyé par Djakisback Voir le message
    Ce serait possible de récupérer l'id en splittant en JS les chaînes de caractères de type "ligne_1" sur le caractère "_", voir split(). C'est pas super propre mais ça marche, faudrait aussi faire attention au fait qu'une ligne sélectionnée passe en class="ligne_1 selected"

    Oui a priori ça devrait marcher mais il faudra un traitement supplémentaire pour extraire l'id de "ligne_1" ou "ligne_1 selected", du coup il vaudrait mieux supprimer le selected AVANT l'ajax :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		$('tr[class="'+$classe+'"]').removeClass('selected');//On enleve la classe "selected" aux élément ayant la même classe que la ligne cliquée
    		Suppr_Liste($(this).attr('class'));
    Puis faire un split du type :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function Suppr_Liste($classe)
    {	
    	var search = $classe.split("_");
    	$.post( "selection.php", { action: "rem", id: search[1] } );
     
    }
    (pas super propre mais effectivement le rowSpan complique...)
    Je ne saisie pas vraiment pourquoi il faut faire tout ces traitement.
    Mon explication est surement confuse.
    Quand je demandais si c'était "gênant de récupérer la valeur de l'Id de la BDD au travers d'un attribut class et non d'un attribut id?" je ne parlais pas de la récupérer directement dans le nom de la classe mais de le retrouver dans l’ensemble des ligne ayant cette classe.
    Mon Id est en fait le 1er élément de chaque rowspan ici la marque serait mon Id (dans ma vrai application mes Id sont tous nommé comme ceci "P100" ,"P101",...).
    Du coup j'imagine qu'il suffit de passer par quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var search = $('tr[class="'+$classe+'"]').find('.col_marque').text();
    $classe est la classe de la ligne sur laquelle on a cliqué et "col_marque" est la classe de la colonne contenant tous les Id.
    J'ai donc bien search = Id_Marque.

    Je suis désolé mon explication n'était en effet pas très claire.

  18. #18
    Membre régulier
    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
    Points : 119
    Points
    119
    Par défaut
    Bonjour, je suis désolé de revenir vers vous une nouvelle fois mais je rencontre un problème avec la requête AJAX (enfin je crois)
    Lorsque j’exécute le post en ajax, j'observe une erreur depuis l'outils developeur de chrome:
    j'ai :
    Name - Status - Type - Initiator
    selection.php - 500 Internal Server Error - text/html - jquery-1.11.3.min.js:5 Script


    Auriez-vous une idée quant à la source de cette erreur?

    Merci

    EDIT :
    Citation Envoyé par Djakisback Voir le message


    Tu crées une page pour gérer ta session et ta sélection vers laquelle tu vas envoyer le POST, ex. selection.php :

    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
    <?php
    session_start();
    f(!isset($_SESSION['selection']))	{
    	$_SESSION['selection'] = array();
    }
     
    if(isset($_POST['action']) && isset($_POST['id'])){
    	if($_POST['action'] == 'add') {
    		$_SESSION['selection'][intval($_POST['id']))] = '';
    	}
    	else	{
    		unset($_SESSION['selection'][intval($_POST['id']))]);
    	}
    }
     
    ?>
    Un instant j'ai cru que c'était une erreur à ce niveau là :
    Il n'y a pas des parenthèses en trop?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    unset($_SESSION['selection'][intval($_POST['id']))]);
    // au lieu de
    unset($_SESSION['selection'][intval($_POST['id'])]); 
     
    //et 
    $_SESSION['selection'][intval($_POST['id']))] = '';
    // au lieu de 
    $_SESSION['selection'][intval($_POST['id'])] = '';
    Je ne sais pas si elles étaient en trop ou sis c'est normal mais ça ne change rien à l'erreur.

    RE-EDIT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $_SESSION['selection'][intval($_POST['id']))] = '';
    A cette ligne là, vous allez dans le tableau"selection" de $SESSION à la place "id", par exemple, si j'ai id =3 ça fait : $SESSION['selection'][3]? mon id étant une chaine je vais voir si ça vient de là.
    dans ce cas je ne comprends pas le ='' en faisant ça on ne rajoute rien à cette ligne ?

    Je vais me penchez sur ces choses la et vous donne un retour quand je trouve.

+ 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, 19h28
  2. Réponses: 2
    Dernier message: 12/05/2015, 15h49
  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, 17h16
  4. Réponses: 4
    Dernier message: 27/01/2009, 13h34
  5. [Avis] Conseil sur un élement WEB
    Par Delphy113 dans le forum Webdesign & Ergonomie
    Réponses: 3
    Dernier message: 29/01/2007, 15h11

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