Я использую PHP и PDO для получения данных из базы данных.
Я делаю запрос GET к файлу PHP. Параметры page
, category
и searchterm
.
Если category
или searchterm
пусты или не существуют, им будет присвоено значение пустой переменной.
page
представляет как номер страницы на странице поиска моего приложения, так и OFFSET
в операторе SQL. Это либо 0, либо кратное 10, в зависимости от параметра GET.
По какой-то причине, если у меня есть и значения searchterm
, и category
в запросе GET, тогда записи возвращаются, как и ожидалось. Но если какой-либо из них отсутствует, оператор SQL не возвращает никаких значений.
Я вывел точный запрос SQL к базе данных, а затем скопировал его в представление базы данных SQLite, и он вернул правильные значения. Я вывел на экран переменную $page
, и это именно то, что должно быть.
Я вывел $sqlSearchTerm
на экран (переменная, которая создается для добавления подстановочных знаков к поисковому запросу), и это именно то, что и должно быть.
Еще одно замечание: в зависимости от того, какие параметры GET получены, оператор SQL изменится. Я убедился, что это работает правильно.
Вот код, который в основном комментируется:
<?php
//Start Session
session_start();
//Require the database object
require('dbConn.php');
//Connect to database
$dbConn = SQLiteConnection::connect();
//If category is requested then set category to get, otherwise make category empty
if (!empty($_GET['category'])) {
$category = $_GET['category'];
} else {
$category = '';
}
//If searchterm is requested then set searchterm to get, otherwise make searchterm empty
if (!empty($_GET['searchterm'])) {
$search_term = $_GET['searchterm'];
$sqlSearchTerm = "%".$search_term."%";
} else {
$search_term = '';
$sqlSearchTerm = '';
}
//If page is requested then set page to get, otherwise make page 0
if (!empty($_GET['page'])){
$page = (int)$_GET['page'] * 10;
} else {
$page = 0;
}
//If user signed in then set $userEmail to session variable
if(isset($_SESSION['email'])){
$userEmail = $_SESSION['email'];
}
$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";
//Prepare SQL query for execution
$sqlGetFilms = $dbConn->prepare($filmQuery);
//Prepare count statement for execution
$sqlCountFilms = $dbConn->prepare(
"SELECT COUNT(*) FROM nfc_film
JOIN nfc_film_category
ON nfc_film.film_id = nfc_film_category.film_id
JOIN nfc_category
ON nfc_category.category_id = nfc_film_category.category_id
WHERE
nfc_film.title LIKE :searchterm
AND
nfc_category.name = :category
");
//Prepare actor statement for execution
$sqlGetActors = $dbConn->prepare(
"SELECT nfc_actor.first_name, nfc_actor.last_name FROM nfc_film_actor
JOIN nfc_actor
ON nfc_film_actor.actor_id = nfc_actor.actor_id
WHERE film_id = :film_id
");
//Prepare note statement for execution
$sqlGetNotes = $dbConn->prepare(
"SELECT user, film_id, comment, lastupdated FROM nfc_note
WHERE
film_id = :film_id
AND
user = :user
");
//Bind parameters to get films statement
$sqlGetFilms->bindParam(':searchterm', $sqlSearchTerm);
$sqlCountFilms->bindParam(':searchterm', $sqlSearchTerm);
$sqlGetFilms->bindParam(':category', $category);
$sqlCountFilms->bindParam(':category', $category);
$sqlGetFilms->bindParam(':page', $page);
//Execute get films query
$sqlGetFilms->execute();
$query = $sqlGetFilms->fetchAll();
//Execute count query
$sqlCountFilms->execute();
$countQuery = $sqlCountFilms->fetchAll();
//Add count value to query
$query[] = $countQuery[0];
//For every index in films query
for($i = 0; $i < (sizeof($query) - 1); $i++){
//Search for actors for that film
$sqlGetActors->bindParam(':film_id', $query[$i]['film_id']);
$sqlGetActors->execute();
$actors = $sqlGetActors->fetchAll();
//Convert film title to ucfirst formatting
$query[$i]['title'] = ucfirst(strtolower($query[$i]['title']));
//For every index in actors query
for ($j = 0; $j < sizeof($actors); $j++){
//Convert actor fname and lname to ucfirst formatting
$actors[$j]['first_name'] = ucfirst(strtolower($actors[$j]['first_name']));
$actors[$j]['last_name'] = ucfirst(strtolower($actors[$j]['last_name']));
}
//Push actors to film array
array_push($query[$i], $actors);
//Execute notes query
$sqlGetNotes->bindParam(':film_id', $query[$i]['film_id']);
$sqlGetNotes->bindParam(':user', $userEmail);
$sqlGetNotes->execute();
$notes = $sqlGetNotes->fetchAll();
//Push notes to films array
array_push($query[$i], $notes);
}
//convert films array to json
$query = json_encode($query, JSON_PRETTY_PRINT);
//Return film data
print_r($query);
?>
РЕДАКТИРОВАТЬ: Есть также две другие части кода, которые подсчитывают количество записей, а также получают «заметки» о фильмах, которые ищут.