Bonjour,
Je travaille sur un projet pour mon entreprise. je dois faire une application web gérant un de nos département.
Sur cette image ci-dessus vous constaterez qu'il ya a 3 champde recherche, pour le moment je travail avec le premier champ "N° GIT". en entrant une donnée dans le champ N° GIT, il doit faire une recherche en base de donnée pour savoir sil existe ou pas. s'il existe, alor je serai redirigé vers une page x, dans le cas contraire, je serai redirigé vers une page y. voici mon code :
////////////D'abord nous vérifierons si une valeur a été rentrée////////////////////////////////////// if(isset($_POST['rechEquipement'])) { $numGIT=htmlspecialchars($_POST['numGIT']); $numEnt=htmlspecialchars($_POST['numEnt']); $numSerie=htmlspecialchars($_POST['numSerie']); if(!empty($_POST['numGIT']) OR !empty($_POST['numEnt']) OR !empty($_POST['numSerie']))//vérification si l'un des champ a été renseigné { switch(isset($_POST['rechEquipement'])) { case $numGIT: //echo 'numero git selectionné'; $rech=$bdd->prepare('SELECT * FROM equipement WHERE code_git LIKE ?');//Chercher les enregistrements dans la table equipement dont le code GIT est comme la valeur entrée dans le champ numGIT $rech->execute(array($_POST['numGIT']));//excécute la requete $count=$rech->rowCount(); while($result=$rech->fetch()) { //echo $result['nom_equipement']; /*switch($count) { case 0: header ('Location:operation.php'); break; case 1: header ('Location:etalonnagey.php'); break; default; header ('Location:operation.php'); }*/
if($count>=1) { /*echo $count.' résultats trouvé'; echo 'Cette valeur existe en base de données'; echo $result['nom_equipement'];*/ header ('Location:etalonnagey.php'); } else//Si cette valeur n'existe pas en base de données { /*echo $count.' résultat trouvé'; echo 'Cette valeur n\'existe pas en base de données';*/ header ('Location:operation.php'); }
} break; case $numEnt: //echo 'numero entreprise selectionné'; $rech=$bdd->prepare('SELECT * FROM equipement WHERE id_entreprise LIKE ?'); $rech->execute(array($_POST['numEnt'])); while($result=$rech->fetch()) { echo $result['nom_equipement']; /*if(isset($result['nom_equipement']))//SI cette valeur existe en base de données { //echo 'Cette valeur existe en base de données'; header ('Location:etalonnagey.php'); } else//Si cette valeur n'existe pas en base de données { echo 'Cette valeur n\'existe pas en base de données'; //header ('Location:etalonnagen.php'); }*/ } break; case $numSerie: echo 'numero de serie selectionné'; break; default:
<h3>Etalonnage<hr></h3> <div id="etalonnage"> <form method="POST" action=""> <fieldset> <table> <tr> <tr> <caption><i>Recherche de l'équipement en base de données à partir du numéro GIT, de l'identification interne ou du numéro de série. S'il n'existe pas, cela signi qu'il n'a jamais été étalonné ou vérifié par GIT. Dans ce cas remplissez directement le formulaire.</i></caption> </tr> </tr> </tr> <td><input type="text" id="numGIT" name="numGIT" placeholder="N° GIT" /></td><td>    </td> <td><input type="text" id="numEnt" name="numEnt" placeholder="N° Entreprise" /></td><td>    </td> <td><input type="text" id="numSerie" name="numSerie" placeholder="N° de série" /></td><td>    </td> <td><input type="submit" value="Vérifier" id="rechEquipement" name="rechEquipement"/><td> </tr>
<a href="operation.php" rel="nofollow noopener noreferrer" target="_blank">Cet équipement ne possède pas de code GIT</a> </form> </div>
</body> </html>
Ce que je constate, c'est que mon code marche quand la valeur entrée se trouve en bdd. dans le cas contraire, j'ai aucune réaction, pas de redirection, même quand je fais un echo, il n'y a pas de réponse, aucune réaction, j'ai cherché depuis plusieurs heurs à remédier à ce problème mais j'ai pas pu. Quelqu'un peut-il m'aider svp!
Merci !
$count=$rech->rowCount();
while($result=$rech->fetch())
{
//echo $result['nom_equipement'];
/*switch($count)
{
case 0:
header ('Location:operation.php');
break;
case 1:
header ('Location:etalonnagey.php');
break;
default;
header ('Location:operation.php');
}*/
if($count>=1)
{
/*echo $count.' résultats trouvé';
echo 'Cette valeur existe en base de données';
echo $result['nom_equipement'];*/
header ('Location:etalonnagey.php');
}
else//Si cette valeur n'existe pas en base de données
{
/*echo $count.' résultat trouvé';
echo 'Cette valeur n\'existe pas en base de données';*/
header ('Location:operation.php');
}
}
J ai juste regardé vite fait, mais cette partie n est pas bonne: si le fetch marche, c'est que tu as un résultat.
Donc il faut sortir le vérification du count:
$count=$rech->rowCount();
if($count>=1)
{
while($result=$rech->fetch())
{
header ('Location:etalonnagey.php');
}
}
else//Si cette valeur n'existe pas en base de données
{
header ('Location:operation.php');
}
Par contre... NE PAS UTILISER ROWCOUNT
Le résultat n'est pas garanti pour des requêtes de type SELECT
Dans le manuel PHP il est indiqué :
Si la dernière requête SQL exécutée par l'objet PDOStatement associé est une requête de type SELECT, quelques bases de données retourneront le nombre de lignes retournées par cette requête. Néanmoins, ce comportement n'est pas garanti pour toutes les bases de données et ne devrait pas être exécuté pour des applications portables.
A la place... tu peux faire un fetchAll et faire un count (php) dessus
//recuperation propre des variables AVANT de les utiliser
$GIT = !empty($_POST['numGIT']) ? $_POST['numGIT'] : NULL;
//Preparation de la requete
$sql = "SELECT * FROM equipement WHERE code_git LIKE ?";
$datas = array($git);
//exécution de la requete :
$rech=$bdd->prepare($sql);
$rech->execute($datas);
//On stocke le resultat dans un array
$resultat = $rech->fetchAll();
//on regarde combien de résultats sont retournés par la requete
$count = !empty($resultat ) ? count($resultat ) : 0;
//on teste si il y a eu des resultats
if($count >0 ){
//la valeur existe
header ('Location:etalonnagey.php');
exit();
}else{
//pas de resultat
header ('Location:operation.php');
exit() ; //toujours mettre un exit apres une redirection
}
Oui oui j avais bien lu^^ mais je ne veux pas trop modifier le code des gens pour des deprecated ou des choix que je trouve pas top (tel que faire un "select * " au lieu de nommer les colonnes).
C'est normal, quand tu débute il y a des choses que tu ne prends pas en compte, mais quand tu vas commencer à reprendre ton code ou celui d un autre, y a beaucoup de choses que tu verra.
Dans le cas du select par exemple, pour connaitre les colonnes on est forcé d'aller voir la bdd tandis que si les colonnes sont nommées c'est déjà plus simple. Ou encore en fonction du fetch que tu utilise, ca pourrai poser problème dans le cas ou la table soit modifié (une colonne en plus par exemple).
Pour le count, si tu utilise un provider dont tu es certains du résultat, tu peux l utiliser, mais vu que très souvent quand on code on va copier coller des bouts de code déjà implémentés, on évite de les utiliser pour ne pas induire en erreur (vu que dans ce cas en fonction du provider le résultat peu être erroné) => et surtout en reprenant un code qui fonctionne dans un projet, en cas d erreur du soupconnera pas tout de suite cette partie et au final tu perds beaucoup de temps à comprendre.
Mais dans ton cas, c'est à dire aux débuts, essaye déjà de faire des choses qui fonctionnent dans un contexte délimité, et petit à petit tu fera naturellement des choses qui seront plus génériques (et donc réutilisable dans d autres contextes).
j'ai cherché plusieurs fois dans les forum mais pas de réponse favorable à ma préocupation, pouvez vous me montrer svp comment y arriver ? merci d'avance !
Donc normal que ça ne marche pas ...
Tu dois assigner la valeur lorsqu'elle existe (c'est à dire après le SUBMIT ).
Lorsque tu fais une redirection.... les variables POST sont remises à zéro...
Tu dois donc assigner la valeur AVANT de faire la redirection.
Bon.. de toutes façons.. il s'agit là d'une nouvelle question...
Merci donc d'ouvrir une nouvelle discussion pour ce problème.
Pense à y indiquer le code que tu utilises
En gros ce que tu fais, si on compare avec un envoi de colis par exemple, c'est récupérer le coli dans le centre de tri (ton POST) puis envoyé quelqu'un livre le colis (redirection) sans lui avoir au préalable donné le colis ... le gas se retrouve main vide devant le client (la page redirigée).
Donc l'étape qu il te manque c'est déplacer le colis du centre au camion AVANT que le camion parte (tu change donc de conteneur) => c'est le même principe, avant de rediriger, tu vas entrer les valeur contenu dans $_POST qui a une durée de vie limitée à la page destinataire dans le $_SESSION qui elle a une durée de vie identique à ta session.