Requête qui s'exécute alors qu'elle ne devrait pas

Fermé
-NoeGo- Messages postés 52 Date d'inscription mercredi 28 décembre 2016 Statut Membre Dernière intervention 7 mai 2021 - 12 mai 2020 à 23:50
-NoeGo- Messages postés 52 Date d'inscription mercredi 28 décembre 2016 Statut Membre Dernière intervention 7 mai 2021 - 13 mai 2020 à 00:35
Bonjour,

Dans ce bout de code, je souhaite enregistrer une nouvelle ligne dans ma base uniquement si le nom n'est pas déjà connu dans celle-ci.
Je passe donc pas un comptage avec le critère du nom et si le comptage est supérieur ou égal à 1, je n'exécute pas la requête, sinon, je l’exécute...
Rien de bien compliqué.

Pourtant, il arrive une bizarrerie sans nom.
Quand le nom n'existe pas dans la base, il m'affiche le texte comme quoi l'enregistrement n'a pas eu lieu, mais derrière la requête est quand même exécutée et la ligne est bien ajouté à la base...
En fait, cela agissait comme si la requête était exécuté avant le comptage, alors qu'au vu du code, ça ne devrait pas...

Voici le code, si certains voit quelque chose que je loupe...
<?php
$requete = $connexion->query("SELECT nom FROM evaluation WHERE nom='".$_SESSION['nom']."'") or die(mysqli_error($connexion));
$nombre = $requete->num_rows;
if($nombre >= 1)
{
	?>
	html pour dire que le questionnaire a déjà été renseigné et donc n a pas été enregistré
	<?php
}
else
{
	$connexion->query("INSERT INTO evaluation VALUES(NULL , '".$_SESSION['nom']."' , '".$_SESSION['score']."' ,'".$_SESSION['question1']."' , '".$_SESSION['question2']."' , '".$_SESSION['question3']."' , '".$_SESSION['question4']."' , '".$_SESSION['question5']."' , '".$_SESSION['question6']."' , '".$_SESSION['question7']."' , '".$_SESSION['question8']."' , '".$_SESSION['question9']."' , '".$_SESSION['question10']."' , '".$_SESSION['question11']."' , '".$_SESSION['question12']."' , '".$_SESSION['question13']."' , '".$_SESSION['question14']."' , '".$_SESSION['question15']."' , '".$_SESSION['question16']."' , '".$_SESSION['question17']."' , '".$_SESSION['question18']."' , '".$_SESSION['question19']."' , '".$_SESSION['question20']."' , '".$_SESSION['question21']."' , '".$_SESSION['question22']."' , '".$_SESSION['question23']."' , '".$_SESSION['question24']."' , '".$_SESSION['question25']."' , '".$_SESSION['question26']."' , '".$_SESSION['question27']."' , '".$_SESSION['question28']."' , '".$_SESSION['question29']."' , '".$_SESSION['question30']."' , '".$_SESSION['question31']."' , '".$_SESSION['question32']."' , '".$_SESSION['question33']."' , '".$_SESSION['question34']."' , '".$_SESSION['question35']."' , '".$_SESSION['question36']."' , '".$_SESSION['question37']."' , '".$_SESSION['question38']."' , '".$_SESSION['question39']."' , '".$_SESSION['question40']."' , '".time()."' , '".$_SERVER['REMOTE_ADDR']."')") or die(mysqli_error($connexion));
	?>
	html pour dire que le questionnaire a bien été enregistré
	<?php	
}
?>


Merci pour votre aide, là je sèche...

4 réponses

jordane45 Messages postés 38182 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 mai 2024 4 670
13 mai 2020 à 00:02
Bonjour,

Bon.. quand je vois qu'on stocke 40 questions sur une seule ligne de bdd .... je pleure un bon coup ...
Clairement... ce n'est pas le fonctionnement optimal d'une BDD relationnelle ...
Typiquement.. si demain tu veux ajouter de nouvelles questions... tu feras quoi ?? tu vas modifier la structure de ta table pour ajouter de nouvelles colonnes ??
Sache que, sauf dans de rares cas..., on défini la structure de sa BDD et ensuite on n'y touche plus.
Dans ton cas, j'aurais simplement créé une seconde table avec les champs (id , id_evaluation , id_question, valeur )

Mais bon.. tous les débutants font ce genre de bêtise.

Bref, cette parenthèse étant faite ... pour que tu parviennes à déterminer où se trouve le souci ( si il y en a un... ) c'est d'ajouter un peu de debug...
Par exemple
<?php
$sql = "SELECT nom FROM evaluation WHERE nom='".$_SESSION['nom']."'";
echo "<br> La requête est : <br> " . $sql;
$requete = $connexion->query($sql) or die(mysqli_error($connexion));
$nombre = $requete->num_rows;

echo "<br>Nombre :" . $nombre;

if($nombre >= 1) {
     echo "<br> Nombre >=1 ";
	?>
	html pour dire que le questionnaire a déjà été renseigné et donc n a pas été enregistré
	<?php
} else {
       echo "<br> Nombre= 0 ";
	$connexion->query("INSERT INTO evaluation VALUES(NULL , '".$_SESSION['nom']."' , '".$_SESSION['score']."' ,'".$_SESSION['question1']."' , '".$_SESSION['question2']."' , '".$_SESSION['question3']."' , '".$_SESSION['question4']."' , '".$_SESSION['question5']."' , '".$_SESSION['question6']."' , '".$_SESSION['question7']."' , '".$_SESSION['question8']."' , '".$_SESSION['question9']."' , '".$_SESSION['question10']."' , '".$_SESSION['question11']."' , '".$_SESSION['question12']."' , '".$_SESSION['question13']."' , '".$_SESSION['question14']."' , '".$_SESSION['question15']."' , '".$_SESSION['question16']."' , '".$_SESSION['question17']."' , '".$_SESSION['question18']."' , '".$_SESSION['question19']."' , '".$_SESSION['question20']."' , '".$_SESSION['question21']."' , '".$_SESSION['question22']."' , '".$_SESSION['question23']."' , '".$_SESSION['question24']."' , '".$_SESSION['question25']."' , '".$_SESSION['question26']."' , '".$_SESSION['question27']."' , '".$_SESSION['question28']."' , '".$_SESSION['question29']."' , '".$_SESSION['question30']."' , '".$_SESSION['question31']."' , '".$_SESSION['question32']."' , '".$_SESSION['question33']."' , '".$_SESSION['question34']."' , '".$_SESSION['question35']."' , '".$_SESSION['question36']."' , '".$_SESSION['question37']."' , '".$_SESSION['question38']."' , '".$_SESSION['question39']."' , '".$_SESSION['question40']."' , '".time()."' , '".$_SERVER['REMOTE_ADDR']."')") or die(mysqli_error($connexion));
	?>
	html pour dire que le questionnaire a bien été enregistré
	<?php	
}
?>


Ensuite, le premier truc à faire, c'est de récupérer ce que t'affiche ton
echo "<br> La requête est : <br> " . $sql;

puis de tester DIRECTEMENT la requête dans ta bdd ( via phpmyadmin par exemple) pour vérifier ce qu'elle te retourne...

Au passage, je t'invite à lire (et à appliquer) le contenu de ce lien :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

0
-NoeGo- Messages postés 52 Date d'inscription mercredi 28 décembre 2016 Statut Membre Dernière intervention 7 mai 2021 11
13 mai 2020 à 00:17
Bonjour Jordane,

Merci pour ton aide.
Oui tu as tout à fait raison 40 questions sur la même ligne c'est pas la meilleure idée du monde.
En fait, je fais ce questionnaire pour évaluer mes élèves dans le cadre du confinement, la base ne bougera pas, c'est pour vendredi et ensuite ma table évaluation sera supprimée. Donc j'ai fait au plus vite.

Ensuite, j'avais déjà ces affichages de debug, que j'ai supprimé pour mon post afin de simplifier la lecture du code.
Et tous les affichages sont normaux, je ne vois pas de bizarrerie.
Mon code html affiche que le nom est déjà connu mais pour autant la ligne est ajoutée...

Toutefois tout à l'heure, je n'ai pas eu ce problème sur 4 ou 5 enregistrements, mais là le problème revient... Je ne comprend rien...
0
jordane45 Messages postés 38182 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 mai 2024 4 670
13 mai 2020 à 00:20
Il y a sûrement autre chose dans ton code...
Il faudrait nous le montrer entièrement...
Après... faire pleins de tests en laissant les debug jusqu'à obtenir à nouveau le souci serait pas mal;
Et surtout.. nous montrer le résultat lorsque tu rencontres le souci en question.
0
-NoeGo- Messages postés 52 Date d'inscription mercredi 28 décembre 2016 Statut Membre Dernière intervention 7 mai 2021 11
13 mai 2020 à 00:29
Voici le code complet de cette partie.
Je passe les question par la méthode GET quand j'arrive à la 41ème, c'est fini :

else if($_GET['question']==41)
	{
		if(!isset($_SESSION['question40']))
		{
			$_SESSION['question40']=$_POST['question'];
			if($_POST['question']=='reponse5')
			{
				$_SESSION['score']= $_SESSION['score']+0.5;
			}
		}
		else
		{
			echo 'La réponse à la question précédente avait déjà été enregistrée. Votre nouvelle réponse n\'a donc pas été prise en compte.';
		}
		$sql = "SELECT nom FROM evaluation WHERE nom='".$_SESSION['nom']."'";
		echo "<br> La requête est : <br> " . $sql;
		$requete = $connexion->query($sql) or die(mysqli_error($connexion));
		$nombre = $requete->num_rows;

		echo "<br>Nombre :" . $nombre;
				  if($nombre >= 1)
				  {
						 echo "<br> Nombre >=1 ";
						 echo $nombre;?>
						 <h2 class="text-black mt0">Fin du questionnaire</h2>
						  Vous aviez déjà rempli le questionnaire.<br/>
						  Celui-ci n a pas été enregistré.
					<?php
				  }
				  else
				  {
						echo "<br> Nombre= 0 ";
						$connexion->query("INSERT INTO evaluation VALUES(NULL , '".$_SESSION['nom']."' , '".$_SESSION['score']."' ,'".$_SESSION['question1']."' , '".$_SESSION['question2']."' , '".$_SESSION['question3']."' , '".$_SESSION['question4']."' , '".$_SESSION['question5']."' , '".$_SESSION['question6']."' , '".$_SESSION['question7']."' , '".$_SESSION['question8']."' , '".$_SESSION['question9']."' , '".$_SESSION['question10']."' , '".$_SESSION['question11']."' , '".$_SESSION['question12']."' , '".$_SESSION['question13']."' , '".$_SESSION['question14']."' , '".$_SESSION['question15']."' , '".$_SESSION['question16']."' , '".$_SESSION['question17']."' , '".$_SESSION['question18']."' , '".$_SESSION['question19']."' , '".$_SESSION['question20']."' , '".$_SESSION['question21']."' , '".$_SESSION['question22']."' , '".$_SESSION['question23']."' , '".$_SESSION['question24']."' , '".$_SESSION['question25']."' , '".$_SESSION['question26']."' , '".$_SESSION['question27']."' , '".$_SESSION['question28']."' , '".$_SESSION['question29']."' , '".$_SESSION['question30']."' , '".$_SESSION['question31']."' , '".$_SESSION['question32']."' , '".$_SESSION['question33']."' , '".$_SESSION['question34']."' , '".$_SESSION['question35']."' , '".$_SESSION['question36']."' , '".$_SESSION['question37']."' , '".$_SESSION['question38']."' , '".$_SESSION['question39']."' , '".$_SESSION['question40']."' , '".time()."' , '".$_SERVER['REMOTE_ADDR']."')") or die(mysqli_error($connexion));
						?>
						<h2 class="text-black mt0">Fin du questionnaire</h2>
						Vous avez terminé votre évaluation.<br/>
						Voici votre note : <?php echo $_SESSION['score'];?>/20.<br/>
						<?php	
				  }
	}?>
0
-NoeGo- Messages postés 52 Date d'inscription mercredi 28 décembre 2016 Statut Membre Dernière intervention 7 mai 2021 11
13 mai 2020 à 00:35
Et voici des images
phpmyadmin avant :


Affichage html en faisant le questionnaire avec le nom INES :


phpmyadmin après l'affichage de la page html :
0