2011-01-08 4 views
1

私は、ユーザーがビジネス名またはテーブル行cat1、cat2、cat3で検索できる検索サイトを作っています。 「cat」の行は、ビジネス名と同じテーブルにあります。私はそれを設定しているので、私は正しいビジネスを検索するとビジネス情報を返します。しかし、検索したカテゴリ名のビジネスを表示する必要があります。GET検索に基づいて複数のフィールドを選択するにはどうすればよいですか?

**基本的に私が求めているのは、企業名または3つのカテゴリのいずれかを検索するための検索(PHP)です。

すべてのヘルプは、非常に高く評価されるだろう...ここで(私はこれはかなり簡単な作業をすべきだと思いますけれども、私はPHP初心者です、ではないけれども、多分、)あなたは

  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); 
それを必要とする場合には私のコードです

そして、whileループを使用して、すべてのコードを取得しています。

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

SQLクエリで使用するすべての "信頼できない"変数には、mysql_real_escape_stringを使用する必要があります。これは起こるのを待っているSQLインジェクション攻撃です。 –

+0

ありがとう私はちょうどそれをやった! –

+0

あなたは '$ _REQUEST'ではなく' $ _GET'も使用していなければなりません – Prisoner

答えて

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

私は(SQLインジェクションを防ぐために)洗浄リクエストデータを含む変数cleandataを追加しました。

私は変数フィールドを作成しました。このフィールドは、より多くのフィールドで簡単に検索することができます。

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

EDIT を追加しました大文字と小文字を区別しません


私はこれを書いているので、というEDIT追加PDO

注:単純に配列データを拡大し、より多くのフィールドでの検索に

コミュニティは古代ののdeprecation processを開始した答え3210。 red boxを参照してください。代わりにprepared statementsについて学び、PDOまたはMySQLiのいずれかを使用する必要があります。決定できない場合は、this articleが選択に役立ちます。あなたが学ぶ気になれば、here is a good PDO tutorial。 PDOを使用して上記の回答の

リライトは、次のようなもののようになります。

$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

おい、あなたはすごいです...どうもありがとう。 –

+0

あなたは歓迎です。 NP – PeeHaa

-1

あなたはタマン名 'ジェイクとカテゴリ「PHP」を検索したい、としましょう。あなたは、いくつかの列を持っている必要がありますあなたの要求のための
URLこのようになります...

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


は、テーブルの行の一意の識別子はthatsのです。この例では、 'id'カラムを使用します。あなたのニーズに合わせて編集してください。今、あなたは今


DB

 
$result = mysql_query($query) or trigger_error(mysql_error()); 
からデータを取得し、あなたが取得したデータでやりたい。このクエリでは...

 
$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 


をクエリを設定できます。
結果を教えてください

+0

ありがとう!これは本当に助けになった。あなたはそれを本当にかなり簡単にしました –

+0

それは受け入れられた答えとしてそれをMatkので、他の人はそれを認識します。これは他の誰かを助けるかもしれない:) – Andreyco

+0

SQLインジェクションが起こるのを待って – PeeHaa

関連する問題