2009-12-15 6 views
0

mon code est ce,base de données recherche question PHP

$query = "SELECT * FROM `cars` WHERE (color LIKE '%". $key ."%' OR name LIKE '%". $key ."%') AND enabled = 'yes' ORDER BY `ID`"; 
base de données

est comme ce

ID  color  name  enabled 
---- ------  --------  --------- 
1  red  red car  yes 
2  blue  blue car  yes 
3  brown  brown car  yes 

r

quand je recherche avec la touche "rouge", il retourne premier champ (ID 1) mais si je recherche avec "voiture rouge" il ne retourne rien.

comment puis-je effectuer une recherche dans les 2 champs?

grâce

EDIT: i supports fixes mais je ne peux pas obtenir des résultats avec plus de 1 clés de mot.

fait l'essai avec pas de chance

$query = "SELECT * FROM `cars` WHERE (MATCH (color,name) AGAINST ('$key' IN BOOLEAN MODE)) AND enabled = 'yes' ORDER BY `ID`"; 

EDIT 2: Peter est juste. Il n'y a pas de problème dans la requête. bizarre chose est -je utiliser ce

$key = $_GET['key']; 

si $ _GET [ 'key'] est plus de 1 mot, clé $ est de retour à vide pour une raison.

+0

Il va sans dire que vous devriez faire attention à injection sql. – Joe

+1

Je ne pense pas que ce soit la cause, mais vous devriez vraiment mettre des parenthèses autour de vos critères WHERE. L'ordre dans lequel vos AND et ORs sont résolus peut ne pas être ce que vous attendez. –

Répondre

2

Je ne peux pas dupliquer votre erreur. Voici les étapes de mon

Nouvelle table

CREATE TABLE `cars` (
    `ID` int(10) unsigned NOT NULL auto_increment, 
    `color` varchar(45) NOT NULL, 
    `name` varchar(45) NOT NULL, 
    `enabled` varchar(45) NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

valeurs ensuite ajouté

INSERT INTO `cars` (`ID`, `color`, `name`, `enabled`) VALUES 
    (1,'red','red car','yes') 
, (2,'blue','blue car','yes') 
, (3,'brown','brown car','yes'); 

ensuite tester les requêtes

mysql> SELECT * FROM `cars` 
    -> WHERE (color LIKE '%red%' OR name LIKE '%red%') 
    -> AND enabled = 'yes' 
    -> ORDER BY `ID`; 
+----+-------+---------+---------+ 
| ID | color | name | enabled | 
+----+-------+---------+---------+ 
| 1 | red | red car | yes  | 
+----+-------+---------+---------+ 
1 row in set (0.00 sec) 

mysql> SELECT * FROM `cars` 
    -> WHERE (color LIKE '%red car%' OR name LIKE '%red car%') 
    -> AND enabled = 'yes' 
    -> ORDER BY `ID`; 
+----+-------+---------+---------+ 
| ID | color | name | enabled | 
+----+-------+---------+---------+ 
| 1 | red | red car | yes  | 
+----+-------+---------+---------+ 
1 row in set (0.00 sec) 

peut-être chercher ailleurs pour votre erreur

+0

Alors quel était le problème? –

+0

problème est $ key vient à vide est si $ _GET ['clé'] a plus de 1 mot: S –

0

Votre SQL est erroné:

$query = "SELECT * FROM `cars` WHERE (color LIKE '%". $key ."%' OR name LIKE '%". $key ."%') AND enabled = 'yes' ORDER BY `ID`"; 

Vous devez mettre de la couleur et le nom entre parenthèses, sinon vous risquez de vous trouver retournerez lignes lorsque le champ activé est faux.

+0

j'ai fixé cela, thx –

1

Vous pouvez utiliser une instruction préparée pour éviter l'injection SQL:

$statement = $db_connection->prepare("SELECT * FROM `cars` WHERE (color LIKE ? OR name LIKE ?) AND enabled = 'yes' ORDER BY `ID`"); 
$statement->bind_param("s", "%".$key."%"); 
$statement->execute(); 
+0

hey thx pour cela –

2

"EDIT 2: Peter a raison. Il n'y a pas de problème dans la requête. chose étrange est que j'utilise ce

$ key = $ _GET ['clé'];

si $ _GET [ 'key'] est plus que 1 mot, $ key est de retour à vide pour une raison. »

Comment passez dans le $ _GET vous? Utilisez-vous un formulaire ou il suffit de taper dans vos variables

blah.php?clé = test + et

PAS

blah.php? key = Test et

+0

oui c'était le problème, je le passe avec la fonction de charge de requête, que je me suis rendu compte que les espaces devraient être remplacés par + "alors j'ai utilisé la fonction de remplacement javascript et ça marche maintenant –