Параметры привязки предназначены только для простых литералов , поэтому вы не можете связывать такие вещи, как имена таблиц и столбцов (идентификаторы) или IN
предложения (списки литералов).
То, что вы хотите, не может быть простым способом.
Что вы действительно должны сделать, это использовать другой запрос:
function get_hunts($public=null) {
// assuming hunts.public is defined as NOT NULL
$sql = "SELECT * FROM hunts WHERE user_id=:user";
if ($public!==null) {
$sql .= ' AND public=:public';
}
$sth = $this->_db->prepare($sql);
$sth->bindParam(':user', $this->_id);
if ($public!==null) {
$sth->bindParam(':public', $public, PDO::PARAM_INT);
}
$sth->execute();
return $sth->fetchAll(PDO::FETCH_ASSOC);
}
Если вы действительно не хотите использовать другой запрос, вы можете использовать хакерское решение с выражением CASE
.
SELECT * FROM hunts WHERE user_id=:user
AND public=
CASE :public WHEN 0 THEN 0 WHEN 1 THEN 1 ELSE public END
Если значение, которое вы связываете, не равно 0 или 1, условие WHERE
потребует, чтобы public
был равен самому себе и, следовательно, всегда был истинным. В противном случае используется значение :public
.