8768 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un formulaire écrit en php avec accès à une base de données mySQL.

Celui-ci fonctionne parfaitement sous Microsoft IE 11 et EDGE Smiley biggrin .
Par contre sous Firefox 56 et sous Chrome Version 61.0.3163.100 (Build officiel) (64 bits), je n'arrive pas à récupérer les champs du formulaire Smiley decu . Après soumission, le navigateur ne trouve pas les index du tableau $_POST des champs de saisie.
Si quelqu'un pouvait me dire si ce problème a déjà été rencontré (et sa solution) ? D'avance merci. Smiley rolleyes

Ma machine :
Processeur octo-cœurs AMD FX3270 64 bits
8 Go DDR3 1333MHz
SSD 1,5 To
HDD 6 To
Graphique: Nvidia GTX-950
Deux écrans 24".
Modifié par JClaude66700 (18 Oct 2017 - 00:07)
Salut

La config de la machine n'a rien à voir, peux-tu nous montrer ton code ? html / php ? merci
Ci-dessous une portion du code de mon formulaire (extrait d'un fichier php) .
Il y a également un autre formulaire sur mon site dont le comportement est identique à celui-ci. Il fonctionne parfaitement sous IE 11 et EDGE de Microsoft et ne reconnaît pas les champs soumis sous Firefox et Chrome.
Ce sont les champs de saisie <textarea name="xxx"> où $_POST('xxx'] me donne une erreur
"index indéfini dans le fichier filename à la ligne 999" lorsque je soumet le formulaire.
Merci de toute aide que vous pouvez m'apporter pour résoudre ce problème.

Je viens, pour essayer, de remplacer mes champs de saisie <textarea></textarea> par des champs <input />, et là, tout est bien reconnu par tous les navigateurs. Par contre, je voudrais bien conserver mes textarea (qui me permettent de définir des zones de saisie multi-lignes).
Si quelqu'un voit d'où peut venir cette différence et me le dire, je lui en serai reconnaissant.

D'avance mille merci


<head runat="Server">
<?php
	include('meta.php');
    if (!isset($_SESSION)) {
    	session_start();
    }
	$id=-1;
	require_once('connect.php');
	if (isset($_POST['idmember'])) {
		$id = $_POST['idmember'];
		if ($id == $_SESSION['id_member']) {
			mysqli_query($cnx, "SET NAMES 'utf8'"); 
			$sql="SELECT * FROM membres WHERE id='$id'";
			if ($result = mysqli_query($cnx, $sql)) {
				// récupère le nombre de lignes retournées
				$numrows = mysqli_num_rows($result);
				if ($numrows == 1) {
					$modify = true;
				}
				else {
					$emsg="<strong><font color=\"#FF0000\">Erreur lors de la lecture de la base de données.</font><strong><br />";
				}
			}
		}
		else {
			$emsg="<strong><font color=\"#FF0000\">Erreur interne. Contacter le Webmaster.</font><strong><br />";
		}
	}
	elseif (isset($_POST['ValMod'])) {
		$adresse = isset($_POST['adresse']) ? $_POST['adresse'] : NULL;
		$ville = isset($_POST['ville']) ? $_POST['ville'] : NULL;
		$cpostal = isset($_POST['cpostal']) ? $_POST['cpostal'] : NULL;
		$pays = isset($_POST['pays']) ? $_POST['pays'] : NULL;
		$telephone = isset($_POST['telephone']) ? $_POST['telephone'] : NULL;
		$prof = isset($_POST['profession']) ? $_POST['profession'] : NULL;	
		if (isset($_SESSION['id_member']) && $adresse != NULL) {
			$id = $_SESSION['id_member'];
			$sql="UPDATE membres SET adresse='$adresse', ville='$ville', cpostal='$cpostal', pays='$pays', telephone='$telephone', profession='$prof' WHERE id='$id'";
			mysqli_query($cnx, "SET NAMES 'utf8'"); 
			if ($result = mysqli_query($cnx, $sql)) {
				$emsg="<strong><em>Données du profil mises à jour.</em></strong><br />";
			}
			else {
				$err = mysqli_error($cnx) ;
				$emsg="<strong><font color=\"#FF0000\">Erreur lors de la modification des données du profil (".$err.").</font><strong><br />";
			}
		}
		else {
			$emsg="<strong><font color=\"#FF0000\">Erreur interne. Contacter le Webmaster.</font><strong><br />";
		}
	}
	if (isset($_POST['Can'])) {
		$id = -1;
		if (isset($modify)) $modify = false;
	}
    ?>
...................
</head>
<body>
    <div id="site_header">
.....
   </div>
    <div id="site_content">
    <?php
	if (isset($_SESSION['pseudo'],$_SESSION['qualite'])) {
		$pseudo = $_SESSION['pseudo'];
		mysqli_query($cnx, "SET NAMES 'utf8'"); 
		$sql = "SELECT * FROM membres WHERE pseudo='$pseudo'";
		$result = mysqli_query($cnx, $sql);
		if ($result) {
			// récupère le nombre de lignes retournées
			$numrows = mysqli_num_rows($result);
			if ($numrows != 1) {
				$err = mysqli_error($cnx) ;
				$emsg = "Erreur lors de la lecture de la Base de données (".$err.").<br />";
			}
			else {
	?>
				<!-- Affiche les champs modifiables : civilité, nom, prénom, adresse, ville, cpostal, pays, telephone, profession.
				     Affiche pour information : courriel, montant de la cotisation, statut (tiré de qualité), date_adh et lieu_adh -->
                <form name="bd_modify" action="myprofile.php" method="post" runat="server">
....
                <table align="center" width="720">
                  <tr>
                  </tr>
                  <?php
                      setlocale(LC_CTYPE, 'fr_FR.UTF-8');
                      $donnees = mysqli_fetch_array($result) ;
                      echo('<tr>');
                      if (isset($modify) && $modify==true) {
                           $bgcolor= 'bgcolor="#CCFF66"';
                           $rcheck=" checked";
                      }
                      else {
                           $bgcolor= 'bgcolor="#FFFFFF"';
                           $rcheck=" ";
                      }
                      echo('<tr>');  
                      echo('<td align="right" valign="top">Civilité : </td>');
                      if ($rcheck==" checked") {
                          echo('<td align=\'center\' width="240" '.$bgcolor.'><textarea class="ta" form="bd_modify" name="civilite" minlength="2" maxlength=255" rows="1" cols="20" required>'.$civilite.'</textarea></td>');
                      }
                      else {
                          echo('<td align=\'center\' '.$bgcolor.'>'.$civilite.'</td>');
                      }
                      echo('<td>&nbsp;</td></tr>');
                      echo('<tr>');
                      echo('<td align="right" valign="top">Prénom : </td>');
                      if ($rcheck==" checked") {
                          echo('<td align=\'center\' '.$bgcolor.'><textarea class="ta" form="bd_modify" name="prenom" minlength="2" maxlength=255" rows="1" cols="20" required>'.$prenom.'</textarea></td>');
                      }
                      else {
                        echo('<td align=\'center\' '.$bgcolor.'>'.$prenom.'</td>');
                      }
                      echo('<td width="200">&nbsp;</td></tr>');
...etc... idem pour les autres champs (nom, adresse, ville, cpostal, pays, telephone et profession
                ?>
                </table>
                <?php
// les boutons de validation du formulaire
                if (isset($modify) && $modify==true) {
                    echo('<div align="center"><input id="6" name="Can" type="submit" value=" Annuler  " />&nbsp;');
                    if (isset($modify) && $modify==true) {
                        echo('<input id="5" name="ValMod" type="submit" value=" Valider les modifications  " /></div>');
                        echo('<div align="right"><font size="1">Seuls les champs encadrés en rouge peuvent être modifiés (pour les autres champs, merci de s\'adresser à un membre du bureau de l\'association).</font></div>');
                    }
                }
                else {
					echo('<div align="center"><input type="text" name="idmember" value="'.$id.'" class="hide" />');
                    echo('<input id="1" name="Mod" type="submit" value=" Modifier mes données de profil " />&nbsp;</div>');
                }
                ?>
                </form>
...
</body>

Modifié par JClaude66700 (19 Oct 2017 - 18:06)
Commence par compartimenter ton code là tu fais tout au même endroit (appel à la base de données, rendu frontale, contrôle de sécurité) c'est totalement illisible.

Sans dépasser la 14eme ligne tu es sensible aux injections sql.
Le comportement Serveur est dans le <head></head> et le formulaire dans le <body></body>. Le tout est en accès https:// donc sécurisé.
Et je n'ai pas l'intention de réécrire le tout.
Ce qui peut te paraître illisible est le fait qu'il y ait deux passes différentes dans le formulaire : une première passe d'affichage pur et dur des données de la base et une avec certains des champs de ces données qui deviennent modifiables (avec des <textarea>).
Je cherche juste à comprendre pourquoi le comportement des navigateurs vis-à-vis des <textarea> est différent. Sous IE 11 et EDGE cela fonctionne parfaitement alors que sous Firefox ou Chrome les index des $_POST ne sont pas reconnus.
Merci de l'aide que tout un chacun pourrait m'apporter pour comprendre ce phénomène.
Explique moi pour toi l’intérêt de l'attribut runat sur la balise head ? (en tant que dev C# je vois pas bien ce que ça vient faire dans du PHP).