Tijdens zoeken werkt maar een filter

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Maurits laan

maurits laan

12/02/2021 22:31:02
Quote Anchor link
Beste PHPHulp, voor een school project ben ik bezig met een zoekfunctie, helaas werkt alleen de filter genre..

Dit is mijn code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
  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

Toevoeging op 12/02/2021 22:31:27:

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
  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
 
PHP hulp

PHP hulp

24/11/2024 09:15:08
 
- Ariën  -
Beheerder

- Ariën -

12/02/2021 23:17:40
Quote Anchor link
Echo eens je $sql, en je weet wat er voor SQL uitgevoerd wordt.
Gewijzigd op 12/02/2021 23:17:55 door - Ariën -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

13/02/2021 14:45:05
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?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();
}

?>
Gewijzigd op 14/02/2021 09:42:51 door Frank Nietbelangrijk
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.