你有一个通过下面传递字符串的函数;
getFilterResults($id, $limit, $misc);
在我的函数中,我连接到SQLite DB并根据传递的值构建查询,如此;
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'查询。显然,第一个非null的值返回开始于'WHERE ” ..
我可以看到漫长的方法是循环遍历每一个并构建 - 一旦发现第一个值 not null 并从那里开始,但这似乎不切实际且不是很好的练习。 / p>
//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();