2016-11-21 44 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();