veritabanı arama soru PHP

4 Cevap php

benim kod bu,

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

veritabanı, bu gibi

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

r

i ile arama yaparken anahtar "kırmızı" ilk alan (ID 1) verir ama "kırmızı araba" ile aramak eğer hiçbir şey döndürür.

ben nasıl 2 alan hem de arama yapabilirsiniz?

teşekkürler

DÜZENLEME: i parantez sabit ama yine de ben fazla 1 kelime tuşları ile sonuç alınamıyor.

Şans hayır ile çalıştı

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

EDIT 2: Peter is right. There is no problen in query. weird thing is i use this

$key = $_GET['key'];

$ _GET ['key'] fazla 1 kelime ise, $ anahtar bir nedenle boş döner olduğunu.

4 Cevap

Ben senin hata yinelenen olamaz. İşte ben aldı adımlar var

Yeni tablo

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;

Daha sonra ilave değerler

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

Sonra sorguları test

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)

Belki hata başka yerde aramak

"EDIT 2: Peter is right. There is no problen in query. weird thing is i use this

$ Anahtar = $ _GET ['key'];

if $_GET['key'] is more than 1 word, $key is returns empty for a reason."

Nasıl $ _GET geçiyoruz? Bir formu kullanarak ya da sadece değişkenler yazarak

blah.php? key = testi + ve

DEĞİL

blah.php? key = testi ve

SQL enjeksiyonu önlemek için hazırlanmış bir ifadeyi kullanabilirsiniz:

$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();

SQL yanlış:

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

Aksi takdirde etkin alan yanlış olduğunda satırları dönecektir bulabilirsiniz, köşeli parantez içinde renk ve adını koymak gerekir.