SQL не возвращает записи - PullRequest
0 голосов
/ 25 мая 2019

Я использую 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);
    ?>

РЕДАКТИРОВАТЬ: Есть также две другие части кода, которые подсчитывают количество записей, а также получают «заметки» о фильмах, которые ищут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...