Я пытаюсь выполнить следующий запрос:
SELECT nfc_film.title, nfc_film.film_id, nfc_film.description, nfc_film.release_year, nfc_film.rating, nfc_film.last_update, nfc_category.name
FROM nfc_film
JOIN nfc_film_category
ON nfc_film.film_id = nfc_film_category.film_id
JOIN nfc_category
ON nfc_film_category.category_id = nfc_category.category_id LIMIT 10 OFFSET 0
Это работает, если я помещаю его в «Браузер БД для SQLite», возвращаются правильные поля.
Но при попытке реализовать это на PHP это не работает:
$filmQuery = "
SELECT nfc_film.title, nfc_film.film_id, nfc_film.description, nfc_film.release_year, nfc_film.rating, nfc_film.last_update, nfc_category.name
FROM nfc_film
JOIN nfc_film_category
ON nfc_film.film_id = nfc_film_category.film_id
JOIN nfc_category
ON nfc_film_category.category_id = nfc_category.category_id ";
if ($search_term && $category){
$filmQuery .= "
WHERE
nfc_film.title LIKE :searchterm
AND
nfc_category.name = :category";
} else if ($search_term && !$category) {
$filmQuery .= "
WHERE
nfc_film.title LIKE :searchterm";
} else if (!$search_term && $category) {
$filmQuery .= "
WHERE
nfc_category.name = :category";
}
$filmQuery .= " LIMIT 10 OFFSET :page";
Когда ни category
, ни searchterm
не найдены, это разрешается:
SELECT nfc_film.title, nfc_film.film_id, nfc_film.description, nfc_film.release_year, nfc_film.rating, nfc_film.last_update, nfc_category.name
FROM nfc_film
JOIN nfc_film_category
ON nfc_film.film_id = nfc_film_category.film_id
JOIN nfc_category
ON nfc_film_category.category_id = nfc_category.category_id LIMIT 10 OFFSET :page
Затем я подготавливаю, связываю и выполняю запрос:
$sqlGetFilms = $dbConn->prepare($filmQuery);
$sqlGetFilms->bindParam(':searchterm', $sqlSearchTerm);
$sqlGetFilms->bindParam(':category', $category);
$sqlGetFilms->bindParam(':page', $page);
$sqlGetFilms->execute();
$query = $sqlGetFilms->fetchAll();
Когда ничего searchterm
и category
не найдено, возвращаются записи. Но любая другая ситуация, возникающая в этом коде, не возвращает никаких записей, даже если они появляются при запуске в «Браузере БД для SQLite».
Обновлено: Я пробовал хардкодить
SELECT nfc_film.title, nfc_film.film_id, nfc_film.description, nfc_film.release_year, nfc_film.rating, nfc_film.last_update, nfc_category.name
FROM nfc_film
JOIN nfc_film_category
ON nfc_film.film_id = nfc_film_category.film_id
JOIN nfc_category
ON nfc_film_category.category_id = nfc_category.category_id
WHERE
nfc_film.title LIKE '%k%' LIMIT 10 OFFSET 0
и ничего не вернули
Вы можете обнаружить, что когда вы используете только один или другой термин, вы получаете сообщение об ошибке, похожее на попытку привязки к несуществующей переменной.
Это (я думаю) зависит от того, где вы условно строите SQL, у вас может быть :searchterm
или :category
или оба, НО вы всегда пытаетесь привязаться к ним обоим.
Поэтому вместо этого, если есть значение для привязки, тогда привяжите каждый термин отдельно...
if (!empty($search_term)){
$sqlGetFilms->bindParam(':searchterm', $sqlSearchTerm);
}
if (!empty($category)) {
$sqlGetFilms->bindParam(':category', $category);
}