2011-01-08 7 views
1

Ich mache eine Suchseite, wo der Benutzer entweder nach Geschäftsname oder den Tabellenzeilen cat1, cat2, cat3 suchen kann. Die Zeilen "cat" befinden sich in derselben Tabelle wie der Name des Geschäfts. Ich habe es so eingerichtet, dass ich Geschäftsinformationen zurückgebe, wenn ich nach dem richtigen Geschäft suche. Aber ich muss es Unternehmen anzeigen lassen, die den gesuchten Kategorienamen haben.Wie wählen Sie mehrere Felder basierend auf einer GET-Suche aus?

** Grundsätzlich, was ich frage, ist für eine Suche bekommen (php) entweder nach dem Namen von Unternehmen oder einer von drei Kategorien zu suchen.

Jede Hilfe wäre sehr ... hier klar sein, ist mein Code Falls Sie es brauchen (obwohl ich denke, das ist eine ziemlich einfache Aufgabe sein sollte, vielleicht auch nicht, obwohl, ich bin ein PHP-Anfänger)

  include('config.php'); 
      $var = $_REQUEST['search']; 
      $trimmed = trim($var); 
      $search = ucfirst($var); 


     $result = mysql_query("SELECT * FROM gj WHERE name like '%$search%' ORDER by name") or trigger_error(mysql_error()); 
     $num_rows = mysql_num_rows($result); 

Und dann verwende ich eine While-Schleife, um den gesamten Code daraus zu bekommen.

while($row = mysql_fetch_array($result)) 
     { 
     $id=$row['id']; 
     $name=$row['name']; 
     $phone=$row['phone']; 
     $website=$row['website']; 
     $city=$row['city']; 
     $address=$row['address1']; 
     $zipcode=$row['zipcode']; 
     $addressmap = preg_replace('/\s/', '+',$address); 
     $citymap = preg_replace('/\s/', '+',$city); 

     echo" 
+0

Sie müssen mysql_real_escape_string auf alle "nicht vertrauenswürdigen" Variablen verwenden, die Sie in SQL-Abfragen verwenden. Dies ist ein SQL-Injection-Angriff, der darauf wartet, ausgeführt zu werden. –

+0

Danke, ich habe das gerade gemacht! –

+0

sollten Sie auch '$ _GET' nicht' $ _REQUEST' verwenden – Prisoner

Antwort

2
include('config.php'); 
$searchfields = array('name', 'cat1', 'cat2', 'cat3',) 
$cleandata = mysql_real_escape_string(trim(strtolower($_REQUEST['search']))); 

$where = array(); 
foreach($searchfields as $field) { 
    $where[] = 'lcase('.$field.') like \'%.$cleandata.%\''; 
} 

$result = mysql_query('SELECT * FROM gj WHERE '.implode(' OR ', $where).' ORDER by name') or trigger_error(mysql_error()); 
$num_rows = mysql_num_rows($result); 

Ich habe eine variable Cleandata hinzugefügt, die die Anforderungsdaten enthalten gereinigt (SQL-Injektion zu verhindern).

Ich habe eine Variable Suchfelder erstellt, die leicht erweitert werden können, um auf mehr Felder zu suchen.

auf mehreren Feldern suchen einfach die Array-Daten erweitern:

$searchfields = array('name', 'cat1', 'cat2', 'cat3', 'cat4',) 

EDIT hinzugefügt Groß- und Kleinschreibung


EDIT Added PDO

Beachten Sie, dass seit ich dieses geschrieben habe Beantworten Sie die Gemeinde hat die deprecation process der altenbegonnen. Siehe die red box? Stattdessen sollten Sie über prepared statements lernen und entweder PDO oder MySQLi verwenden. Wenn Sie sich nicht entscheiden können, wird this article helfen zu wählen. Wenn Sie lernen möchten, here is a good PDO tutorial.

Ein Umschreiben der obigen Antwort mit PDO wie etwa wie folgt aussehen:

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); 
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$searchfields = array('name', 'cat1', 'cat2', 'cat3',) 

$where = array(); 
foreach($searchfields as $field) { 
    $where[] = 'lcase(' . $field . ') LIKE :keyword'; 
} 

$stmt = $dbConnection->prepare('SELECT * FROM gj WHERE ' . implode(' OR ', $where) . ORDER BY name); 
$stmt->execute(array(
    ':keyword' => '%' . trim(strtolower($_REQUEST['search'])) . '%', 
)); 
+1

Alter, du bist erstaunlich ... Vielen Dank. –

+0

Gern geschehen, Kumpel. NP – PeeHaa

-1

Lassen Sie uns sagen, Sie Bussines Namen ‚Jake‘ und Kategorie ‚php‘ gesucht werden soll. Identifikator Tabellenzeile
URL für Ihre Anfrage so ...

 
http://yourdomain.com/search.php?name=Jake&category=php 


werden Sie müssen einige Spalte haben, das ist einzigartig. In diesem Beispiel verwende ich die Spalte 'id'. Bearbeiten Sie es nach Ihren Bedürfnissen. Jetzt lässt richten Sie Ihre Abfrage ...

 
$query = "SELECT * FROM `gj` 
WHERE name LIKE '%{$_GET['name']}%' 
AND `gj.id` IN (
    SELECT id FROM test 
    WHERE 
     cat1 LIKE '%{$_GET['category']}%' OR 
     cat2 LIKE '%{$_GET['category']}%' OR 
     cat3 LIKE '%{$_GET['category']}%' 
    )"; 
    // or edit this cat1 LIKE '%{$_GET['category']}%' 
    // to cat1 = '{$_GET['category']}' 
    // if you want to compare exact values 


Mit dieser Abfrage von Daten aus DB abrufen

 
$result = mysql_query($query) or trigger_error(mysql_error()); 


jetzt tun, was Sie mit abgerufene Daten wollen.
Lassen Sie mich wissen, das Ergebnis ;-)

+0

danke! das hat wirklich geholfen. Du hast es wirklich ganz einfach gemacht –

+0

Matk es als eine akzeptierte Antwort, damit andere Leute es erkennen. Dies könnte jemand anderem helfen :) – Andreyco

+0

SQL Injection wartet auf – PeeHaa