IF...et/ou... then ... else... [Résolu]

Signaler
Messages postés
59
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
21 mai 2020
-
Messages postés
59
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
21 mai 2020
-
Bonjour,

J'utilise ceci afin de montrer ou pas le bouton submit d'un formulaire.
La vérification porte sur le fait qu'une variable est définie avant de cliquer sur le submit.
Tant qu'elle n'est pas définie, le bouton est masqué. Un autre choix aurait peut-être été de vérifier à l'arrivée du fichier de transmission et de renvoyer la personne sur le formulaire. mais pourquoi laisser partir quelque chose qui est faux.

<?php
	//vérification pour affichage du bouton submit 
	if (isset($_POST['Num']))  { echo '<p>Une fois saisie, envoyez votre demande   <input name="Validation" type="submit" value="Envoyer" /></p>'; } else { echo '<input name="Validation" style="display:none" type="submit" value="Envoyer" />'; }
?>

Cela fonctionne mais ne teste que le fait que la variable est bien définie...

Si la variable $_POST['Num'] est définie mais que son contenu ne correspond pas à un enregistrement dans la base, le bouton s'affiche... et donc je souhaiterais aussi vérifier cela.
Pour ça je pensais à ce code mais à priori, il y a des lacunes... surtout dans l'interface entre le clavier et le fauteuil.

<?php
		//activation de l'affichage des erreurs PHP
		error_reporting(E_ALL);
		ini_set('display_errors', TRUE);
		ini_set('display_startup_errors', TRUE);

		//on récupère proprement la variable avant de l'utiliser
		$Num = !empty($_POST['Num']) ? $_POST['Num'] : NULL;
		
		//on inclut le fichier de connexion à la bdd
		require_once "secure/cnxBdd.php";

		//préparation de la requête
		$sql = ' SELECT Num 
				FROM Inscriptions
				WHERE Num = :Num ';
		//le résultat égal à la variable $Num ira dans un tableau
		$datas = array(':Num' => $Num);
		      	
		//Execution de la requete
		try{
		  $req = $bdd->prepare($sql);
		  $req->execute($datas);
		  
		//un seul resultat possible
		  $result = $req->fetch();

		}catch(Exception $e){
		  // en cas d'erreur :
		   echo " <br>Erreur ! ".$e->getMessage();
		   echo " <br>Les datas : " ;
		   print_r($datas);
		}

		//vérification pour affichage du bouton submit que $_POST['Num'] est définie ou que $Num est dans la table
		if (isset($_POST['Num'])) && $result['Num']<>""  { echo '<p>Une fois saisie, envoyez votre demande   <input name="Validation" type="submit" value="Envoyer" /></font></p>'; } else { echo '<input name="Validation" style="display:none" type="submit" value="Envoyer" />'; }

		$req->closeCursor(); // Termine le traitement de la requête			
?> 


Et cela ne fonctionne pas ;-(
J'ai essayé avec if (isset($_POST['Num'])) | $result['Num'] = $Num ....
C'est pareil '|' est inconnu tout comme '&&'
Idem pour 'OR' à la place de '|' ...

Pas plus que
if (isset!($_POST['Num']))
{
echo '<input name="Validation" style="display:none" type="submit" value="Envoyer" />';
} elseif $result['Num']""
{
echo '<input name="Validation" style="display:none" type="submit" value="Envoyer" />';
}
else
{
echo '<p>Une fois saisie, envoyez votre demande <input name="Validation" type="submit" value="Envoyer" /></p>';
}
...

Je pense que je mélange des expressions qui sont seulement true/false avec des chaines.




--

3 réponses

Messages postés
28931
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
30 mai 2020
2 468

<?php
//activation de l'affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//on inclut le fichier de connexion à la bdd
require_once "secure/cnxBdd.php";

//on récupère proprement la variable avant de l'utiliser
$Num = !empty($_POST['Num']) ? trim($_POST['Num']) : NULL; // on récupère la variable NULL et on supprime les "lead spaces"

// initialisation des autres variables pouvant servir
$result = NULL;

if($Num){ // si la variable $Num existe et n'est pas nulle/vide
	
	//préparation de la requête
	$sql = ' SELECT Num 
			FROM Inscriptions
			WHERE Num = :Num ';
	//le résultat égal à la variable $Num ira dans un tableau
	$datas = array(':Num' => $Num);
			
	//Execution de la requete
	try{
	  $req = $bdd->prepare($sql);
	  $req->execute($datas);
	  
	//un seul resultat possible
	  $result = $req->fetch();

	}catch(Exception $e){
	  // en cas d'erreur :
	   echo " <br>Erreur ! ".$e->getMessage();
	   echo " <br>Les datas : " ;
	   print_r($datas);
	}
}		

if( !empty($Num) && !empty($result) ){ // Si la variable $Num existe et n'est pas nulle/vide ET si la variable $result existe et n'est pas nulle/vide
	echo '<p>Une fois saisie, envoyez votre demande   <input name="Validation" type="submit" value="Envoyer" /></font></p>'; 
} else { 
	echo '<input name="Validation" style="display:none" type="submit" value="Envoyer" />'; 
}
		
//$req->closeCursor(); // Termine le traitement de la requête	==>>> Pas necessaire !

Messages postés
59
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
21 mai 2020

Super.
ça marche. Un énorme merci Jordane.
J'avais bien tenté un =! pour tester la variable $_POST['Num'] mais l'erreur obtenue m'avait incitée à quitter cette piste.
faut dire que j'avais mis
$_POST['Num'] =! ""
Que je traduisais littéralement dans ma tête la variable obtenue par post n'est pas vide... mais bon, c'était tout faux.
J'aurai sûrement encore avoir à faire sur ce forum ...
Best regards
Messages postés
28931
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
30 mai 2020
2 468 >
Messages postés
59
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
21 mai 2020

Pense à mettre le sujet en résolu.
Bonjour

"Tant qu'elle n'est pas définie, le bouton est masqué. Un autre choix aurait peut-être été de vérifier à l'arrivée du fichier de transmission et de renvoyer la personne sur le formulaire. mais pourquoi laisser partir quelque chose qui est faux. "

En effet il faut faire les 2.
Une solution pour vérifier qu'un champ est remplie passe par le HTML avec l'attribut required qui permet de bloquer l'envoi du formulaire sans avoir à le masquer:
https://www.w3schools.com/tags/att_input_required.asp

Le reste passe par des tests(comme if) en JavaScript voire des expressions régulières(regExp) quand il faut vérifier la structure d'une chaîne(comme une adresse email de forme valide avec un arobase un point et un domaine, qu'un numéro de téléphone ne contient que des nombres, etc...).

"surtout dans l'interface entre le clavier et le fauteuil. " ahaha mais de l'humour et du travail donc ça ira , surtout que ce n'est pas très compliqué ni un sujet rare qui manque d'explications.

Évidemment le test en PHP est nécessaire, il doit éviter aussi de faire passer du code qui pourrait nuire à la base de données(injection SQL) mais comme vous avez deviné il n'est pas nécessaire d'envoyer le formulaire s'il n'est pas rempli correctement(et même mieux parce que plus rapide que devoir faire la requête serveur pour afficher un message d'erreur à l'utilisateur).
Plus efficace, convivial et ergonomique est de vérifier avec JavaScript et indiquer les erreurs à corriger lors de l'envoi annulé au serveur.
D'autres astuces peuvent utiliser HTML avec les différents types d'input(number ne permet que de mettre des nombres, un input date pour une date etc...) et avec required (attribut) si le champ doit obligatoirement être rempli.
Messages postés
59
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
21 mai 2020

Bonjour Nanaki,

Merci de tes conseils mais difficilement applicable dans mon cas.
Le required sur l'input est bien utilisé mais l'input est dans un formulaire précédent (sur la même page) => c'est donc sa valeur $_POST que je dois vérifier.

Pour expliquer en 2 mots. C'est un formulaire d'inscription dans lequel au départ, il est demandé un N° pour afficher un éventuel historique. C'est ce N° qui une fois validé (=>1er submit - form[0]) permet d'afficher l'historique de la personne. Ensuite, la personne même si elle n'a pas d'historique, peut s'inscrire et la validation se fait alors avec un second submit form[1]. C'est cette validation là que je ne montre que si le N° à donner dans le form[0] est dans la base. Un appui direct sur le second submit sans avoir au préalable submiter le form[0] provoquant une erreur dans le fichier.php de transmission des données.

Ensuite, j'essaie de ne pas trop utiliser de JS (du moins quand il y a des possibilités autres car suivant les navigateurs, les configurations des postes utilisateurs voire des restrictions dans des entreprises, le JS ne passe pas toujours).
La solution choisie et corrigée par Jordane que je remercie encore me convient parfaitement mais merci pour les conseils et explications.

Daniel
Messages postés
11183
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 mai 2020
635
bonjour,
la syntaxe de if en php:
if (condition)

il me semble que tu négliges de mettre les parentheses autour de la condition.