Bonjour, je reviens sur forum, car il m'a bien aidé la première fois. Débutant j'apprends tous les jours des nouvelles choses.
Question : Comment contrôler un select qui affiche le contenu d'une table, si on valide et que l'on n'a pas sélectionné un choix, ma question peut paraître bête, mais je suis un grand débutant.

"```"
<div class="container">
<?php
// on traite le formulaire
if (isset($_POST['categorie']) && !empty($_POST['categorie']))
{
// si on a saisi quelque chose, on traite

$cat = $_POST['categorie'];
// sql pour recuperer le libellé de la catégorie
$detail = $pdo->prepare('SELECT * FROM categorie WHERE id_cat = :id_cat');
$detail->execute(['id_cat' => $_POST['categorie']]);
if ($detail === false) {
die ('Erreur SQL');
}
$detail_cat = $detail->fetchALL();
// sql pour afficher tous les résultats de la requête
$sql ="SELECT id,username,email,nom_entreprise,code_postal,ville,categorie.categorie FROM membres INNER JOIN activite_pro on activite_pro.ref_membre=membres.id INNER join categorie on categorie.id_cat=activite_pro.ref_cat WHERE membres.ref_profil=2 AND categorie.id_cat=".$cat." ";
$req =$pdo->prepare($sql);
$req-> execute(array(".$cat."));
$count = $req->rowCount();
if($count !=0) // si le nombre de résultats est différent de 0, on continue
{
?>
<h3 class="text-info">Résultats de votre recherche</h3>
<p>
<h4 style="color:green">
<?php
echo $count ." "; // affiche le nombre
if($count >1) { echo 'résultats'; } else {echo 'résultat';}
?>
 dans notre base de données. Voici la liste : </h4>
<hr>
<?php
echo "<div class='col-sm-8'>";
echo "<table border='0' align='left' cellpadding='2' cellspacing='2' class='table'>";
echo "<thead>";
echo "<tr>";
echo " <th>Professionnel</th>";
echo "<th>Entreprise</th>";
echo "<th>Adresse</th>";
echo " <th> </th>";
echo "</tr>";
echo "</thead>";
echo "<tbody>";

while($data = $req->fetch(PDO::FETCH_OBJ))

{
     echo"<tr>"; 
    echo "<td>".$data->username."</td>";
    echo "<td>".$data->nom_entreprise."</td>";
    echo "<td>".$data->adresse_postale." &nbsp; ".$data->code_postal." &nbsp; ".$data->ville." </td>";
echo "<td align='center'><a href='#' onClick='PopupCentrer('goFiche.php?id= ".$data->id." ',600,800,'menubar=no,scrollbars=yes,statusbar=no')'>
<img src='img/info-pro.png' width='24' height='24' alt='Information' title ='Consulter la fiche' /></a></td>";
     echo "</tr>";
     ?>
    <?php
} // fin de boucle while
echo "</tbody>"; // fin du tbody
echo "</table>"; // fin de table
?>
    <br>
    <h4 align="left"><a class="btn-success btn-sm" href="les-professionnels-cat.php?id_msg=1">&nbsp;&nbsp;&nbsp;Faire une nouvelle recherche&nbsp;&nbsp;&nbsp; </a></h4>
    </p>
    <?

} // Fini d'afficher les résultats ! Maintenant, nous allons afficher l'éventuelle erreur en cas d'échec de recherche et le formulaire.
else
{ // de nouveau, un peu de HTML
?>
<h4>Désolé, aucun résultat n'a été trouvé pour la catégorie : <span style="color:red"><b><?= $detail_cat[0]->categorie ?></b></span></h4>
<p>
<h4 align="left"><a class="btn-success btn-sm" href="les-professionnels-cat.php?id_msg=1">   Faire une nouvelle recherche    </a></h4>
</p>
<h4>
<?php
}// fini d'afficher l'erreur
}else
{
?>
</h4>
<form action="les-professionnels-cat.php?id_msg=1" method="post" id="cherche" name="cherche">
<div class="row">
<div class="col-sm-4">
<select name="categorie" class="form-control" id="categorie" required>
<option>Choisir la Catégorie</option>
<?php foreach($categories as $categorie): ?>
<option value="<?= $categorie->id_cat ?>">
<?= $categorie->categorie ?>
</option>
<?php endforeach ?>
</select>
</div>
<div class="col-sm-4">
<input type="submit" value="Rechercher" class="btn-success btn-sm">
</div>
</div>
</form>
</div>
<?
}
?>
"```"

Je souhaite une message qui informe que l'utilisateur n'a pas fait de choix
ici une page test : https://jpvalls.fr/dev/contact-mb/les-professionnels-cat.php?id_msg=1

Si le choix n'est pas fait , j'obiens un message d'erreur :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'la Catégorie' at line 1' in /home/users3/h/hww2897/www/dev/contact-mb/les-professionnels-cat.php:58 Stack trace: #0 /home/users3/h/hww2897/www/dev/contact-mb/les-professionnels-cat.php(58): PDOStatement->execute(Array) #1 {main} thrown in /home/users3/h/hww2897/www/dev/contact-mb/les-professionnels-cat.php on line 58

la ligne 58 : $req-> execute(array(".$cat."));

Merci pour votre éclairage.
Cordialement
Jean-Pierre

3 réponses


Salut tu as plusieurs solution.

Soit tu met un peux de javascript et tu control la valeur de ton select

Si pas de value, tu place un disabled sur ton bouton Rechercher.

Soit tu le fait coté PHP en controllant la valeur de $_POST['categories']

Parce visiblement ton controlle if (isset($_POST['categorie']) && !empty($_POST['categorie'])) ne suffit pas

if (isset($_POST['categorie']) && !empty($_POST['categorie']) && $_POST['categorie'] !== ce que tu renvoie $_POST['categorie'] quand tu selectionne rien)

else tu leves une erreur que tu affiche coté front.

si tu var_dump($_POST['categorie']) sans rien selectionné ca te renvoie quoi ?

Merci pour cet éclairage, je testerai dès que possible(je suis parti qq jours), je te donnerai la réponse du var_dump.

j'ai fait un var_dump($_POST['categorie'])
ça donne cela:
string(21) "Choisir la Catégorie"
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'la Catégorie' at line 1' in /home/users3/h/hww2897/www/dev/contact-mb/les-professionnels-cat.php:59 Stack trace: #0 /home/users3/h/hww2897/www/dev/contact-mb/les-professionnels-cat.php(59): PDOStatement->execute(Array) #1 {main} thrown in /home/users3/h/hww2897/www/dev/contact-mb/les-professionnels-cat.php on line 59

ligne 59 => $req-> execute(array(".$cat."));