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 :

Empêcher l'exécution d'un code php avant submit d'un formulaire [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 18
    Par défaut Empêcher l'exécution d'un code php avant submit d'un formulaire
    Bonjour à tous,

    Je suis grand débutant en html et php. Merci pour votre site, une vraie mine d'or notamment vos cours !!
    Mon but : générer une page web pour interroger une BDD sur php myadmin.

    Voici un bout de code php, une liste déroulante interroge ma BDD.
    Je souhaiterais qu'une fois seulement le submit coché (dans la 1ère partie du code), la suite du code php s'exécute car sinon j'ai un message d'erreur (la requête SQL renvoie une erreur puisque qu'aucune variable n'est transmise).
    Le problème vient de la ligne if (isset($_POST['inscription']) de la 2e partie de mon code.
    J'ai sans doute oublié quelque chose.

    Merci d'avance pour votre aide !
    Gilles



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    <!--------  Création d'une liste déroulante avec toutes les numéros des magazines----------->
    	<form name="inscription" method="post">
    		<div class="position_liste_deroulante">
    			<select name="num_magazine"> 
     
    				<?php
    					$link=mysqli_connect("localhost", "root", "","guitarist_acoustic");
    					mysqli_set_charset($link, "utf8mb4");
    					$resultat=mysqli_query($link, "SELECT num_mag FROM magazine_ga");
    					while($ligne=mysqli_fetch_array($resultat))
    					{echo '<option>'.$ligne["num_mag"].'</option><br/>';}
    					mysqli_close();
    				?>
    			</select>
    			<input type="submit" name="valider" value="Rechercher"/>
     
    		</div>
    	</form>
     
     
    <!--------  Met la valeur de la liste déroulante dans la variable n_mag après avoir appuyé sur envoyer, affiche le mag et son numéro----------->
     
    <div class="position_magazine">
    	<?php
     
    	if (isset($_POST['inscription'])
    	{
    	echo "Saisir un numéro de magazine dans la liste déroulante puis cliquez sur RECHERCHER";
    	}
    		else
    		{
    		$variable1=$_POST["num_magazine"];
    		$n_mag='<img src="Couvertures\GA'.$variable1.'.JPG" height="250">';
    		echo "<p>".$n_mag."</p>";// Affiche le numéro de référence de l'image
    		echo "<p>Mag. Guitarist Acoustic n°" .$variable1."</p>";// Affiche le numéro de référence de l'image
    		)
    	?>
    </div>

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 327
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 327
    Billets dans le blog
    17
    Par défaut
    Puisque tu débutes, autant prendre tout de suite les bonnes habitudes
    • Une BdD n'est pas sur phpMyAdmin, elle est sur MySQL, PostgreSQL, SQLite, etc. phpMyAdmin n'est qu'une interface d'administration
    • Il faut absolument séparer, autant que possible, récupération des données, traitement des données et affichage
    • PHP propose PDO ( https://php.net/pdo ), il vaut mieux l'utiliser plutôt que mysqli
    • Quand on fait des conditions ou boucles dans du HTML, mieux vaut utiliser la syntaxe alternative ( https://www.php.net/manual/fr/contro...ive-syntax.php ), le script est ainsi beaucoup plus lisible
    • Dans le HTML, il faut afficher le moins possible de chaînes littérales, et on peut utiliser "<?=" au lieu de "<?php echo" (toujours la lisibilité)
    • On évite de nommer les variables $variable1, il faut donner un nom explicite aux variables, comme $num_magazine
    • Dans un chemin d'accès (IMG) il vaut mieux utiliser le séparateur de dossiers / qui passe sur tous les systèmes, contrairement à \
    • Lors de l'affichage il faut échapper avec htmlspecialchars() les valeurs utilisateurs/externes, cela protège des injections malveillantes


    Pour le fond du problème, tu détermines si le form a été soumis avec if (isset($_POST['inscription']), or, de ce que tu montres, $_POST['inscription'] ne sera jamais valorisé (le name d'un form n'est pas transmis)
    => Fie-toi plutôt aux valeurs attendues avec ton form
    => Ici comme ton form n'a qu'une valeur, num_magazine, c'est ce qui sera utilisé

    Proposition prenant tout cela en compte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php 
     
    // 1re étape : Récupération des données
    $link = mysqli_connect("localhost", "root", "", "guitarist_acoustic");
    mysqli_set_charset($link, "utf8mb4");
    $resultat = mysqli_query($link, "SELECT num_mag FROM magazine_ga");
    $magazines = [];
    // À tester si à la place du while() tu peux utiliser mysqli_fetch_all() => https://www.php.net/manual/fr/mysqli-result.fetch-all.php 
    while ($ligne = mysqli_fetch_array($resultat)) {
        $magazines[] = $ligne;
    }
    mysqli_close($link);
     
    ?>
     
    <!-- 2nde étape : Affichage des données -->
     
    <pre>DEBUG FORM SOUMIS : <?php print_r($_POST) ?></pre>
     
    <form method="post">
        <div class="position_liste_deroulante">
            <select name="num_magazine"> 
                <?php foreach ($magazines as $ligne): ?>
                    <option><?= $ligne["num_mag"] ?></option>
                <?php endforeach ?>
            </select>
            <input type="submit" value="Rechercher"/>
        </div>
    </form>
     
    <div class="position_magazine">
     
        <?php if (!isset($_POST['num_magazine'])): // Pas de formulaire soumis ? ?>
     
            <p>Saisir un numéro de magazine dans la liste déroulante puis cliquez sur RECHERCHER</p>
     
        <?php else: // Formulaire soumis, num_magazine défini ?>
     
            <p><img src="Couvertures/GA<?= htmlspecialchars($_POST['num_magazine']) ?>.JPG" height="250">
            <p>Mag. Guitarist Acoustic n° <?= htmlspecialchars($_POST['num_magazine']) ?></p>
     
        <?php endif ?>
    </div>

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 18
    Par défaut
    Merci Séb.

    Quelle pédagogie et quelle qualité de réponse. Merci beaucoup pour vos conseils !

    J'ai testé et effectivement le <num_magazine> était clairement le problème, j'aurais du être plus vigilant.

    Pour la 2e partie du code j'ai suivi vos conseils pour la syntaxe de la structure conditionnelle, c'est vrai que c'est beaucoup plus clair.
    Je n'ai en revanche pas cerné l'idée d'ajouter une surcouche avec une nouvelle zone de liste déroulante et de bouton submit. Cela empêche le bon fonctionnement.

    Pour le PDO j'avais initialement commencer par l'utiliser, le problème c'est que je ne suis pas parvenu au remplissage de la zone déroulante.

    Voici ci-dessous le code qui fonctionne en attendant de l'améliorer avec vos conseils (PDO plutôt que mysqli notamment).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    <!--------  Création d'une liste déroulante avec toutes les numéros des magazines----------->
    	<form name="inscription" method="post">
    		<div class="position_liste_deroulante">
    			<select name="num_magazine"> 
     
    				<?php
    					// 1re étape : Récupération des données
    					$link = mysqli_connect("localhost", "root", "", "guitarist_acoustic");
    					mysqli_set_charset($link, "utf8mb4");
    					$resultat = mysqli_query($link, "SELECT num_mag FROM magazine_ga");
    					$magazines = [];
    					// À tester si à la place du while() tu peux utiliser mysqli_fetch_all() => https://www.php.net/manual/fr/mysqli-result.fetch-all.php 
    					while ($ligne = mysqli_fetch_array($resultat)) 
    					{echo '<option>'.$ligne["num_mag"].'</option><br/>';}
    					//{$magazines[] = $ligne;}  => ce code conseillé ne marche pas, à revoir
    					mysqli_close($link);
     
    				?>
    			</select>
    			<input type="submit" name="valider" value="Rechercher"/>
     
    		</div>
    	</form>
     
     
    <!-- 2nde étape : Affichage des données -->
     
    	<?php if (!isset($_POST['num_magazine'])): // Pas de formulaire soumis ? ?>
     
    	<!-- message d'alerte à l'ouverture-->		
    	<p style="color:red;position: absolute;top: 220px;left: 55px;width: 200px;height: 10px;">Saisir un numéro de magazine dans la liste déroulante puis cliquez sur RECHERCHER</p>
     
    	<?php else: // Formulaire soumis, num_magazine défini ?>
     
    	<div class="position_magazine">	 
    		<p><img src="Couvertures/GA<?= htmlspecialchars($_POST['num_magazine']) ?>.JPG" height="250">
    		<p>Mag. Guitarist Acoustic n° <?= htmlspecialchars($_POST['num_magazine']) ?></p>
    	</div>	
    	<?php endif ?>

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

Discussions similaires

  1. [EasyPHP] EasyPHP n'exécute pas le code php
    Par Invité dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 17/08/2009, 08h41
  2. Réponses: 3
    Dernier message: 06/03/2008, 15h15
  3. planifier l'exécution d'un code php
    Par devboy dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 16/05/2007, 09h48
  4. Réponses: 1
    Dernier message: 04/01/2007, 22h52
  5. [Système] Forcer l'exécution d'un code php
    Par florent dans le forum Langage
    Réponses: 4
    Dernier message: 02/12/2005, 13h13

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