Tijdens zoeken werkt maar een filter
Dit is mijn code:
Code (php)
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
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;
}
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:
Iemand enig idee?
Mvg Maurits
Dit is mijn code:
Code (php)
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
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;
}
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
Gewijzigd op 12/02/2021 23:17:55 door - Ariën -
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
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)
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
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();
}
?>
// 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