Problème de recheche mysql php
Résoluglodybiss Messages postés 509 Statut Membre -
J'ai créer un champ de recherche qui cherche dans ma base des données mysql mais le problème est ce que lors de la recherche il ne trouve pas le texte saisie dans le champs de recherche il me trouve toute les données de ma base et quand tu saisies par exemple une données qui ne se trouve pas dans la data base il te sors toujours les données.
voici ma raquette.
Une aide s'il vous plait, je précise que je ne suis qu'un débutant en php
merci d'avance
if(isset($_GET['recherche'])){
extract($_GET);
$result = mysql_query( "SELECT id,'nom', 'prenom',postnom, 'adresse', service, adresse2 FROM cyb_site WHERE
site_name LIKE '%%' LIMIT 10");
//affichage des resultats
echo'<h4>Resultat de recherche</h4>';
echo '<table>';
echo '<tr>';
echo '<th class="td_seach_titre">N°</th>';
echo '<th class="td_seach_titre">nom</th>';
echo '<th class="td_seach_titre">prenom</th>';
echo '<th class="td_seach_titre">postnom</th>';
echo '<th class="td_seach_titre">adresse</th>';
echo '<th class="td_seach_titre">Adresse 2</th>';
echo '<th class="td_seach_titre">Service</th>';
echo '</tr>';
echo '</table>';
// affichage d'un message "pas de résultats"
if( mysql_num_rows( $result ) == 0 )
{
?>
<h3 style="text-align:center; margin:10px 0;">Pas de résultats pour cette recherche</h3>
- Problème de recheche mysql php
- Expert php - Télécharger - Langages
- Easy php - Télécharger - Divers Web & Internet
- Mysql community server - Télécharger - Bases de données
- Recheche image - Guide
- Ide php - Télécharger - Web & Internet
10 réponses
La recherche MySQL dans le champ de texte ne filtre pas correctement les résultats et retourne l’ensemble des enregistrements, même lorsque le mot recherché n’est pas présent. Des erreurs courantes incluent l’utilisation de guillemets autour des noms de colonnes dans SELECT et des conditions LIKE mal construites, ce qui empêche le filtrage et peut produire des valeurs inattendues. La solution consiste à construire dynamiquement la clause WHERE, en utilisant des conditions LIKE sur les champs pertinents (nom, prenom, adresse, service) et en évitant les chaînes littérales des colonnes. En pratique, on peut démarrer avec WHERE 1=1 et assembler les critères via un tableau de conditions, puis limiter le résultat avec LIMIT 10 et sécuriser les entrées avec mysql_real_escape_string.
C'est normal dans ta requete tu fait une selection sur le champs site_name avec un LIKE '%%'
Donc il te trouve toute tes lignes
Tu devrait faire plutot un truc du genre :
mysql_query( "SELECT id,'nom', 'prenom',postnom, 'adresse', service, adresse2 FROM cyb_site WHERE site_name LIKE '%".$_GET['recherche']."%' LIMIT 10");
Tu n'es plus un débutant maintenant, depuis le temps que tu postes ici ;-)
Comment veux-tu que ta requête effectue une recherche sachant que tu n'insères jamais dedans le contenu de ton champ de recherche :
$result = mysql_query( "SELECT id,'nom', 'prenom',postnom, 'adresse', service, adresse2 FROM cyb_site WHERE site_name LIKE '%%' LIMIT 10");
"%%" signifie "n'importe quoi" donc cela te renvoie toute la base.
Il faudrait faire :
$result = mysql_query( "SELECT id,'nom', 'prenom',postnom, 'adresse', service, adresse2 FROM cyb_site WHERE site_name LIKE '%".$_GET['recherche']."%' LIMIT 10");
Mais je devais être encore plus précis en posant cette question puisqu'il s'agit d'un champs de recherche multiple, c'est à dire qu'il y a pleins de champs a rechercher tu peux rechercher par nom, postnom, prénom, adresse, etc... alors quand tu saisies dans un champs et que l'autre n'est pas remplit il est quand même possible qu'il fasse la recherche mais dans mon cas il affcihe le message
if( mysql_num_rows( $result ) == 0 )
{
?>
<h3 style="text-align:center; margin:10px 0;">Pas de résultats pour cette recherche</h3>
En gros, si tu recherche le mot "bon", qu'il te trouve tous les résultats ou dans n'importe quel champs où le terme "bon" est présent (ex : le nom est "bondiman" ou l'adresse est "rue du grand bon de marsu)
C'est bien ça ??
C'est à dire que tu peux rechercher soit par le nom, par le prénom, par adresse ainsi de suite...
Voici le tableau de recherche.
<table width="480" border="0" class="right">
<tr>
<td class="recherche_text"><label for="nom">ID interne</label></td>
<td > <input type="text" name="nom" class="recherche" id="id_interne" value="<?php if (isset($_POST['nom'])) echo htmlentities(trim($_POST['nom'])); ?>"></td>
</tr>
<tr>
<td class="recherche_text"><label for="prenom" >prenom</label></td>
<td >
<input type="text" name="prenom" class="recherche" id="id_provider" value="<?php if (isset($_POST['prenom'])) echo htmlentities(trim($_POST['prenom'])); ?>"></td>
</tr>
<tr>
<td class="recherche_text"><label for="adresse">adresse</label></td>
<td >
<input type="text" name="matricule" class="recherche" id="nom_du_site" value="<?php if (isset($_POST['adresse'])) echo htmlentities(trim($_POST['adresse'])); ?>"></td>
</tr>
</table>
// **** Construction de la requete **** $req = "SELECT id,'nom', 'prenom',postnom, 'adresse', service, adresse2 FROM cyb_site WHERE 1=1 " //Le WHERE 1=1 permet de pas s'embeter à savoir si le WHERE a déjà été mis ou pas après dans les différents "if isset..." //Ajout de la recherche sur le nom s'il est renseigné if (isset($_POST['nom']) $req = $req & " AND nom LIKE '%".htmlentities(trim($_post['nom']."%' " //Ajout de la recherche sur le prenom s'il est renseigné if (isset($_POST['prenom']) $req = $req & " AND prenom LIKE '%".htmlentities(trim($_post['prenom']."%' " //Ajout de la recherche sur l'adresse si elle est renseignée if (isset($_POST['adresse']) $req = $req & " AND adresse LIKE '%".htmlentities(trim($_post['adresse']."%' " $req = $req & " LIMIT 10;" // **** Execution de la requete **** $result = mysql_query($req)
Perso, j'aurais vu un truc de ce genre.
Après, il y a peut-être quelques choses de plus optimisé ou plus simple... ;)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question<?php
//recherche des résultats dans la base de données$result = mysql_query( 'SELECT prenom
if(isset($_GET['recherche'])){
extract($_GET);
$req = "SELECT 'id', 'idsiteinterne', 'idsiteprovider', 'site_name', 'adresseIP', 'service' FROM cyb_site WHERE 1=1 ";
//Le WHERE 1=1 permet de pas s'embeter à savoir si le WHERE a déjà été mis ou pas après dans les différents "if isset..."
//Ajout de la recherche sur le idsiteinterne s'il est renseigné
if (isset($_POST['idsiteinterne'])) $req = $req & " AND idsiteinterne LIKE '%".htmlentities(trim($_post['idsiteinterne']))."%'";
//Ajout de la recherche sur le idsiteprovider s'il est renseigné
if (isset($_POST['idsiteprovider'])) $req = $req & " AND idsiteprovider LIKE '%".htmlentities(trim($_post['idsiteprovider']))."%'";
//Ajout de la recherche sur site_name si elle est renseignée
if (isset($_POST['site_name'])) $req = $req & " AND site_name LIKE '%".htmlentities(trim($_post['site_name']))."%' ";
if (isset($_POST['adresseIP'])) $req = $req & " AND adresseIP LIKE '%".htmlentities(trim($_post['adresseIP']))."%' ";
if (isset($_POST['service'])) $req = $req & " AND service LIKE '%".htmlentities(trim($_post['service']))."%' ";
$req = $req & " LIMIT 10";
echo'<h4>Resultat de recherche</h4>';
echo '<table>';
echo '<tr>';
echo '<th class="td_seach_titre">N°</th>';
echo '<th class="td_seach_titre">ID Provider</th>';
echo '<th class="td_seach_titre">ID Interne</th>';
echo '<th class="td_seach_titre">Etat du site</th>';
echo '<th class="td_seach_titre">Nom du site</th>';
echo '<th class="td_seach_titre">Adresse IP</th>';
echo '<th class="td_seach_titre">Service</th>';
echo '</tr>';
echo '</table>';
// affichage d'un message "pas de résultats"
if (mysql_num_rows($req))
{
?>
<h3 style="text-align:center; margin:10px 0;">Pas de résultats pour cette recherche</h3>
<?php
}
else
{
// parcours et affichage des résultats
while( $result = mysql_query($result))
{
?>
<div class="article-result">
<table>
<tr>
<td class="id"><?php echo $post->id; ?></td>
<td class="td_seach"><a href="accueil.php?view=24&u='.$row['id'].'""><?php echo $post->idsiteinterne; ?></a></td>
<td class="td_seach"><?php echo $post->idsiteprovider; ?></td>
<td class="td_seach"><?php echo $post->idetatsite; ?></td>
<td class="td_seach"><?php echo $post->site_name; ?></td>
<td class="td_seach"><?php echo $post->adresseIP; ?></td>
<td class="td_seach"><?php echo $post->service; ?></td>
</tr></table>
</table>
</div>
<?php
}
}
}
?>
// CONSTRUCTION DE LA REQUETE
$req = "SELECT id,'nom', 'prenom',postnom, 'adresse', service, adresse2 FROM cyb_site WHERE 1=1 ";
//Le WHERE 1=1 permet de pas s'embeter à savoir si le WHERE a déjà été mis ou pas après dans les différents "if isset..."
//Ajout de la recherche sur le nom s'il est renseigné
if (!empty($_POST['nom']))
{$req .= " AND nom LIKE '%".htmlentities(trim($_POST['nom']))."%' ";}
//Ajout de la recherche sur le prenom s'il est renseigné
if (!empty($_POST['prenom']))
{$req .=" AND prenom LIKE '%".htmlentities(trim($_POST['prenom']))."%' ";}
//Ajout de la recherche sur l'adresse si elle est renseignée
if (!empty($_POST['adresse']))
{$req .=" AND adresse LIKE '%".htmlentities(trim($_POST['adresse']))."%' ";}
$req .=" LIMIT 10;";
// **** Execution de la requete ****
$result = mysql_query($req);
J'ai utilisé un tableau
$where = array();
if (isset($_POST['idsiteinterne'])) {
$where[] = "idsiteinterne LIKE '%".mysql_real_escape_string(trim($_POST['idsiteinterne']))."%'";
}
if (isset($_POST['idsiteprovider'])) {
$where[] = "idsiteprovider LIKE '%".mysql_real_escape_string(trim($_POST['idsiteprovider']))."%'";
}
if (isset($_POST['idetatsite'])) {
$where[] = "idetatsite LIKE '%".mysql_real_escape_string(trim($_POST['idetatsite']))."%'";
}
if (isset($_POST['site_name'])) {
$where[] = "site_name LIKE '%".mysql_real_escape_string(trim($_POST['site_name']))."%'";
}
if (isset($_POST['adresseIP'])) {
$where[]= "adresseIP LIKE '%".mysql_real_escape_string(trim($_POST['adresseIP']))."%'";
}
if (isset($_POST['service'])) {
$where[] = "service LIKE '%".mysql_real_escape_string(trim($_POST['service']))."%'";
}
$sqlWhere = implode(' AND ', $where);
<?
$tableau = array();
$req = "SELECT id,'nom', 'prenom',postnom, 'adresse', service, adresse2 FROM cyb_site WHERE 1=1 ";
//Le WHERE 1=1 permet de pas s'embeter à savoir si le WHERE a déjà été mis ou pas après dans les différents "if isset..."
//Ajout de la recherche sur le nom s'il est renseigné
if (!empty($_POST['nom']))
{$tableau[] = "nom LIKE '%".htmlentities(trim($_POST['nom']))."%' ";}
//Ajout de la recherche sur le prenom s'il est renseigné
if (!empty($_POST['prenom']))
{$tableau[] ="prenom LIKE '%".htmlentities(trim($_POST['prenom']))."%' ";}
//Ajout de la recherche sur l'adresse si elle est renseignée
if (!empty($_POST['adresse']))
{$tableau[] = "adresse LIKE '%".htmlentities(trim($_POST['adresse']))."%' ";}
$req .= implode (" AND ",$tableau)." LIMIT 10;";
echo $req;
?>
$where = array();
if (!empty($_POST['idsiteinterne'])) { //si existe et pas vide
$where[] = "idsiteinterne LIKE '%".mysql_real_escape_string(trim($_POST['idsiteinterne']))."%'";
}
if (!empty($_POST['idsiteprovider'])) {
$where[] = "idsiteprovider LIKE '%".mysql_real_escape_string(trim($_POST['idsiteprovider']))."%'";
}
if (!empty($_POST['idetatsite'])) {
$where[] = "idetatsite LIKE '%".mysql_real_escape_string(trim($_POST['idetatsite']))."%'";
}
if (!empty($_POST['site_name'])) {
$where[] = "site_name LIKE '%".mysql_real_escape_string(trim($_POST['site_name']))."%'";
}
if (!empty($_POST['adresseIP'])) {
$where[]= "adresseIP LIKE '%".mysql_real_escape_string(trim($_POST['adresseIP']))."%'";
}
if (!empty($_POST['service'])) {
$where[] = "service LIKE '%".mysql_real_escape_string(trim($_POST['service']))."%'";
}
if(sizeof($where) >0) {
// tu mets dans ton post plus haut: "C'est à dire que tu peux rechercher soit par le nom, par le prénom, par adresse ainsi de suite..."
//donc a mon avis il faut des OR
$sqlWhere = ' WHERE '.implode(' OR ', $where); // et rajouter le WHERE
$reqette= "SELECT 'id', 'idsiteinterne', 'idsiteprovider', 'site_name', 'adresseIP', 'service' FROM cyb_site ".$sqlWhere;
//etc.....
}else{
echo 'Vous devez remplir au moins un des champs de recherche !';
}
echo 'Vous devez remplir au moins un des champs de recherche !';
De deux il me dit que toutes les variables que j'ai définie pour me permet d'afficher les résultats sont indéfinies
:
Notice: Undefined variable: post in C:\wamp\www\internetservices\sitemanage.php on line 81 jusqu'à la ligne 87
voici les codes
$req;
{
?>
<div class="article-result">
<table>
<tr>
<td class="id"><?php echo $post->id; ?></td>
<td class="td_seach"><?php echo $post->idsiteinterne; ?></td>
<td class="td_seach"><?php echo $post->idsiteprovider; ?></td>
<td class="td_seach"><?php echo $post->idetatsite; ?></td>
<td class="td_seach"><?php echo $post->site_name; ?></td>
<td class="td_seach"><?php echo $post->adresseIP; ?></td>
<td class="td_seach"><?php echo $post->service; ?></td>
</tr></table>
</table>
</div>
<?php
}
}
?>
toutes variables définies dans les td
Regarde ce que ça donne chez toi ;)
http://www.fufox.net/?d=ACAB3AA132A1