2011-05-04 23 views
0

我有兩個下拉使用下面的代碼框:查詢使用兩個投箱在PHP

<form method="post" action="">  
      <select name='defect' value=''> 
       <option>Rotten</option> 
       <option>Split</option> 
       <option>WheelCut</option> 
       <option>Broken</option> 
       <option>Quality</option> 
      </select> 
         is equal to: 
      <select name='quality' value=''></option> 
       <option>1</option> 
       <option>2</option> 
       <option>3</option> 
       <option>4</option> 
      </select> 
     <input type="submit" name="query" value="Submit"> 
    </form> 

我試圖讓這個點擊提交按鈕後,它改變了下面的查詢...

SELECT id, mile, yard, gps_lat, gps_long, rotten, split, wheel_cut, broken, quality 
FROM database WHERE gps_lat IS NOT NULL AND ????? (e.g. broken=2) ORDER BY mile, yard 
  • 我如何將二者結合起來的用戶輸入(例如碎值= 2)
  • 我需要使用switch語句更改查詢每個可能?

任何意見將不勝感激!

乾杯,

尼爾

+0

你想用這個查詢來實現什麼? – Zirak 2011-05-04 09:41:27

回答

1

像這樣的事情?

<?php 
$sql = 'SELECT id, mile, yard, gps_lat, gps_long, rotten, split, wheel_cut, broken, quality 
FROM database WHERE gps_lat IS NOT NULL'; 

switch($_POST['defect']) 
{ 
     case 'Rotten': $defect = 'rotten'; break; 
     case 'Split': $defect = 'split'; break; 
     case 'WheelCut': $defect = 'wheel_cut'; break; 
     case 'Broken': $defect = 'broken'; break; 
     case 'Quality': $defect = 'quality'; break; 
     default: $defect = ''; break; 
} 

switch($_POST['quality']) 
{ 
     case 1: $quality = 1; break; 
     case 2: $quality = 2; break; 
     case 3: $quality = 3; break; 
     case 4: $quality = 4; break; 
     default: $quality = 0; break; 
} 

if($defect != '' && $quality != 0) 
{ 
    $sql .= ' AND '.$defect.' = '.$quality; 
} 

$sql .= ' ORDER BY mile, yard'; 
?> 

編輯做一個好一點

+0

感謝您的回覆gmadd!有效!歡呼聲, – happyneil 2011-05-08 14:07:12

+0

沒問題,很高興它的工作 – gmadd 2011-05-09 08:10:13

1

爲了避免硬編碼的邏輯,你可以將它移動到服務器端。很好的解決方案是使用動態SQL來構建過濾器查詢。您可以使用XML編寫存儲過程,其中將包含列名和過濾值。這裏就是你們的榜樣:

DECLARE @xml XML= '<root><select name="defect" value=""> 
       <option>Rotten</option> 
       <option>Split</option> 
       <option>WheelCut</option> 
       <option>Broken</option> 
       <option>Quality</option> 
      </select> 
      <select name="quality" value="" type="int"> 
       <option>2</option> 
      </select></root>' 
DECLARE @sSQL NVARCHAR(MAX) = 'SELECT id, mile, yard, gps_lat, gps_long, rotten, split, wheel_cut, broken, quality 
FROM database WHERE gps_lat IS NOT NULL' ; 
WITH c AS (SELECT a.b.value('../@name[1]', 'nvarchar(128)') ColumnName , 
         a.b.value('.', 'nvarchar(128)') VALUE , 
         a.b.value('../@type[1]', 'nvarchar(128)') [Type] 
       FROM  @xml.nodes('root/select/*') a (b) 
      ) 
    SELECT @sSQl = @sSQL + ' AND ' + c.ColumnName + '=' 
      + CASE WHEN ISNULL(c.TYPE, '') != 'int' THEN CHAR(39) 
        ELSE '' 
       END + c.VALUE 
      + CASE WHEN ISNULL(c.TYPE, '') != 'int' THEN CHAR(39) 
        ELSE '' 
       END 
    FROM c 
SET @sSQL = @sSQL + ' ORDER BY mile, yard' 
SELECT @sSQL 

結果將是:

SELECT id, mile, yard, gps_lat, gps_long, rotten, split, wheel_cut, broken, quality FROM database WHERE gps_lat IS NOT NULL AND defect='Rotten' AND defect='Split' AND defect='WheelCut' AND defect='Broken' AND defect='Quality' AND quality=2 ORDER BY mile, yard 

請注意,您可以建立過濾器,其中用戶可以檢查幾個複選框(在例如用戶將檢查「缺陷」的所有複選框)。通過這種方式,您可以準備您的應用程序以備將來使用

+0

謝謝你的回覆Dalex!我是PHP的初學者,你的解決方案相當複雜!感謝您的時間!乾杯 – happyneil 2011-05-08 14:09:52