8791 sujets

Développement web côté serveur, CMS

Bonjour,

C'est un problème que j'ai déjà eu, mais résolu plus par "bidouille" mais dans le cadre professionnel je ne préférerais pas passer par là.

J'ai un formulaire de création/modification dans une page.

j'arrive dans cette page en passant 2 paramètres principaux via $_GET :
Action et id

en fonction du parametre "action" je récupére ou non les informations en base et les ajoutes dans le formulaire.

Nota: mon formulaire rappel la même page (celle en cours)

lors du clic sur valider la page se rappel et j'ai un test sur le $_POST sur la variable name du bouton valider. (juste avant la partie qui regarde mes $_GET)

si celui-ci existe alors j'appel ma fonction "maj".

Mon problème est le suivant :

- Comment je peux distinguer si mon formulaire était en création ou modification (ajout de champs hidden dans le formulaire ? question de sécurité) ou je m'appui sur les paramètres passé via le $_GET ?

Dans les 2 cas, si j'arrive à savoir si je vais ajouter ou mettre à jour en base, le réaffichage du formulaire suite à l'ajout dois de retrouver en "modification" ce qui implique la réécriture de l'url pour le $_GET non ? (action = modification et id = last_insert_id)

sinon mon formulaire au clic suivant va recréer un nouvel enregistrement.

Bonus : suite à la création/mise à jour, je voudrais indiqué à l'utilisateur dans le formulaire.

Comment faites vous habituellement ? (sans passer par x pages, un formulaire de modif et de création ...)

Merci.
Modérateur
Bonjour,

Pour te rendre à ton formulaire en mode modification, tu passes les paramètres dans l'url. Alors il suffit d'en faire autant avec l'attribut action du form. Tu repasses tout simplement les paramètres dans l'url (en GET) :
<form action="formulaire.php?Action=Modification&amp;ID=40"

Que tu passes en GET ou en POST via des champs hidden, il faut savoir que ça ne change rien au point de vue de la sécurité. Un utilisateur peut modifier autant les variables en GET et en POST peu importe que les champs soient input hidden, en select, en checkbox, en bouton radio, avec l'attribut disabled, avec un maxlength, qu'ils soient vérifiés par Javascript ou non, etc. La règle d'or est de ne jamais faire confiance à ce qui vient de l'utilisateur : GET, POST, COOKIE, etc...

Une fois l'action effectuée et selon celle-ci, il suffit de faire une redirection vers le formulaire avec les bons paramètres.
Modifié par Tony Monast (29 Nov 2011 - 16:21)
Merci de me répondre aussi vite.

Une petite explication en plus, j'ai omis de préciser un point qui ne me semblait pas important, mais à la vue de la réponse, je pense que celle-ci sera utile.

Je viens dans ce formulaire suite au clic dans un tableau (colonne "Edit") d'ou mon passage de paramètre en $_GET (j'en ai d'ailleurs d'autres dans l'url) :
- p (code de page demander, pas en brut avec contrôle de présence dans un array du code)
- m (module/sous module de la page pour les pages "poupée russe", mon cas ici operation->batiment->logement)
- action
- id

Donc justement, si je viens dans ma page avec l'url suivante :
index.php?p=gestionProg&m=prog&action=c
Donc en mode création

mon form action va reprendre l'url
Je fais la saisie dans le formulaire et valider

je vais dans mon code de mise à jour de la base du fait du post, je passe dans mon code de création (car je trouve action=c)

et je dois faire une redirection en modifiant les paramètres , le plus dur :
donc un header avec l'url en cours mais en remplaçant la valeur de mon action en "e" et en ajouter le paramètre id= mon last_insert_id.

(donc pas de bonus pour indiquer que l'enregistrement à été ajouter)
salut...

la politique du développeur PHP d'une manière générale a toujours été de faire un maximum de chose sans changer de page.

Au final aujourd'hui, et le monde pro sera d'accord avec moi, puisque c'est ce que les "grands" utilisent, il est plus simple de faire des pages différentes selon les actions. Tout en gardant à l'esprit que des blocks réutilisables sont mieux en include ou en fonction que copier/coller dans x pages...

Dans ton cas je verrais bien un découpage de ce genre qui te facilitera les choses...

une page formulaire.php (prête avec les variables de retour pour affichage, mais vierge pour la création)

les pages d'insertion sql appelées par tes différentes actions.

une page creation.php qui va inclure fomulaire.php
une page modification.php qui va elle aussi inclure formulaire.php

Ce genre de découpage peut paraître fastidieux mais une fois bien pensé et bien rodé ça facilite le travail, et évite aussi le refresh sauvage qui réinsère les données dans la base Smiley cligne

Je te laisse y réfléchir...

Ca ne fera pas de charge supplémentaire sur ton serveur non plus...
Je complète par un autre message, l'avantage de ce découpage est que tu ne modifie qu'un seul formulaire pour tout les endroits où il est utilisé etc etc
Pour les messages "mise à jour faites" ou des phrases du genre, personnellement je passe par les sessions. Après l'insert, si tout se passe bien, j'ai mon $_SESSION['var'] = 'fait'; (et si session = fait, je met tel ou tel phrase).

Et pour savoir si c'est une modif ou un ajout, je me base effectivement sur la présence de l'id ou non. Forcement, si il n'y a pas d'id, on ne peut rien modifier ... donc on ajoute

Après, il y a une question de droit, un visiteur lambda ne pourra que proposer sans avoir certain champ (notamment celui de validation, logique), et n'aura pas accès à la modification de quoique ce soit. Il suffit de verif qu'il y a l'id et que le visiteur a les droits pour voir si il peut ou non modifier un élément.

Si toutefois tu as un doute sur ta programmation, mets-toi dans les divers situation (visiteur/membre/admin), tu mets sur un bloc note les urls des adresses pour modifier/ajouter/supprimer un élément, et tu verif que tu as bien les accès ou que tu es bien refusé si tu n'es pas sensé pouvoir les modifier.
pchlj a écrit :

Au final aujourd'hui, et le monde pro sera d'accord avec moi, puisque c'est ce que les &quot;grands&quot; utilisent, il est plus simple de faire des pages différentes selon les actions. Tout en gardant à l'esprit que des blocks réutilisables sont mieux en include ou en fonction que copier/coller dans x pages...

Dans ton cas je verrais bien un découpage de ce genre qui te facilitera les choses...

une page formulaire.php (prête avec les variables de retour pour affichage, mais vierge pour la création)

les pages d'insertion sql appelées par tes différentes actions.

une page creation.php qui va inclure fomulaire.php
une page modification.php qui va elle aussi inclure formulaire.php

Ce genre de découpage peut paraître fastidieux mais une fois bien pensé et bien rodé ça facilite le travail, et évite aussi le refresh sauvage qui réinsère les données dans la base Smiley cligne

Je te laisse y réfléchir...

Ca ne fera pas de charge supplémentaire sur ton serveur non plus...


Euh t'es sûr de toi là ?

La tendance depuis un peu plus de 5 ans est d'utiliser le modèle MVC. Les pages comme tu dis n'existent plus physiquement (un fichier par page), à la place on utilise, généralement, des contrôleurs et des actions sous forme de classes.

De quels "grands" tu parles ?
J'allais poser la même question, personnellement cette méthode je l'ai testé et je suis revenu en arrière, c'est une perte de temps énorme. C'est beau et tout quand tu commences, mais rapidement, sur un projet un minimum important, ça devient ingérable.
@jb_gfx

Les grands dont je parle on des choses comme 600 000 membres et font du e-commerce à outrance sur beaucoup de sites différents...

Pour info il y a 5 ans le DT et moi même travaillons énormément en JS/ajax.. (oui la cible visée n'est pas craintive devant les fonctionnalités avancées du web), et à l'époque tout le monde nous disait "vous êtes tarés c'est pas l'avenir du web"... aujourd'hui le Jquery et autre frameworks du même genre sont légions sur nombre de site...

Alors oui je me souvient du tout en une page... mais ça fait un an qu'on travaille dans la méthode de plusieurs pages...

Bon ma démonstration n'est peut être pas très claire... mais pourtant c'est cette méthode qui est utilisée et qui est pour ma part je trouve la plus pratique.

(on va ouvrir la discussion)

J'avais fait il y a assez longtemps (8/9 ans) un forum... bah oui c'est basique comme réalisation Smiley smile et je tenais tout ça dans 5 pages !!! (la galère pour le débuggage)
Je ne referai jamais ça... laisse le projet de côté, reviens 1 ans après... tu passes plus de temps à redécoder tes pages pour comprendre ce que tu avais fait...

par la méthode multipage en include ou fonction, ok ça multiplie les fichiers mais comme chaque fichier a une utilité bien précise tu t'y retrouve très vite...

voilà...
@kénor

Le site principal dont je parle, retourne qq chose comme 300 pages de contenus, des forums, des chats, des formulaires etc etc... et représente dans les 15000 visiteurs uniques jours...

travaille avec cette méthode, que j'ai peut être mal retranscrit ici, c'est possible...

et franchement rien d'ingérable Smiley smile
pchlj a écrit :

par la méthode multipage en include ou fonction, ok ça multiplie les fichiers mais comme chaque fichier a une utilité bien précise tu t'y retrouve très vite...


En MVC tes "pages" sont aussi réparties dans différents fichiers avec une organisation stricte. C'était pas ma remarque, je disait simplement qu'on n'a plus de notions de pages dans le sens une page = un fichier (php ou cfm ou ce que tu veux). Et toutes la partie organisation des pages, inclusions de fichiers, réécriture d'URL, n'a plus besoin d'être gérée par le développeur car elle est automatique.
Modérateur
conan76, je n'ai pas vraiment compris ton explication supplémentaire. Est-ce que tu utilises le même fichier pour afficher la liste des éléments, pour créer, modifier et supprimer?

pchlj a écrit :

salut...
Ce genre de découpage peut paraître fastidieux mais une fois bien pensé et bien rodé ça facilite le travail, et évite aussi le refresh sauvage qui réinsère les données dans la base


À noter qu'une simple redirection après l'insertion ou la modification suffit, même si c'est une redirection vers la page en cours.

Il y a quelques années, j'avais toujours deux fichiers pour chaque module : index.cfm pour la liste des enregistrements et details.cfm pour insérer, modifier ou supprimer un enregistrement.

Maintenant, je préfère de loin avoir 4 fichiers différents pour chaque action : liste, insérer, modifier et supprimer. Bien que certaines parties du code soient centralisées, certaines sont répétées. Le code est beaucoup plus lisible par la suite. Il n'y a pas un paquet de conditions pour déterminer dans quel mode on se trouve, ce qui doit apparaître ou non, ce qui doit être contrôlé ou non, etc. Depuis que je procède comme ça, c'est un vrai charme à gérer. Ce n'est pas en MVC, mais ça fonctionne très bien quand même et la maintenance est très légère.

Je m'intéresse tout de même beaucoup au MVC, mais ce n'est pas quelque chose qu'on intègre du jour au lendemain. En tout cas, pas si on veut le faire dans les règles de l'art. Ce n'est pas non plus tous les projets qui ont besoin d'une telle structure, je me trompe?
Modifié par Tony Monast (29 Nov 2011 - 17:34)
Shame on me Smiley decu

Je ne connaissais pas MVC... et j'avais pris ça pour un moteur de templates....

Le modèle de MVC est proche de ce dont je parle... toutefois ce n'est pas ce qui est utilisé Smiley smile

Mais sur le fond on est dans la même logique de séparation des éléments...

TOUTES MES PLATES EXCUSES.......

Sinon ça confirme ce que je disais il faut éviter de tout mettre dans la même page... (bibliothèque, fichier ou autre) il y a du bon à scinder les choses...

ps : je ne parlais pas non plus dans le sens une page = un fichier.
Tony Monast a écrit :
conan76, je n'ai pas vraiment compris ton explication supplémentaire. Est-ce que tu utilises le même fichier pour afficher la liste des éléments, pour créer, modifier et supprimer?



À noter qu'une simple redirection après l'insertion ou la modification suffit, même si c'est une redirection vers la page en cours.

Il y a quelques années, j'avais toujours deux fichiers pour chaque module : index.cfm pour la liste des enregistrements et details.cfm pour insérer, modifier ou supprimer un enregistrement.

Maintenant, je préfère de loin avoir 4 fichiers différents pour chaque action : liste, insérer, modifier et supprimer. Bien que certaines parties du code soient centralisées, certaines sont répétées. Le code est beaucoup plus lisible par la suite. Il n'y a pas un paquet de conditions pour déterminer dans quel mode on se trouve, ce qui doit apparaître ou non, ce qui doit être contrôlé ou non, etc. Depuis que je procède comme ça, c'est un vrai charme à gérer.


J'explique rapidement avant de partir Smiley lol

Je suis dans le module admin, j'ai une page "index", pour le moment avec un test d'authentification toujours à True Smiley cligne
j'inclus un menu.
le menu afficher me donne des url avec le paramètre $_GET "p"
en fonction de "p" je fais un include de la page concerné (include $pagesAdm[$_GET['p']];)

Dans la page concernée actuellement, celle-ci est composé de sous partie (on créer/edite une operation, celle-ci peut contenir des batiments à créer/editer qui peut contenir des logement à créer/editer) d'ou mon paramètre "m"

La page va s'afficher sous forme de tableau pour les operations (avec une colonne éditer)
un lien "ajouter"
pour ce niveau général c'est fini.
pour le niveau suivant (1) , on voit le formulaire pour créer/editer l'operation (en 2 parties) donc 2 form l'un php, l'autre géré en javascript cf une question dans la question "javascript" du forum (normalement résolue, mais je l'indiquerais si sont intégration général est Ok). Ce second formulaire n'est présent que si l'operation existe (nécessité d'avoir l'id pour créer le nom des images)
également, une 3ème partie s'affiche pour lister dans un tableau les batiments de l'operation avec le même principe (tableau et colonne editer).
Idem pour le niveau suivant pour les logements.

Cela fais quelques années que je suis passé sur l'asp.net (professionnellement) et je n'ai pas eu l'occasion de me replonger dans le PHP et comme je connais le langage, c'est à moi que le travail a été confié (avec les mêmes échéances qu'en Asp.net). Ce genre de chose m'aurais pris une matinée en asp.net, les méthodologie étant différente rien que la construction des pages.

Bref, donc si mon $_GET['m'] n'est pas défini, je liste le plus haut niveau (la liste des operations) sinon j'inclus la page qui gére les operations (si m="op"), si m="bat" ... etc

J'en suis donc sur la page "operation" en création/modification.

exemple de composition de mon fichier "operation"


if (isset($_POST['frm_prog']))
{
	include ('lib/majdb.inc.php');
	majProg();	
}

if (isset($_GET['act']) && isset($_GET['id']))
{
	if ( $_GET['act']=='e' &&  is_numeric($_GET['id']) && $_GET['id']>0 )
	{
		// --- Edition de l'operation
		$oDB = //Cnx Base;
		$req = //Requete;
		$oDB -> query($req);
		$oDB -> close ();
		// Si on a une ligne on prends les données
		if ($oDB -> num_rows($req)>0)
		{
			$res = $oDB -> fetch_assoc ();
			$idOperation = $_GET['id'];
			$strProgramme = $res['strProgramme'];
			$strCommune = $res['strCommune'];
			$ysnPreco = $res['ysnPreco'];
			$ysnActif = $res['ysnActif'];
		}
		{
			echo 'OPERATION NON TROUVEE';
		}
		// TODO : Si pas de ligne : erreur
		
		
		// --------------------------
	}
}



Ensuite j'ai mon formulaire

ma fonction de mise à jour base du dessus : (include ('lib/majdb.inc.php');)



function majProg()
{

	// Detection si Creation ou mise à jour
	$action = 'c';
	$idOperation=-1;
	
	if (isset($_GET['act']) && isset($_GET['id']))
	{
		$action = $_GET['act'];
		if ( $_GET['act']=='e' &&  is_numeric($_GET['id']) && $_GET['id']>0 )
		{
			$idOperation = $_GET['id'];			
		}
	}

	$strCommune=null;
	$strProgramme=null;
	$ysnPreco=false;
	$ysnActif=false;

	if (isset($_POST['strCommune']))
	{
		$strCommune = sprintf("%s",$_POST['strCommune']);		
		$strCommune = trim($strCommune);
		$strCommune = htmlentities($strCommune);		
	}
	
	if (isset($_POST['strProgramme']))
	{
		$strProgramme = sprintf("%s",$_POST['strProgramme']);		
		$strProgramme = trim($strProgramme);
		$strProgramme = htmlentities($strProgramme);		
	}
	
	if (isset($_POST['ysnPreco']))
		$ysnPreco=true;
	if (isset($_POST['ysnActif']))
		$ysnActif=true;

	// Creation ou mise à jour en base
	
	// Création
	
	$dbOptions = array('ERROR_DISPLAY' => true);
	$oDB = // Cnx
	
	$strCommune = mysql_real_escape_string($strCommune);
	$strProgramme = mysql_real_escape_string($strProgramme);
	
	echo 'ACTION :'.$action;
	switch ($action)
	{
		// CREATION
		case 'c': 
			//$req = //Req insert ;
	
			echo 'CREATION';
	
			//$oDB -> query($req);
			//$id = $oDB -> insert_id();
			$oDB -> close ();
			
			$id=14; // TEMP
			
			$currentUrl = curPageURL();
			$url = addParamGET($currentUrl,'act','e');
			$url = addParamGET($url,'id',$id);
			
			header('location:'.$url);
		break;
		// MAJ
		case 'e': 
			echo 'MAJ';
			//$oDB -> query($req);
			$oDB -> close ();
		break;
	}
	



Je faisait du Php lorsque la techniques des includes a été mis en place (début des grands sites tutoriaux php)
@tony...

Je suis d'accord avec toi pour MVC.

Mais oserais je dire que comme à une époque on utilisais beaucoup les moteurs de templates aujourd'hui on tend vers autre chose...

Ce que j'ai vu de MVC est qu'il fait ce que moi et ceux qui bossent avec moi nous faisons tout les jours sans rien d'autre que notre cerveau et une logique de travail.

Est ce vraiment un avenir ou simplement une tendance ???

Je vois que tu utilise CFM Smiley smile j'utilise depuis toujours ultraedit... bloc note amélioré Smiley smile Là aussi c'est une question de mode ou de méthode de travail...
J'ai plus de visiteurs et plus de pages sur mon site principal (et bcp plus si je cumule tout), et je t'assure que la page ajout/modif/suppr est d'une simplicité enfantine à reprendre.

Maintenant c'est sûr que je fais appel à bcp de class à côté pour que le code soit ultra simple. Pour te dire, ma copine qui ne sait pas codé sait "programmer" cette page ... (j'étais sur le *** d'ailleurs, juste en me regardant).

Je fais en TRES gros à quoi ça ressemble :

<?php
require

$form = new Lib_Form;

if ($form->modif()) // automatique, verif les droits et l'id
{
  // requete SQL
  
  $form->defaut($array_resultat); // resultat de la requete (en tableau) traité et renvoyé vers le formulaire par la suite pour affichage des données à modifier
}

$form
  ->action('url')
  ->button('envoyer')
  ->submitAjax() // je soumet le formulaire en AJAX
  ; 

// ici formulaire
// le code ressemble à ça :
$form
  ->name('titre')
  ->label('Entrer le titre')
  ->input() // champ text classique, 
               // j'ai une 20 aine d'élément, tel date/bbcode/select/multiselect/upload etc. etc.
  ->isRequired() // champ obligatoire
  // idem pas mal de possibilité de vérification (verif JS + verif PHP auto, y compris Regex si j'ai pas une vérif pré-écrite)
  ;

etc. pour les autres champs

if ($form->verif()) // verif tout automatiquement
{
  $array // contiendra les données à insérer avec verif une seconde fois
  
  if ($form->aInserer()) // verif via la class si on insert ou modif
    // mon insert
    $db->insert('table', $array);
  elseif ($form->aModifier()) // ici on modifie
    $db->update('table',$array, 'WHERE id = $form->getId()');

  // ici ça dépend du cas (ajax ou simple redirection)
  // dans les 2 cas, c'est une méthode sans paramètre qui s'occupe de tout
}
else
{
  $form->get() // retourne le formulaire (là c'est selon, soit je retourne directe, soit via un template selon les cas)
}


et c'est tout ...
Le tout est d'ailleurs générer via des clips automatiques (PSPad permet des choses magiques de ce côté là Smiley cligne ), donc un formulaire me prend généralement moins de 5 minutes une fois que tout est sur papier et la table créé.

A savoir que tout ce qui est erreur est géré avec ce qu'on voit au dessus, message d'erreur compris (même si je peux les personnaliser).

Les formulaires c'est pour moi quelque chose de vraiment rébarbatif, donc j'ai "sur-automatisé" sa création, même si j'ai la possibilité d'être plus souple si nécessaire (par exemple un template personnalisé, si je veux un affichage spécial du formulaire).

Et pour le forum (qui n'est pas si "basique" que ça, si on prend en compte toutes les petites options à faire) là je suis passé à du MVC 100% parce que je m'en sers pour relier les parties du site avec le forum, et donc là, je fais $forum->post() et c'est tout Smiley cligne
Tony Monast a écrit :

Je m'intéresse tout de même beaucoup au MVC, mais ce n'est pas quelque chose qu'on intègre du jour au lendemain. En tout cas, pas si on veut le faire dans les règles de l'art.


Tu peux utiliser du MVC très simplement pour de petits projets, il y a des framework super légers de quelques dizaines de ko, qui font le minimum mais permettent d'utiliser ce motif. Tu peux aussi coder le tiens en faisant le minimum et en le faisant évoluer par la suite, c'est bien quand tu veux avoir un contrôle total sur ton architecture, et/ou pour apprendre. Ou alors tu peux utiliser un gros framework robuste comme Symfony mais là la phase d'apprentissage est plus longue.

Tony Monast a écrit :

Ce n'est pas non plus tous les projets qui ont besoin d'une telle structure, je me trompe?


Non c'est sûr, mais ça fonctionne quand même aussi bien sur des petits projets alors qu'en on en a pris l'habitude pourquoi ne pas l'utiliser partout ?
Modérateur
pchlj a écrit :
@tony...
Est ce vraiment un avenir ou simplement une tendance ???


Difficile à dire. Je sais que ça l'existe depuis de nombreuses années, mais il me semble que je n'en ai jamais entendu autant parlé que ces deux dernières années. Problablement que l'évolution des technologies, la taille des équipes, le changement des méthodes de travail et la plus grande complexité des applications Web en sont pour quelque chose.

Je crois que MVC est une belle structure qui mérite sa popularité, mais un projet qui n'est pas réalisé en MVC n'est pas pour autant de moins bonne qualité. Smiley cligne On peut réaliser des trucs très mauvais en MVC, et l'inverse est aussi vrai.

pchlj a écrit :

Je vois que tu utilise CFM Smiley smile j'utilise depuis toujours ultraedit... bloc note amélioré Smiley smile Là aussi c'est une question de mode ou de méthode de travail...


Effectivement, je suis plutôt anticonformiste, et pas seulement concernant certaines technologies du Web. Je dois être un des rares ici qui n'a pas succombé à la popularité de PHP. Je ne jure pas que par l'open-source non plus.
Modifié par Tony Monast (29 Nov 2011 - 18:04)