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 :

Faire un UPDATE sur chaque $_POST


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 63
    Points : 51
    Points
    51
    Par défaut Faire un UPDATE sur chaque $_POST
    Bonsoir à tous,

    Mon problème est plus théorique que pratique, mais après des heures de recherche, je m'en remet à vous.

    J'ai la table suivante, qui contient les paramètres généraux de mon site :
    id | name | data
    1 | title | Mon titre
    2 | subtitle | Mon sous-titre
    3 | front_lang | fr_FR
    etc

    Je souhaite permettre l'édition de ces paramètres via un formulaire dans mon back-office, le voici :
    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
     
    <?php echo savePreferences(); ?>
    <form id="preferences_form" action="<?php echo HERE; ?>" method="post">
    	<fieldset>
    		<legend><?php echo SITE_PARAMS; ?></legend>
    		<label for="title"><?php echo SITE_TITLE; ?></label>
    		<input type="text" name="title" id="title" value="<?php echo getSiteParam('title'); ?>"/>
    		<label for="title"><?php echo SITE_SUBTITlE; ?></label>
    		<input type="text" name="subtitle" id="subtitle" value="<?php echo getSiteParam('subtitle'); ?>"/>
    	</fieldset>
    	<fieldset>
    		<legend><?php echo SITE_LANGUAGES_TITLE; ?></legend>
    		<label for="front_language"><?php echo SITE_FRONT_LANGUAGE; ?></label>
    		<select name="front_language" id="front_language"><?php getLanguages(getSiteParam('front_lang')); ?></select>
    		<label for="back_language"><?php echo SITE_BACK_LANGUAGE; ?></label>
    		<select name="back_language" id="back_language"><?php getLanguages(getSiteParam('back_lang')); ?></select>
    	</fieldset>
    	<input type="submit" id="submit_preferences" name="submit_preferences" value="<?php echo SAVE; ?>"/>
    </form>
    Pour votre comréhension, voici ma fonction getSiteParam :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function getSiteParam($param) {
    	global $Db;
    	$thisParam = $Db->query("SELECT data FROM "._DB_PREFIX_."params WHERE name = '".$param."'")->fetch(PDO::FETCH_OBJ);
    	return stripslashes($thisParam->data);
    }
    Quant à la fonction savePreferences(), il s'agit de ma fonction d'Update.

    Bref, venons-en au fait .
    J'ai besoin de pouvoir faire un update sur chaque champs de manière automatique (ma liste de paramètres est amenée à évoluer constamment).
    Problème, je ne sais absolument pas comment identifier chaque champ dans les conditions de ma requête.

    Voici la fameuse fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function savePreferences() {
    	global $Db;
    	if(isset($_POST['submit_preferences'])) {
    		foreach($_POST AS $k => $param) {
    			//$Db->exec("UPDATE "._DB_PREFIX_."params (name, data) VALUES ("") WHERE ;	
    		}
    	}
    }
    Voilà mon soucis. Que faire avec cette fameuse ligne commentée ?
    Merci d'avance pour votre aide, je l'espère salvatrice.
    En espérant avoir été suffisamment claire,

    Pauline.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut Pauline,

    C'est assez étrange la manière que tu as pour gérer tes vues.
    Je te l'accorde c'est pas le problème. Ton souci relève de la gestion des tables dites EAV Entité-Attribut-Valeur. Quel est le SGBDR derrière tout ça ?

  3. #3
    Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Bonjour et merci de ta réponse,

    En fait j'essaie de développer un petit CMS, j'essaie donc de rendre tout ceci le plus paramétrable possible. Je m'attendais plutôt à le remarque "je fais du a moitié orienté objet".

    Fin bref.

    J'utilise mysql avec une connexion en PDO.

    EDIT : Je précise d'ailleurs que je ne suis absolument pas dans un contexte POO, ni MVC. Juste du bon vieux procédural bien baveux. Je sais, on dirait peut être pas

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Avec MySql derrière, tu n'as pas trop le choix des armes à vrai dire.
    Vu que ce moteur est assez limité en terme de gestion de formats exotiques, deux options simples s'offrent à toi :
    - méthode standard : tu gardes ta table et tu fais autant de requêtes update que nécessaire (une par paramètre à vrai dire)
    - méthode mariolle : tu utilises un tableau de tous tes paramètres que tu serializes avant d'envoyer dans la base de données dans un champs texte. Ensuite tu déserializes ce qu tu récupères avant de le parcourir comme si de rien était.

  5. #5
    Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Méthode standard !
    Tant pis.
    J'avais pensé à faire un array comme c'est le cas dans Prestashop, j'ignore si tu connais, mais dans ce cas cela me forcerait à écrire chaque paramètre dans l'ordre non ?

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    La méthode mariolle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $params = array('nom' => 'abc', 'option.a' => 'a');
    $serialized = base64_encode(serialize($params));
    $sql = "UPDATE t_table SET params = '$serialized' WHERE id = 1";
     
    // puis
    $sql = "SELECT params FROM t_table WHERE id = 1";
    $data = mysql_query(...);
    $params = unserialize(base64_decode($data));
    EDIT: tu ne fais pas sur $data le base64_decode($data) c'est juste pour l'exemple. Tu récupère d'abord le résultat de mysql_query() que tu passes au décodage.

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Pauloscorps Voir le message
    Méthode standard !
    Tant pis.
    J'avais pensé à faire un array comme c'est le cas dans Prestashop, j'ignore si tu connais, mais dans ce cas cela me forcerait à écrire chaque paramètre dans l'ordre non ?
    Si tu veux tu peux aussi t'orienter vers un autre moteur qui gère ceci les doigts dans le nez : PostgreSQL.
    Ecrire des paramètres dans un ordre ??? C'est un tableau, tu le remplis dans l'ordre que tu veux, non ?

  8. #8
    Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Merci pour ta méthode mariolle. Je vais me pencher dessus pour essayer d'y comprendre quelque chose.

    Sinon, je viens de penser à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function savePreferences() {
    	global $Db;
    	if(isset($_POST['submit_preferences'])) {
    		$count = 1;
    		foreach($_POST AS $k => $param) {
    			$Db->exec("UPDATE "._DB_PREFIX_."params SET data = '".$_POST[$k]."' WHERE id = '".$count."'");	
    			$count++;				
    		}
    	}
    }
    Mais :
    1 - Si le mec s'amuse à aller changer l'ordre des champs, c'est foutu.
    2 - Il faudrait exclure le $_POST de mon bouton submit.

    Tu verrais une manière d'arranger ca ?

  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Non, tu ne dois pas procéder ainsi.
    Tes options ne doivent pas être uniquement identifiées par un id autonum mais par un mot clé unique.
    L'id autonum pointe vers un enregistrement et c'est tout, il n'a aucune autre valeur à laquelle tu peux te fier.
    Ensuite, je pense que la liste des options est limitée et de ce fait tu peux très bien contrôler le options qui sont présentée à travers $_POST.
    Tu peux faire un array_intersect_...() entre un tableau d'options modèles et le $_POST.
    Bref, tu dois sécuriser à mort cet aspect et là je ne pas l'impression que tu t'en sois beaucoup préoccupé.

  10. #10
    Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Bref, tu dois sécuriser à mort cet aspect et là je ne pas l'impression que tu t'en sois beaucoup préoccupé.
    Non en effet, pour l'instant je réfléchis seulement à la manière dont je peux faire ceci. Et quand, on réfléchis, on passe souvent par l'improbable .

    Sinon, en effet, mon mot clé est bien unique. Mais le problème est toujours le même, je n'ai aucun moyen de me faire passer ce mot clé dans mon formulaire. Je ne vais quand même pas y aller à coup d'explode...

  11. #11
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par Pauloscorps Voir le message
    Sinon, en effet, mon mot clé est bien unique. Mais le problème est toujours le même, je n'ai aucun moyen de me faire passer ce mot clé dans mon formulaire. Je ne vais quand même pas y aller à coup d'explode...
    Si tu veux rire, dis le moi tout de suite...
    Et quand dans ton formulaire tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getSiteParam('back_lang')
    Tu n'aurais comme une vague impression, arrêtes-moi si je me trompe, d'avoir accès à ton mot-clé ?

  12. #12
    Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Cette fonction me retourne la valeur, pas le mot clé. Donc là comme je ne vois pas, après il est tard alors peut être que ?

  13. #13
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    'back_lang' n'est pas ton mot clé ?

  14. #14
    Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Hum si, mais dans la mesure où je le défini manuellement... Désolée mais là je ne vois pas.

  15. #15
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Voici ce que tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <select name="back_language" id="back_language"><?php getLanguages(getSiteParam('back_lang')); ?></select>
    Tu perds ton mot-clé. Remplaces back_language par back_lang et tu conserveras ainsi ton mot clé.
    Ensuite à la réception des données, tu devrais avoir une liste des mots clés acceptés et tu recoupes ton $_POST

  16. #16
    Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 63
    Points : 51
    Points
    51
    Par défaut
    Ah ! J'avais pensé à le faire en Javascript, mais effectivement la liste de mots clés est une super solution. Merci !

Discussions similaires

  1. [MS SQL]faire un UPDATE sur plusieurs tables en meme temps
    Par touille dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/07/2007, 09h45
  2. Réponses: 1
    Dernier message: 08/06/2007, 12h11
  3. [VB6] Comment faire un update sur des textbox qui sont créés
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 27
    Dernier message: 16/02/2006, 14h52
  4. critere de selection pr faire un UPDATE sur 1 table
    Par maxizoo dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/01/2006, 15h35
  5. [Debutant] faire un update sur tout une table
    Par Karibou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 14h44

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