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

PHP & Base de données Discussion :

Formulaire, PHP, MySQL, MVC


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut Formulaire, PHP, MySQL, MVC
    Bonjour à tous les développeurs présent ici aujourd'hui, et tout d'abord merci à vous de prendre du temps pour aider le pauvre nul que je suis...

    dans l'objet de mon examen (je repasse mon BTS cette année), je suis sensé créer une application web pouvant gérer les stages d'étudiants.

    L'application à 3 pages, Une pour les coordonnées (Consultation et modification), une pour les entreprises, (Simple recherche), et une pour les stages, (insertion et recherche de stage)

    J'ai adopté une solution MVC.



    Mon principal problème (et je vais sûrement en avoir d'autres) pour le moment est pour la modification des coordonnées.

    J'arrive à afficher les coordonnées,mais pas à les modifier. pour les modifier j'ai choisi un formulaire avec méthode post.

    La vue juste ici
    Code html : 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
    <form method="post" action="" >
    	<table>
    		<tr>
    			<td>Nom :</td>
    			<td><input id="nom" type="text" value="" name="NOM"></td>
    		</tr>
    		<tr>
    			<td>Prénom :</td>
    			<td><input id="prenom" type="text" value="" name="PRENOM"></td>
    		</tr>
    		<tr>
    			<td>Téléphone :</td>
    			<td><input id="tel" type="text" value="" name="NUM_TEL"></td>
    		</tr>
    		<tr>
    			<td>Adresse e-mail :</td>
    			<td><input id="email" type="text" value="" name="ADRESSE_MAIL"></td>
    		</tr>
    	</table>
    	<input class="submit" type="submit" value="Modifier">
    </form>


    la partie model:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function envoyerCoordonnees($connexion, $login){
    	if (isset($_POST['NOM']) && isset($_POST['PRENOM']) && isset ($_POST['NUM_TEL'] ) && isset ($_POST['ADRESSE_MAIL'])){
    		$_POST['NOM']=$nomenvoiCoor;
    		$_POST['PRENOM']=$prenomenvoiCoor;
    		$_POST['NUM_TEL']=$numenvoiCoor;
    		$_POST['ADRESSE_MAIL']=$mailenvoiCoor;
    	}
    	$connexion = mysql_connect('localhost', 'root', 'root');
    	mysql_select_db('GestionStage', $connexion) or die("Impossible d'ouvrir la base");
    	$login = "$_SESSION[login]";
    	$sql= "UPDATE PERSONNE SET NOM ='$nomenvoiCoor', PRENOM = '$prenomenvoiCoor', NUM_TEL='$numenvoiCoor',ADRESSE_MAIL='$mailenvoiCoor WHERE NOM='$login'";}

    la partie controleur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    envoyerCoordonnees($connexion, $login);

    Tout d'abord, ma requête fonctionne (du moins sans les paramètres PHP) Mais je suis bloqué. quelle cible devrait-je ajouter à mon formulaire? Je bloque sur le traitement des données. Une fois que la modification fonctionne, j'aimerai pouvoir revenir sur cette page contact, et que les données s'actualise direct, (sachant que j'ai déjà la fonction d'affichage, un simple actualiser ferait l'affaire, mais j'ai tout oublié..)

    Je bloque vraiment sur la partie contrôleur, ou je sais que je devrais mettre beaucoup plus mais impossible de trouver ..

    Voilà je pense que c'est tout pour le moment.. Merci encore vraiment, merci d'avance pour votre aide, vous sauveriez un petit étudiant qui aimerai s'en sortir.. !!

  2. #2
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut
    Je pense que tu as un problème de méthode. Tes pages peuvent être résumées en une seule, qui fait appel, en fonction de paramètres (voir $_REQUEST), à différentes classes qui permettent de faire ce que veut l'utilisateur.

    Une seule page à cette avantage que tu n'as pas de "retour" à faire : tu affiches le résultat de ta requête et éventuellement un autre formulaire.

    Tu as aussi la possibilité de mettre dans une variable, ce qui est pratique pour la "réutilisation" d'un formulaire. Voici un exemple dont tu peux t'inspirer :

    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
     
    $MonFormulaire = function ($Var1='',$Var2='') {
    return ' 
    <form action="./" method="post"> 
    <input type="text" name="var1" value="'.$Var1.'" /> 
    <input type="text" name="var2" value="'.$Var2.'" /> 
    <input type="submit" value="Envoyer" /> 
    </form> 
    ';
    }; 
     
    //formulaire rempli avec, par exemple, le contenu de ta bdd 
    echo $MonFormulaire('test','coucou'); 
     
    // formulaire vierge 
    echo $MonFormulaire();
    Enfin n'oublie pas jeune padawan, que tu NE PEUX PAS contrôler ta page avec PHP : tu la génères, tu l'envoies, pas plus. Pour "actualiser" la page envoyée, il faut passer forcément par un langage client (JS pour ne pas le nommer). Le php ne peut pas "actualisé" une page envoyée (je vais vite, car avec les headers, il est en réalité possible de faire des choses plus avancées, mais passons).

    Voilà ! J'espère t'avoir un peu aidé, bon courage,

    Merde pour ton BTS,

    Julien.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut Merci pour la réponse !
    Bonsoir Nothus. Tout d'abord merci de ton attention et de ta réponse, ça fait plaisir à voir que des gens se dévouent à aider leur prochains!

    ceci dit, j'ai commis une faute en disant que j'ai choisi le modèle MVC. Il m'est imposé (dans les compétences du BTS). Je suis donc plus ou moins obligé de passer par un modèle, un contrôleur et une vue. (Je ne peux pas faire du tout-en-un même si ça m'aiderait bien !! )

    Pour l'actualisation, Je pense en fait que ça ne sois pas nécessaire, puis que j'ai remarqué que peu importe quand j’envoie mes données (enfin même pour de faux) Je reviens toujours sur ma pages des coordonnées. Il me suffirait donc que l'envoi de ces variables dans la base de données marche pour les afficher.

    Merci des conseils en tout cas, fort utile et précieux, je vais jeter un oeil sur la $_REQUEST ça m'à l'air sympa.

  4. #4
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut
    Je comprends. Alors regarde aussi du côté de Require / Include, qui te permet - en somme - de faire appel à du contenu partagé.

    Exemple :

    Sur le fichier 1, j'ai la classe ou fonction "truc". Sur le fichier 2, j'ai besoin de truc. Du coup je faire include("./fichier 1"); et j'accède à tout ce qu'il y a dans fichier 1 dans fichier 2.

    Cela te permettra de ne pas multiplier, par exemple, le même code pour ta connexion à la base de données.

    Cela te permet aussi de garder des pages indépendantes (MVC oblige), mais avec un "tronc" commun, pour gérer les types de données.

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    Tout à fait, j'ai plusieurs include : celui du modèle dans celui du contrôleur, et celui du contrôleur dans celui de la vue. tout est indépendant en soit le truc est assez bien établi.

    Code ctrlCoordonnees.inc.php : Sélectionner tout - Visualiser dans une fenêtre à part
    include_once("./modele/modele.inc.php");

    Code vuecoordonnees.inc.php : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php include ctrlCoordonnees.inc.php; ?>


    Sauf que je ne sais comment rediriger ma requête pour que tout se fasse d'un seul coup de baguette. concrètement, il me manque la cible du formulaire. Mais je ne peux pas mettre le contrôleur comme cible, de toute façon ça m'afficherais une page blanche. dans l'idéal, faudrait que je puisse rester sur la même page tout en envoyant ces données.

    Je parait bête mais peut être que poser la question un peu différemment peut aider à me faire comprendre.. (Ah ces langages..)

  6. #6
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut
    Hum, mais alors cible la page d'envoi comme réceptionneur :

    - en bidouillant du côté de $_SERVER["REQUEST_URI"];

    - ou simplement comme celui : <form action="" method="POST"> (laisser le champ "action" vide fait renvoyer le formulaire sur la même page).

    Je comprends pas très bien pourquoi une page devrait forcément te renvoyer aucun élément ? Tu peux m'expliquer plus en détails ?

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    en laissant le champs action vide, c'est comme si il ne se passais rien n'est-ce pas?

    Parce que le problème là dans le cas précis, c'est que je ne peux pas rebalancer l'action sur mon contrôleur? genre action="ctrlCoordonnees.inc.php" ? Certes ça pourrait peut être placer les données dans la requête, mais dans ce cas il faudrait une redirection à la vue ensuite.

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    J'up le message, en laissant l'action vide, les données que j'entre pour tenter de modifier les coordonnées disparaisse, et ne sont pas non plus envoyés dans la requête pour modifier ces coordonnées

    http://www.malgouyres.org/cours/prog...Web-node7.html

    http://fr.wikibooks.org/wiki/Program...P/Exemples/MVC

    Je crois que les deux exemples ici m'ont l'air très bien. Mais ils sont beaucoup trop compliqué pour moi et je me perd vite sous les lignes de codes à ne plus en finir.

  9. #9
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut
    Je t'avoue ne pas suivre exactement ni où est ton problème, ni où tu souhaites aller... c'est probablement ma faute. -_-

    Dans l'attente, voici quelques éléments qui bordent le sujet :

    - "ACTION" dans un formulaire, c'est l'URL (ou URN, ou l'URI suivant si tu travailles en absolu ou non). Le laisser vide, cela revient à renvoyer à la page d'où provient le formulaire (je ne crois pas que ça soit une spécification technique, juste par usage dans les navigateurs). Ce n'est pas conseillé de le laisser vide, mais c'est possible.

    - Un formulaire n'est qu'un dispositif permettant d'insérer de manière plus graphique des données vers un serveur, avec une possibilité de contrôle avant l'envoi. Dans tous les cas, on vérifie toujours les valeurs envoyés depuis le script qui exécute la commande traitant le formulaire.

    - Tu es dans un environnement WEB et pas EN LIGNE DE COMMANDE. Un simple "true" fait court pour l'usager. Il faut toujours afficher, par soucis d'ergonomie, quelque chose qui puisse être appréhendé par l'utilisateur.

    - Ce que l'on appelle "page", c'est la rassemblement des données émises par un ou plusieurs serveurs dans un navigateur pour créer une représentation. Une "page" internet, ce n'est ni plus ni moins que du texte qui est "traduit" dans des formes affichables à l'écran. Aussi, une "page" peut être générée par plusieurs scripts différents dans un même contexte (PHP, CGI : PERL/PYTHON, etc.) sur le serveur, puis sur le client (JS, FLASH, SVG, etc.). Lorsque tout est envoyé d'un bloc, c'est synchrone. Lorsque tu as plusieurs appels (méthode AJAX), c'est asynchrone. De plus en plus, la page est un "socle" (exemple : Facebook, Twitter, etc.) qui met à jour en permanence par elle-même les données qu'elle contient.

    - Bref, il faut comprendre que ton problème provient que tu appliques pas la méthode dans l'environnement où tu es. Avec des "include/require", tu sais faire cohabiter (et normalement sérialiser) des blocs de fonctions ou de programmes, de classes, pour différents scripts (ou un) qui reçoivent l'ordre de l'utilisateur (sa requête). Rien n'empêcher aucun de tes scripts recevant l'ordre de l'utilisateur, de retourner du code HTML pour affichage.

  10. #10
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Bonjour à toi,

    déjà tu as l'air de bien avoir compris le concept MVC, qui pour faire extrêmement simple est celui-ci :

    - le modèle : fait les calculs, interagit avec la bdd
    - la vue : affiche le rendu (dans 99% des cas, une page HTML) au client
    - le contrôleur : assure la transition entre ces deux couches et fait office de plaque tournante pour mener à bien la requête client.

    Ton contrôleur doit passer les valeurs passées dans le formulaire (en l'occurence le tableau $_POST, tu n'as pas à accéder directement à ces valeurs dans ton modèle, c'est une entorse au modèle MVC). "$connexion" n'est ici pas défini dans ton contrôleur et n'a pas à y être passé, car c'est en rapport avec la bdd (bdd => modèle).

    En quelques lignes, voici comment faire évoluer ton contrôleur très simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    if (!empty($_POST)) {
        // On peut (doit) faire un traitement préalable sur les valeurs envoyés dans le formulaire
        // ...
        // 
        //puis on envoie au modèle pour traitement
        envoyerCoordonnees($_POST, $login);
    }
     
    //On récupère les données pour les afficher dans la vue
    $coordonnees = recupererCoordonnes($login);
    ?>
    Et on change le formulaire pour afficher les coordonnées s'il y en a :

    Code html : 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
    <form method="post" action="" >
        <table>
            <tr>
                <td>Nom :</td>
                <td><input id="nom" type="text" value="<?php if (isset($coordonnees)) echo $coordonnees['nom'] ?>" name="NOM"></td>
            </tr>
            <tr>
                <td>Prénom :</td>
                <td><input id="prenom" type="text" value="<?php if (isset($coordonnees)) echo $coordonnees['prenom'] ?>" name="PRENOM"></td>
            </tr>
            <tr>
                <td>Téléphone :</td>
                <td><input id="tel" type="text" value="<?php if (isset($coordonnees)) echo $coordonnees['num_tel'] ?>" name="NUM_TEL"></td>
            </tr>
            <tr>
                <td>Adresse e-mail :</td>
                <td><input id="email" type="text" value="<?php if (isset($coordonnees)) echo $coordonnees['adress_mail'] ?>" name="ADRESSE_MAIL"></td>
            </tr>
        </table>

  11. #11
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    Merci à tous les deux pour votre réponse. Non je vous rassure, dans tout ça c'est moi le mauvais ! et des screenshots parleront probablement mieux que des mots.


    Nom : 399588Capturedu20140430143828.png
Affichages : 4658
Taille : 683,6 Ko

    Les données, j'arrive déjà à les afficher. comme vous pouvez le voir les premiers champs lisent bien ma base de données. Cependant quand je décide de les envoyer, les champs se vident et rien ne se modifie. (pour répondre à nothus)

    Ensuite Spartacusply, voici le fichier total de mon contrôleur :

    Code ctrlCoordonnees.inc.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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php
    include_once("./modele/modele.inc.php");
    include_once("./controleur/ctrlVerification.inc.php");
    if (!isset($connection) || $connection != null) {
        $connexion = connecter();
    }
    $login=$_SESSION['login'];
     
    coordonneesUtilisateur($connexion, $login);
     
    $resultat= mysql_query($sql,$connexion);
    while ($ligne=mysql_fetch_assoc($resultat))  {
    	$nomUtil = $post['NOM'];
    	$prenomUtil = $post['PRENOM'];
    	$mailUtil = $post['ADRESSE_MAIL'];
    	$telUtil = $post['NUM_TEL'];
    }
     
     
    //Affichage Retour Coordonnées
    $connexion = mysql_connect('localhost', 'root', 'root');
     
    mysql_select_db('GestionStage', $connexion) or die("Impossible d'ouvrir la base");
    $login = "$_SESSION[login]";
    $sql= "SELECT NOM, NUM_TEL, ADRESSE_MAIL, PRENOM FROM UTILISATEUR INNER JOIN PERSONNE ON UTILISATEUR.IDPERSONNE = PERSONNE.IDPERSONNE WHERE LOGIN ='$login'";
    $resultat= mysql_query($sql,$connexion);
    while ($ligne=mysql_fetch_assoc($resultat))  {
    	$nomCoor = $ligne['NOM'];
    	$prenomCoor = $ligne['PRENOM'];
    	$telCoor= $ligne['NUM_TEL'];
    	$addCoor= $ligne['ADRESSE_MAIL'];
    }
     
     
     
    envoyerCoordonnees($connexion, $login);
     
     
     
    $entete= "./vue/vueMenuAdmin.inc.php"; 
    $centre= "./vue/vueCoordonnees.inc.php";
    include("./vue/template.inc.php");
    ?>

    Voici aussi ma vue au complet, pour que vous vous fassiez une idée du bordel que j'ai mis :

    Code vueCoordonnees.inc.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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?php include ctrlCoordonnees.inc.php; ?>
    <div class="contenue"> 
    	<div class="topCoord">
    		<table>
    			<tr>
    				<td>Nom :</td>
    				<td class="rep"><?php echo $nomCoor; ?></td>
    			</tr>
    			<tr>
    				<td>Prénom :</td>
    				<td class="rep"><?php echo $prenomCoor; ?></td>
    			</tr>
    			<tr>
    				<td>Téléphone :</td>
    				<td class="rep"><?php echo $telCoor; ?></td>
    			</tr>
    			<tr>
    				<td>Adresse e-mail :</td>
    				<td class="rep"><?php echo $addCoor; ?></td>
    			</tr>
    		</table>
    		<div class="separation"></div>
    		<form method="post" action="" >
    			<table>
    				<tr>
    					<td>Nom :</td>
    					<td><input id="nom" type="text" value="" name="NOM"></td>
    				</tr>
    				<tr>
    					<td>Prénom :</td>
    					<td><input id="prenom" type="text" value="" name="PRENOM"></td>
    				</tr>
    				<tr>
    					<td>Téléphone :</td>
    					<td><input id="tel" type="text" value="" name="NUM_TEL"></td>
    				</tr>
    				<tr>
    					<td>Adresse e-mail :</td>
    					<td><input id="email" type="text" value="" name="ADRESSE_MAIL"></td>
    				</tr>
    			</table>
    					<input class="submit" type="submit" value="Modifier">
    		</form>
    	</div>
    </div>

    Le modèle quant à lui ressemble à ça :

    Code modele.inc.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
    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
    session_start();
    define('USER','root');
    define('MDP', 'root');
    define('DSN', 'mysql:host=localhost;dbname=GestionStage');
     
    function connecter() {
        try {
            $connexion = new PDO(DSN, USER, MDP);
    //        $sql ="SET NAMES latin1_german1_ci";
            $sql ="SET NAMES utf8";
            $stmt = $connexion->query($sql);
            //echo "connexion réussie";
        } catch (PDOException $e) {
            echo "Erreur ! : " . $e->getMessage() . "<br />";
            $connexion = null;
        }
        return $connexion;
    }
     
    function typeUtilisateur($conn, $login){
       try {  
           $stmt = $conn->query("SELECT ROLE FROM UTILISATEUR WHERE LOGIN='".$login."'");
           $row = $stmt->fetch();
           $_SESSION['ROLE']=$row['ROLE'];
       }catch (PDOException $e) {
           echo "Erreur ! : " . $e->getMessage() . "<br />";       
       }
    }
    function connexion($conn, $login, $mdp){
        $sql= "SELECT COUNT(*) nbRes FROM UTILISATEUR WHERE LOGIN='".$login."' AND MOT_DE_PASSE='".$mdp."'";
        $stmt = $conn->query($sql);
        $row= $stmt->fetch();
        if ($row['nbRes'] == 1){
            $_SESSION['login']=$login;
            header('Location: index.php?action=accueil');
        }else{
            header('Location: index.php?action=erreur');
        }
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
     
    // deconnexion util
    function deconnexion($conn){
        session_unset();
        session_destroy();
        header('Location: index.php');    
    }
     
    function coordonneesUtilisateur($connexion, $login){  
        $sql= "SELECT NOM, NUM_TEL, ADRESSE_MAIL, PRÉNOM  
                FROM UTILISATEUR INNER JOIN PERSONNE ON UTILISATEUR.IDPERSONNE=PERSONNE.IDPERSONNE
                 WHERE UTILISATREUR.LOGIN='.$login'";
    }
     
    function envoyerCoordonnees($connexion, $login){
    	if (isset($_POST['NOM']) && isset($_POST['PRENOM']) && isset ($_POST['NUM_TEL'] ) && isset ($_POST['ADRESSE_MAIL'])){
    		$_POST['NOM']=$nomenvoiCoor;
    		$_POST['PRENOM']=$prenomenvoiCoor;
    		$_POST['NUM_TEL']=$numenvoiCoor;
    		$_POST['ADRESSE_MAIL']=$mailenvoiCoor;
    	}
    	$connexion = mysql_connect('localhost', 'root', 'root');
    	mysql_select_db('GestionStage', $connexion) or die("Impossible d'ouvrir la base");
    	$login = "$_SESSION[login]";
    	$sql= "UPDATE PERSONNE INNER JOIN UTILISATEUR SET NOM ='$nomenvoiCoor', PRENOM='$prenomenvoiCoor', NUM_TEL='$numenvoiCoor',ADRESSE_MAIL='$mailenvoiCoor' WHERE UTILISATEUR.LOGIN='.$login'   ";
     
    }
     
    ?>

    Et je suis quasi sûr que certaines des lignes que j'ai ne devrais pas non plus être dans le contrôleur, je vais modifier tout ça plus rapidement. Si vous trouvez quelque chose de louche, je suis preneur.

    Je suis d'abord en train de virer tout ce qui peut concerne la Bdd dans le modele du coup.

  12. #12
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Déjà oui, comme je l'ai dit, tout ce qui est interaction avec la bdd => direction le modèle, encapsuler dans une fonction.

  13. #13
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    Citation Envoyé par Spartacusply Voir le message
    Déjà oui, comme je l'ai dit, tout ce qui est interaction avec la bdd => direction le modèle, encapsuler dans une fonction.

    Voilà! Tout d'abord, voici le contrôleur :

    Code ctrlCoordonnnees.inc.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
    <?php
    include_once("./modele/modele.inc.php");
    include_once("./controleur/ctrlVerification.inc.php");
    if (!isset($connection) || $connection != null) {
        $connexion = connecter();
    }
    $login=$_SESSION['login'];
     
    affichagecoordonnees($connexion, $login);
    envoyerCoordonnees($connexion, $login);
     
    $entete= "./vue/vueMenuAdmin.inc.php"; 
    $centre= "./vue/vueCoordonnees.inc.php";
    include("./vue/template.inc.php");
    ?>

    Il est vide de toute connexion à la bdd.

    J'ai viré l'affichage dans le modèle, (même si elle devrais donc plutôt être dans la vue? c'est le while de mon fetch assoc qui me trouble...)
    Je dis ça parce que du coup je n'obtient plus l'affichage des données.

    Code modele.inc.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function affichagecoordonnees($connexion, $login){
    //Affichage Retour Coordonnées
    $login = "$_SESSION[login]";
    $connexion = mysql_connect('localhost', 'root', 'root');
    mysql_select_db('GestionStage', $connexion) or die("Impossible d'ouvrir la base");
    $login = "$_SESSION[login]";
    $sql= "SELECT NOM, NUM_TEL, ADRESSE_MAIL, PRENOM FROM UTILISATEUR INNER JOIN PERSONNE ON UTILISATEUR.IDPERSONNE = PERSONNE.IDPERSONNE WHERE LOGIN ='$login'";
    $resultat= mysql_query($sql,$connexion);
    while ($ligne=mysql_fetch_assoc($resultat))  {
    	$nomCoor = $ligne['NOM'];
    	$prenomCoor = $ligne['PRENOM'];
    	$telCoor= $ligne['NUM_TEL'];
    	$addCoor= $ligne['ADRESSE_MAIL'];
    }

  14. #14
    Membre Expert
    Avatar de Nothus
    Homme Profil pro
    aucun
    Inscrit en
    Juillet 2009
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : aucun
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 200
    Billets dans le blog
    27
    Par défaut
    Heu ôte-moi d'un doute (dans ctrlCoordonnnees.inc.php) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    affichagecoordonnees($connexion, $login);
    ... Si c'est une fonction, qui n'est pas reprise dans une variable ailleurs, les données récupérées de ta bdd, tu en fais quoi ?

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Fais attention tout à l'heure tu montrais un modèle qui utilisait PDO et maintenant tu utilises mysql_query qui est obsolète ...

    Sinon sur le principe tu pourrais remplacer ta fonction affichagecoordonnees par selectcoordonnees et ne retourner que la ressource du résultat. A charge ensuite au contrôleur d'exploiter (faire l'équivalent du while ou autre...) les données retournées puis de les organiser pour les passer à la vue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function selectcoordonnees($connexion, $login){
    //Affichage Retour Coordonnées
    $login = "$_SESSION[login]";
    $connexion = mysql_connect('localhost', 'root', 'root');// éviter l'extension mysql qui est obsolète
    mysql_select_db('GestionStage', $connexion) or die("Impossible d'ouvrir la base");
    $login = "$_SESSION[login]";
    $sql= "SELECT NOM, NUM_TEL, ADRESSE_MAIL, PRENOM FROM UTILISATEUR INNER JOIN PERSONNE ON UTILISATEUR.IDPERSONNE = PERSONNE.IDPERSONNE WHERE LOGIN ='$login'";
    $resultat= mysql_query($sql,$connexion);
    return $resultat;
    }

  16. #16
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    Voilà c'est bon, j'ai un peu réfléchis sur le sujet, j'obtiens mes données affichées :

    Le modele :

    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
    function coordonneesUtilisateur(){
     
        $connexion = mysql_connect('localhost', 'root', 'root');
     
        mysql_select_db('GestionStage', $connexion) or die("Impossible d'ouvrir la base");
     
        $login=$_SESSION['login'];
        $sql= "SELECT NOM, NUM_TEL, ADRESSE_MAIL, PRENOM FROM UTILISATEUR INNER JOIN PERSONNE ON UTILISATEUR.IDPERSONNE = PERSONNE.IDPERSONNE WHERE LOGIN ='$login'";
        $resultat= mysql_query($sql,$connexion);
        while ($ligne=mysql_fetch_assoc($resultat))  {
            $Retour["NOM"] = $ligne['NOM'];
            $Retour["PRENOM"] = $ligne['PRENOM'];
            $Retour["NUM_TEL"]= $ligne['NUM_TEL'];
            $Retour["ADRESSE_MAIL"]= $ligne['ADRESSE_MAIL'];
        }
        return $Retour;
    }
    Le controleur :

    Code ctrlCoordoonnees.inc.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
    <?php
    include_once("./modele/modele.inc.php");
    include_once("./controleur/ctrlVerification.inc.php");
    if (!isset($connection) || $connection != null) {
        $connexion = connecter();
    }
     
    $login=$_SESSION['login'];
    $res=coordonneesUtilisateur();
    envoyerCoordonnees($connexion, $login);
     
    $entete= "./vue/vueMenuAdmin.inc.php"; 
    $centre= "./vue/vueCoordonnees.inc.php";
    include("./vue/template.inc.php");
    ?>

    La vue :

    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
    <?php include ctrlCoordonnees.inc.php;
    include modele.inc.php;
    $nomCoor= $res['NOM'];
    $prenomCoor= $res['PRENOM'];
    $telCoor= $res['NUM_TEL'];
    $addCoor= $res['ADRESSE_MAIL'];
     
     ?>
    <div class="contenue"> 
    	<div class="topCoord">
    		<table>
    			<tr>
    				<td>Nom :</td>
    				<td class="rep"><?php echo $nomCoor; ?></td>
    			</tr>
    			<tr>
    				<td>Prénom :</td>
    				<td class="rep"><?php echo $prenomCoor; ?></td>
    			</tr>
    			<tr>
    				<td>Téléphone :</td>
    				<td class="rep"><?php echo $telCoor; ?></td>
    			</tr>
    			<tr>
    				<td>Adresse e-mail :</td>
    				<td class="rep"><?php echo $addCoor; ?></td>
    			</tr>
    		</table>

    pour ce qui est du pdo et du mysql_query, Faut savoir que l'application est en tout point théorique et fait d'il y à plus d'un an. (Eh ouais... mauvais jusqu'au bout le BTS je l'ai pas eu du premier coup!) Mais dans le principe, le PDO me servait surtout pour la connexion de l'utilisateur, et les mysql_query pour les fonctions. C'est sûrement très bête et faites moi des remarques dés qu'il y à besoin, tout est bon à être corrigé !

    Voilà, donc maintenant que l'affichage est dit propre, je vais tenter la modification, Merci encore pour toutes vos réponses, qui me sont d'une utilité énorme pour retravailler tout ça.

  17. #17
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Oui mais c'est soit PDO, soit mysql_query, on ne mélange pas les deux. PDO est hautement recommandé (et cela fait bien plus d'un an que l'extension mysql est dépréciée).

    Tu ne devrais pas définir des variables dans la vue $nomCoor= $res['NOM']; etc.
    Ces variables devraient être définies dans le contrôleur juste avant l'appel de la vue (pour hydrater la vue avec les bonnes variables).

  18. #18
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Il y a encore des erreurs dans ton script.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!isset($connection) || $connection != null) {
        $connexion = connecter();
    }
    La correction déjà serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!isset($connexion )) {
        $connexion = connecter();
    }
    Mais encore une fois, ceci est en relation avec la base de données. Ca n'a rien à faire dans le contrôleur. Connexion ne ne doit pas être passée en paramètre de ta fonction.

    L'idée est extrêmement simple : le contrôleur ne fait rien si ce n'est rediriger et faire faire. Il est à l'image d'un patron ou d'un chef de projet si tu veux. Au final, un code de contrôleur est toujours assez réduit.

    Sinon sur le principe tu pourrais remplacer ta fonction affichagecoordonnees par selectcoordonnees et ne retourner que la ressource du résultat. A charge ensuite au contrôleur d'exploiter (faire l'équivalent du while ou autre...) les données retournées puis de les organiser pour les passer à la vue.
    Toujours selon ce principe, pour moi c'est au modèle de parser le résultat. Je vois peu de raison d'utiliser une boucle dans un contrôleur.

  19. #19
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Par défaut
    Woah, je vais devoir souvent dire merci visiblement !

    J'ai pris l'initiative de remettre les mysql_query en PDO j'utilise ça pour comprendre un peu et je m'aide du code rédigé par mes anciens collègues. Si je vois que ça marche sur la fonction pour afficher les données je le ferais pour le reste.

    Merci pour la correction, et les idées émises, c'est super ! Je corrige la connexion du contrôleur de suite.

  20. #20
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Citation Envoyé par Spartacusply Voir le message
    L'idée est extrêmement simple : le contrôleur ne fait rien si ce n'est rediriger et faire faire. Il est à l'image d'un patron ou d'un chef de projet si tu veux. Au final, un code de contrôleur est toujours assez réduit.
    Assez réduit faut le dire vite. La partie contrôleur gère la dynamique de l'application. Il s'appuiera donc souvent sur des sous contrôleurs ou des services annexes pour fonctionner, en complément des parties vues et modèle. Tout comme un chef de projet pourra avoir plusieurs collaborateurs privilégiés pour le seconder dans ses prises de décisions.

    Citation Envoyé par Spartacusply Voir le message
    Toujours selon ce principe, pour moi c'est au modèle de parser le résultat. Je vois peu de raison d'utiliser une boucle dans un contrôleur.
    Justement il ne faut pas prendre ce principe trop au pied de la lettre ou alors le formuler un peu autrement, parce que dit comme ça cela peut prêter à confusion et il existe de nombreuses variantes (cf tuto ci-dessous). Enfin le principal que je voulais lui faire comprendre c'est que le modèle doit retourner des valeurs qui seront exploitées/dispatchées par le contrôleur et non pas générer des valeurs qui seront directement exploitées par la vue.

    @Hiddenz Un tuto progressif et complet sur le modèle MVC ici Et justement il a été fait par un prof qui enseigne en deuxième année de BTS SIO (Services Informatiques aux Organisations) donc cela devrait te convenir. C'est un peu "costaud" si tu veux aller jusqu'au bout du tuto mais tu trouveras les bons principes expliqués bien avant la fin. Tout dépend jusqu'à quel niveau tu veux pousser la modélisation.

Discussions similaires

  1. [MySQL] Formulaire PHP ->MySQL
    Par shub dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 09/02/2010, 22h42
  2. [MySQL] Probléme de apostrophe a mettre en formulaire php/mysql
    Par mecmec dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/06/2007, 20h42
  3. [MySQL] Formulaire PHP --> MySQL
    Par Badaboumpanpan dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 23/06/2006, 17h19
  4. Formulaire PHP-MySQL
    Par fara morgana dans le forum Langage
    Réponses: 11
    Dernier message: 09/05/2006, 15h46
  5. [MySQL] Bug Formulaire PHP-MySQL
    Par Davboc dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 01/03/2006, 15h15

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