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 :

Détruire un sous-tableau en fonction de son contenu


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut Détruire un sous-tableau en fonction de son contenu
    Bonjour,
    Je souhaite enregistrer en cookie des configurations de formulaires générés en JavaScript.
    Avant d'enregistrer une nouvelle configuration, je voudrais effacer une configuration antérieure qui porterait le même nom, si possible SANS parcourir tout le contenu du cookie.
    Voici mon code:
    Code php : 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
    		// Traitement du $_POST
    		unset($_POST['valid'], $_POST['all']);
    		if (empty($_POST['insField'])) {
    			//$errors[] = PRINT_ERR_POST;
    			break;
    		}
    		// Sauvegarde de la configuration
    		$save = trim($_POST['save']);
    		if (!empty($save)) {
    			$cookie = [];
    			if (isset($_COOKIE['save'])) {
    				$cookie = unserialize($_COOKIE['save']);
    				// Si le nom de sauvegarde existe déjà on détruit l'ancienne sauvegarde
    				if (in_array($save, array_column($cookie, 'save'))) {
    					// Le but est d'obtenir ici la clé du $cookie pour détruire la clé et sa valeur
    					// Ce qui suit est un essai qui ne me paraît pas être la bonne méthode
    					$post[] = $_POST;
    					var_dump(array_intersect_key($post, $cookie)); // Ne fonctionne pas si les index ne sont pas les mêmes
    				}
    			}
    			$cookie[] = $_POST;
    			setcookie('save', serialize($cookie), time() + 3600*24*3650);
    		}

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 240
    Points : 15 542
    Points
    15 542
    Par défaut
    quel est la forme que peuvent avoir les données dans le cookie ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    Bonjour,
    Comme on peut le voir sur la ligne 21, le cookie est un tableau numérique qui contient une série de $_POST (tableau associatif).
    La seule clef constante de chaque $_POST est le nom de la clef de sauvegarde 'save' comme ceci:

    [
    0=>[tableau $_POST n°1],
    1=>[tableau $_POST n°2],
    2=>[tableau $_POST n°3],
    ...
    ]

    Un tableau $_POST se présente comme ceci:
    [
    'clef1' => 'valeur1',
    'clef2' => 'valeur2',
    ...
    'clefN' => 'valeurN',
    'save' = 'nomducookie'
    ]

    Pour plus de clarté ce que je voudrais faire à la place des lignes 17 et 18 c'est un unset($cookie[$key]) lorsque $cookie[$key]['save'] = $save, sachant qu'au départ, je ne connais pas le $key.

  4. #4
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Bonjour,
    Tu peux faire un truc comme ça
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $key = array_search($save, array_column($cookie, 'save'));
    if ($key !== FALSE) {
        unset($cookie[$key]['save']);
    }

    Avec ça , il ne prendra que le premier index en cas de valeurs identiques de $save
    Le bienfait n'est jamais perdu

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    Bonjour,
    J'ai trouvé la solution suivante qui m'oblige à parcourir tout l'array:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		$save = trim($_POST['save']);
    		if (!empty($save)) {
    			$cookie = [];
    			if (isset($_COOKIE['save'])) {
    				$cookie = unserialize($_COOKIE['save']);
    				// Si le nom de sauvegarde existe déjà on détruit l'ancienne sauvegarde
    				foreach ($cookie as $key=>$value) {
    					if ($value['save'] === $save) unset($cookie[$key]);
    				}
    			}
    			$cookie[] = $_POST;
    			setcookie('save', serialize($cookie), time() + 3600*24*3650);
    		}
    Malheureusement, je dois récupérer le cookie en javascript ce qui m'oblige à l'encoder json plutôt que de le sérialiser et là je coince parce que la sérialisation json transforme le tableau et les sous-tableau en objets.

  6. #6
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Le mien ne fonctionne pas ? Si c'est pour supprimer le sous-tableau tu remplaces dans le if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unset($cookie[$key]['save']);
    par La ligne , pas trop compris la logique, tu acceptes tout et n'importe quoi dans ton cookie sans aucune vérification et en effet serialize pourra te poser des soucis ( https://www.owasp.org/index.php/PHP_Object_Injection ), même avec json_encode, puisque tu ne vérifies rien..

    Si tu veux forcer la transformation en tableau avec json_decode, passes lui un true comme deuxième paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    json_decode($data, true);
    Le bienfait n'est jamais perdu

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    La ligne , pas trop compris la logique, tu acceptes tout et n'importe quoi dans ton cookie sans aucune vérification et en effet serialize pourra te poser des soucis ( https://www.owasp.org/index.php/PHP_Object_Injection ), même avec json_encode, puisque tu ne vérifies rien.
    Les contrôles se font en amont.

    Si tu veux forcer la transformer en tableau avec json_decode, passes lui un true comme deuxième paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    json_decode($data, true);
    C'est cette information qui m'a servi. Je n'avais pas intégré le deuxième paramètre. Pourtant la doc est claire. Au temps pour moi. Mon problème est maintenant résolu. Merci.

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

Discussions similaires

  1. Mise en forme d'une cellule en fonction de son contenu
    Par Iloon dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 24/01/2008, 10h42
  2. redimensionnement dynamique de frame en fonction de son contenu
    Par kowal_2205 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/08/2007, 15h37
  3. Réponses: 7
    Dernier message: 08/06/2007, 08h44
  4. [HTML/CSS] Taille d'un <div> en fonction de son contenu
    Par hedgehog dans le forum Mise en page CSS
    Réponses: 12
    Dernier message: 14/12/2006, 18h57
  5. Comment redimensionner un TEdit en fonction de son contenu ?
    Par Tempotpo dans le forum Composants VCL
    Réponses: 10
    Dernier message: 25/07/2005, 21h52

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