Beste PHPHulp, voor een school project ben ik bezig met een zoekfunctie, helaas werkt alleen de filter genre..

Dit is mijn code:
  function filterFilms(){
    global $conn;
    $loop = 0;
    
        if(isset($_POST['titel']) && !empty($_POST['titel'])){
            $titel = sanatize($_POST['titel']);
        }

        if(isset($_POST['genre']) && !empty($_POST['genre'])){
            $genre = sanatize($_POST['genre']);
        }

        $sql = "SELECT TOP 20 *
                From
                 Movie Inner Join
                 Movie_Director On  Movie_Director.movie_id =  Movie.movie_id
                Inner Join
                 Movie_Genre On  Movie_Genre.movie_id =  Movie.movie_id
                Inner Join
                 Person On  Movie_Director.person_id =  Person.person_id";
        

        
 
        
        if(isset($titel) && !empty($titel)){
            if($loop == 0){
                $sql .= " WHERE ( title = ':titel' OR title like ':titel')";
                $loop++;
            }
            else{
                $sql .= " AND ( title = ':titel' OR title like ':titel')";
            }
        }

        
        
        if(isset($genre) && !empty($genre)){
            if($loop == 0){
                $sql .= " WHERE genre_name = :genre";
                $loop++;
            }
            else{
                $sql .= " AND genre_name = :genre";
            }
        }
        
        $query = $conn->prepare($sql);
     
        if(isset($titel) && !empty($titel)){
            $query->bindValue('titel', $titel,PDO::PARAM_STR);
        }

        if(isset($genre) && !empty($genre)){
            $query->bindParam('genre', $genre,PDO::PARAM_STR);
        }
        $query->execute();
        $rows = $query->fetchAll();
        return $rows;
        
    }


Mvg Maurits

[size=xsmall]Toevoeging op 12/02/2021 22:31:27:[/size]

Maurits laan op 12/02/2021 22:31:02

Beste PHPHulp, voor een school project ben ik bezig met een zoekfunctie, helaas werkt alleen de filter genre.. Bij de rest krijg ik geen resultaten...

Dit is mijn code:
  function filterFilms(){
    global $conn;
    $loop = 0;
    
        if(isset($_POST['titel']) && !empty($_POST['titel'])){
            $titel = sanatize($_POST['titel']);
        }

        if(isset($_POST['genre']) && !empty($_POST['genre'])){
            $genre = sanatize($_POST['genre']);
        }

        $sql = "SELECT TOP 20 *
                From
                 Movie Inner Join
                 Movie_Director On  Movie_Director.movie_id =  Movie.movie_id
                Inner Join
                 Movie_Genre On  Movie_Genre.movie_id =  Movie.movie_id
                Inner Join
                 Person On  Movie_Director.person_id =  Person.person_id";
        

        
 
        
        if(isset($titel) && !empty($titel)){
            if($loop == 0){
                $sql .= " WHERE ( title = ':titel' OR title like ':titel')";
                $loop++;
            }
            else{
                $sql .= " AND ( title = ':titel' OR title like ':titel')";
            }
        }

        
        
        if(isset($genre) && !empty($genre)){
            if($loop == 0){
                $sql .= " WHERE genre_name = :genre";
                $loop++;
            }
            else{
                $sql .= " AND genre_name = :genre";
            }
        }
        
        $query = $conn->prepare($sql);
     
        if(isset($titel) && !empty($titel)){
            $query->bindValue('titel', $titel,PDO::PARAM_STR);
        }

        if(isset($genre) && !empty($genre)){
            $query->bindParam('genre', $genre,PDO::PARAM_STR);
        }
        $query->execute();
        $rows = $query->fetchAll();
        return $rows;
        
    }

Iemand enig idee?
Mvg Maurits


Echo eens je $sql, en je weet wat er voor SQL uitgevoerd wordt.
In plaats van die $loop zou je ook een array kunnen nemen welke je dan door implode() haalt.

Ook denk ik dat je een filter-formulier zou moeten versturen in de GET method. Je (de gebruiker) krijgt dan een url in de navigatiebalk te zien welke hij kan delen en hergebruiken. Ook zijn de zoekresultaten dan terug te vinden in de history van de browser.

Ik zie niet de meerwaarde van

WHERE ( title = ':titel' OR title like ':titel'


title LIKE 'zoekterm%'

Hiermee kun je zoeken naar overeenkomsten die hetzelfde beginnen waarbij je ook een zoekindex op de kolom 'title' kunt zetten om veel sneller de resultaten op te halen. Dit werkt niet bij

title LIKE '%zoekterm' of title LIKE '%zoekterm%'

Die twee zijn altijd erg langzaam. In plaats daarvan zou je beter kunnen kijken naar een 'Full text search'.

fetchAll()

Gebruik deze functie enkel wanneer je zeker weet dat er slechts een beperkt aantal rijen geselecteerd worden zoals je nu doet met TOP 20. In dit geval dus prima.
<?php

// WAT INITIALISATIE
$titel = '';
$genre = '';

//
/*
* dit hoort niet in de filterfunctie thuis, het heeft niets te maken met het bouwen van een
* filter query. Iedere functie moet slechts één taak (of verantwoordelijkheid) hebben.
*/
if(isset($_GET['titel'])) {
$titel = sanatize($_GET['titel']);
}

if(isset($_GET['genre'])){
$genre = sanatize($_GET['genre']);
}

$rows = filterFilms($conn, $titel, $genre);

print_r($rows);

function filterFilms($conn, $title, $genre){
// global $conn; Vermijd het gebruik van global
$whereConditions = []; // Een array waarin we stukjes van het WHERE gedeelte opslaan
$params = []; // Een array met variabelen die aan de query willen binden

$sql = "SELECT TOP 20 *
From
Movie Inner Join
Movie_Director On Movie_Director.movie_id = Movie.movie_id
Inner Join
Movie_Genre On Movie_Genre.movie_id = Movie.movie_id
Inner Join
Person On Movie_Director.person_id = Person.person_id";

if($title != "") {
$whereConditions[] = "title LIKE :title"; //voorbeeld met LIKE
$params['title'] = $title . '%'; // let op we plakken een wildcard achter de titel
}

if($genre != "") {
$whereConditions[] = "genre_name = :genre"; // voorbeeld met =
$params['genre'] = $genre;
}

if(count($whereConditions)) {
// Bouw de where conditie met behulp van implode
$sql .= ' WHERE ' . implode(' AND ', $whereConditions);
}

// echo $sql . "<br>\n";

$query = $conn->prepare($sql);

foreach($params as $name => $value) {
// variabelen aan de query binden
$query->bindValue($name, $value);
}

$query->execute();

return $query->fetchAll();
}
?>

Reageren