2016-11-21 40 views
0

您好有一個函數,通過下面傳遞的字符串;SQLITE從傳遞的值構建查詢字符串

getFilterResults($id, $limit, $misc); 

在我的函數中,我連接到SQLite數據庫並基於傳遞的值構建一個查詢,就像這樣;

function getFilterResults($id, $limit, $misc) { 

    $dbConnect = new SQLite3(database); 
    if(!empty($limit) && !empty($id) && !empty($misc)){ 


     $buildString = ('SELECT * FROM fields ORDER BY id DESC'); 

     }else{ 

     //no params filters arrived so dont filter - aka get all results 
     $buildString = ("SELECT * FROM fields ORDER BY id DESC"); 

     } 

     $query = $dbConnect->query($buildString); 

     //... 



} 

問題是,我該如何構建查詢,如果某些值是空的,我必須決定哪些值使用「WHERE」 query..obviously第一個返回值不爲null的開始/啓動'WHERE'。

我可以看到很長的路要循環遍歷每一個並構建 - 一旦發現第一個值是非空並從那裏啓動,但這似乎不切實際且不好實踐。

//check if limit set.. 
    if($limit) { 
     $doLimit = 'LIMIT '.$limit.''; 
    } 

    WHERE 'id = '.id.' AND misc = '.$misc.' '.$doLimit.' 
+0

申請'!空( )'檢查每個變量並將其添加到相應的查詢中。 –

回答

1

你的函數採取在($id, $limit, $misc)真正阻止你能夠做任何事情比你已經是......我會建議使用預處理語句雖然

// Stores values for a prepared statement 
$values = []; 

$sqlite = new SQLite3(/* ... */); 

$query = 'SELECT * FROM fields WHERE id = ? AND misc = ? ORDER BY id DESC'; 
$values[] = $id; 
$values[] = $misc; 

if ($limit) { 
    $query .= ' LIMIT ?'; 
    $values[] = $limit; 
} 

// Use prepare and let SQLite3 escape the values for you 
$stmt = $sqlite->prepare($query); 
foreach ($values as $idx => $val) { 
    $stmt->bindValue($idx, $val); 
} 

$result = $stmt->execute();