2015-04-22 113 views
0

我有一個包含作業號字段(jobno)的表。該字段包含的數據看起來像'123456',或者它可能看起來像'345678 Acme'。網站的用戶將輸入一個工作號碼的請求。我沒有問題使用簡單的SELECT - WHERE - LIKE命令搜索並返回所需的數據。我的問題是,用戶希望現在能夠在他們的請求字段中輸入多個工作號碼。即:123456,34 5678.等等用多個值和可變數據進行SQL選擇

我該如何去創建一個選擇呢?我瞭解「WHERE jobno IN」的用法,這種方法適用於只有數字的工作號碼。但是,這不允許使用通配符,因此我無法返回「345678 Acme」等數據。此外,我不能使用一系列「或」,因爲我不知道用戶可能輸入多少個工作號碼進行搜索。

我希望這是足夠的解釋。任何幫助都會很棒。謝謝!

+0

使用'like'或'like',類似於'%a%'之類的字母或'%b%'之類的字母' – chris85

+1

您可以創建php中的動態sql然後在sql中執行或者您可以在sql中使用全文搜索 – HaveNoDisplayName

+0

** Acme ** - Wile E.會很自豪。 –

回答

0

您應該首先對用戶的輸入進行分解。 然後你可以做不同的選擇,你可以爲每個數字運行查詢,然後將所有結果行添加到數組中(你可以得到重複的結果),或者你可以隨時建立查詢。

例子:

// Input $_POST['jobNo'] = '123,1234,abc,abcde' 
$str = $_POST['jobNo']; 
$pieces = explode(',',$str); // returns array("123","1234","abc","abcd") 
$sql = "SELECT * FROM table WHERE ("; 
$i = 0; 
foreach($pieces as $piece) 
{ 
    if($i !== 0) 
     $sql .= 'OR '; 
    $sql .= "column LIKE '%". $piece ."%' "; 
    $i++; 
} 
if($i === 0) 
    $sql .= "1 = 1"; 

$sql .= ")"; 

// $sql = SELECT * FROM table WHERE (column LIKE '%123%' OR column LIKE '%1234%' OR column LIKE '%abc%' OR column LIKE '%abcd%') 
+0

只是想放棄一條線,並說明這個解決方案爲我解決。至今我還沒有嘗試其他解決方案。如果我有機會,我會嘗試並發表評論。謝謝大家的回覆! – vipertech927

0

你可以這樣做:

$jobs = "1234, 4567, 89abc"; //input string of jobno's 

$jobs = array_map(function($value) { 
    return "jobno LIKE '%" . trim($value) . "%'"; 
}, explode(",", $jobs)); 
$condition = implode(" OR ", $jobs); 

// condition will be: 
// "jobno LIKE '%1234%' OR jobno LIKE '%4567%' OR jobno LIKE '%89abc%' 
0

選項1:查詢動態手術室:

$searchTerms = mysqli_real_escape_string($conn, $_POST['search']); 
$where = []; 
foreach (explode(",", $searchTerms) as $term) { 
    $where[] = "job = '".trim($term)."'"; 
} 
$query = "SELECT * FROM jobs WHERE ".implode(" OR ", $where); 
// => SELECT * FROM jobs WHERE job = '123456' OR job = '345678 Acme' 

選項2:正則表達式

$searchTerms = mysqli_real_escape_string($conn, $_POST['search']); 
$where = array_map("trim", explode(",", $searchTerms)); 
$query = "SELECT * FROM jobs WHERE job REGEXP '^(".implode("|", $where).")$'"; 
// => SELECT * FROM jobs WHERE job REGEXP '^(123456|345678 Acme)$' 

根據需要進行精確匹配或鬆散匹配調整