[mysqli] DATA_FORMAT + LIKE geeft geen resultaten
Ik ben bezig met het maken van een website. Met halen van gegevens uit de database ben ik tegen een probleem aangelopen. Het is de bedoeling dat er gegevens uit komen die voldoen aan bepaalde eisen zoals begin letter van titel is A, jaar waar in het gepost is 2009 enzovoort.
Dit is de code die ik tot nu toe heb.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
$nieuws_sqli = $mysqli->query("
SELECT id, datum, titel, categorie
FROM nieuws
WHERE categorie LIKE '%".$_GET['cat']."%'
AND DATE_FORMAT(datum, '%m') LIKE '".$_GET['month']."'
AND DATE_FORMAT(datum, '%Y') LIKE '".$_GET['year']."'
AND titel LIKE '".$_GET['alfabet']."%'
AND status='1'");
while($nieuws = $nieuws_sqli->fetch_object())
{
\\resultaten
}
SELECT id, datum, titel, categorie
FROM nieuws
WHERE categorie LIKE '%".$_GET['cat']."%'
AND DATE_FORMAT(datum, '%m') LIKE '".$_GET['month']."'
AND DATE_FORMAT(datum, '%Y') LIKE '".$_GET['year']."'
AND titel LIKE '".$_GET['alfabet']."%'
AND status='1'");
while($nieuws = $nieuws_sqli->fetch_object())
{
\\resultaten
}
Ik heb al een beetje uitgeprobeerd waar het fout ging. Bij de DATA_FORMAT gaat het fout, geen idee waarom.
Alvast bedankt voor de hulp :)
Gewijzigd op 01/01/1970 01:00:00 door Guido S
Nooit input van de users direct in de query zetten.
Dat snap ik ;) De gegevens worden gecontroleerd voor dat ze in de query gezet worden. Heb het alleen er niet bij gezet, anders werd de code te lang.
Iemand enig idee waarom het geen resultaten geeft?
Edit: Ik een andere manier geprobeerd maar dit werkt helaas ook niet :(
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$nieuws_sqli = $mysqli->query("
SELECT id, datum, titel, categorie
FROM nieuws
WHERE categorie LIKE '%".$_GET['cat']."%'
AND MONTH(datum)='".$_GET['month']."'
AND YEAR(datum)='".$_GET['year']."'
AND titel LIKE '".$_GET['alfabet']."%'
AND status='1'");
SELECT id, datum, titel, categorie
FROM nieuws
WHERE categorie LIKE '%".$_GET['cat']."%'
AND MONTH(datum)='".$_GET['month']."'
AND YEAR(datum)='".$_GET['year']."'
AND titel LIKE '".$_GET['alfabet']."%'
AND status='1'");
Gewijzigd op 01/01/1970 01:00:00 door Guido S
Niemand? Ik zit namelijk nog steeds met het probleem :(
(Je tweede, laatste poging lijkt mij tot nu toe de beste optie, ik denk dat DATE_FORMAT redelijk langzaam is. Misschien dat iets in de richting van
ook kan en sneller is wanneer je een index op datum zet)
DIt is alleen wel erg onveilig. Want je gooit directe gets in je query... Ook al valideer je ze.
In ieder geval zou ik die gets in variablen plaatsen, en die gets uitlezen met een
je kunt bijv. $var ($_GET['alfabet'],0,1);
doen, dan heb je de eeste letter van je GET alfabet, enz enz
PHP geeft geen een foutmelding. Dat dacht ik dus ook :P Maar niet dus...
Ik ga jou manier even proberen. Dat zal wel moeten werken.
@Merij
De gegevens worden gestuurd als 1, 2, 3 t/m 12. Wat jij zei is inderdaad misschien een probleem. Alleen dan snap ik niet waarom November ook niet werkt. Want dat bestaat uit twee cijfers.
Je checkt nergens of de query wel is gelukt.
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
if(isset($_GET['cat'], $_GET['month'], $_GET['year'], $_GET['alfabet']))
{
$_GET['cat'] = trim(htmlspecialchars($_GET['cat']));
(in_array($_GET['cat'], array('', 'televisie', 'film'))) ? $_GET['cat'] = $_GET['cat'] : $_GET['cat'] = "";
$_GET['month'] = trim(htmlspecialchars($_GET['month']));
if(is_numeric($_GET['month']))
{
if($_GET['month'] >= "1" AND $_GET['month'] <= "12")
{
$_GET['month'] = $_GET['month'];
}
else{
$_GET['month'] = "";
}
}
else{
$_GET['month'] = "";
}
$_GET['year'] = trim(htmlspecialchars($_GET['cat']));
if(is_numeric($_GET['year']))
{
if($_GET['year'] >= "2008" AND $_GET['year'] <= date('Y'))
{
$_GET['year'] = $_GET['month'];
}
else{
$_GET['year'] = "";
}
}
else{
$_GET['year'] = "";
}
$_GET['alfabet'] = trim(htmlspecialchars($_GET['alfabet']));
(in_array($_GET['alfabet'], array('', '0-9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'))) ? $_GET['alfabet'] = $_GET['alfabet'] : $_GET['alfabet'] = "";
$sort = true;
$count = $mysqli->query("SELECT id, datum, titel, categorie FROM nieuws WHERE categorie LIKE '%".$_GET['cat']."%' AND MONTH(datum)='".$_GET['month']."' AND YEAR(datum)='".$_GET['year']."' AND titel LIKE '".$_GET['alfabet']."%' AND status='1'");
}
else{
$count = $mysqli->query("SELECT id FROM nieuws WHERE status='1'");
}
$threads = $count->num_rows;
$thread_limit = "10";
$paginas = ceil($threads/$thread_limit);
if(is_numeric($_GET['p']) AND $_GET['p'] > "1")
{
if($_GET['p'] > $paginas)
{
$_GET['p'] = '1';
$start = '0';
$eind = $thread_limit;
}
else{
$start = $_GET['p']*$thread_limit-$thread_limit;
$eind = $thread_limit;
}
}
else{
$_GET['p'] = '1';
$start = '0';
$eind = $thread_limit;
}
if($sort)
{
$nieuws_sqli = $mysqli->query("SELECT id, auteur, auteur_id, datum, DATE_FORMAT(datum, '%d-%m-%Y %H:%i') AS datum2, titel, discussie_id, discussie_reacties, categorie, artikel, SUBSTR(artikel, 1, 350) AS artikelshort, bron FROM nieuws WHERE categorie LIKE '%".$_GET['cat']."%' AND MONTH(datum)='".$_GET['month']."' AND YEAR(datum)='".$_GET['year']."' AND titel LIKE '".$_GET['alfabet']."%' AND status='1' ORDER BY datum2 DESC LIMIT ".$start.", ".$eind." ");
}
else{
$nieuws_sqli = $mysqli->query("SELECT id, auteur, auteur_id, datum, DATE_FORMAT(datum, '%d-%m-%Y %H:%i') AS datum2, titel, discussie_id, discussie_reacties, artikel, SUBSTR(artikel, 1, 350) AS artikelshort, bron FROM nieuws WHERE status='1' ORDER BY datum2 DESC LIMIT ".$start.", ".$eind." ");
}
if($threads > 0)
{
while($nieuws = $nieuws_sqli->fetch_object())
{
//Resultaten
}
}
else{
echo "Geen resultaten.";
}
{
$_GET['cat'] = trim(htmlspecialchars($_GET['cat']));
(in_array($_GET['cat'], array('', 'televisie', 'film'))) ? $_GET['cat'] = $_GET['cat'] : $_GET['cat'] = "";
$_GET['month'] = trim(htmlspecialchars($_GET['month']));
if(is_numeric($_GET['month']))
{
if($_GET['month'] >= "1" AND $_GET['month'] <= "12")
{
$_GET['month'] = $_GET['month'];
}
else{
$_GET['month'] = "";
}
}
else{
$_GET['month'] = "";
}
$_GET['year'] = trim(htmlspecialchars($_GET['cat']));
if(is_numeric($_GET['year']))
{
if($_GET['year'] >= "2008" AND $_GET['year'] <= date('Y'))
{
$_GET['year'] = $_GET['month'];
}
else{
$_GET['year'] = "";
}
}
else{
$_GET['year'] = "";
}
$_GET['alfabet'] = trim(htmlspecialchars($_GET['alfabet']));
(in_array($_GET['alfabet'], array('', '0-9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'))) ? $_GET['alfabet'] = $_GET['alfabet'] : $_GET['alfabet'] = "";
$sort = true;
$count = $mysqli->query("SELECT id, datum, titel, categorie FROM nieuws WHERE categorie LIKE '%".$_GET['cat']."%' AND MONTH(datum)='".$_GET['month']."' AND YEAR(datum)='".$_GET['year']."' AND titel LIKE '".$_GET['alfabet']."%' AND status='1'");
}
else{
$count = $mysqli->query("SELECT id FROM nieuws WHERE status='1'");
}
$threads = $count->num_rows;
$thread_limit = "10";
$paginas = ceil($threads/$thread_limit);
if(is_numeric($_GET['p']) AND $_GET['p'] > "1")
{
if($_GET['p'] > $paginas)
{
$_GET['p'] = '1';
$start = '0';
$eind = $thread_limit;
}
else{
$start = $_GET['p']*$thread_limit-$thread_limit;
$eind = $thread_limit;
}
}
else{
$_GET['p'] = '1';
$start = '0';
$eind = $thread_limit;
}
if($sort)
{
$nieuws_sqli = $mysqli->query("SELECT id, auteur, auteur_id, datum, DATE_FORMAT(datum, '%d-%m-%Y %H:%i') AS datum2, titel, discussie_id, discussie_reacties, categorie, artikel, SUBSTR(artikel, 1, 350) AS artikelshort, bron FROM nieuws WHERE categorie LIKE '%".$_GET['cat']."%' AND MONTH(datum)='".$_GET['month']."' AND YEAR(datum)='".$_GET['year']."' AND titel LIKE '".$_GET['alfabet']."%' AND status='1' ORDER BY datum2 DESC LIMIT ".$start.", ".$eind." ");
}
else{
$nieuws_sqli = $mysqli->query("SELECT id, auteur, auteur_id, datum, DATE_FORMAT(datum, '%d-%m-%Y %H:%i') AS datum2, titel, discussie_id, discussie_reacties, artikel, SUBSTR(artikel, 1, 350) AS artikelshort, bron FROM nieuws WHERE status='1' ORDER BY datum2 DESC LIMIT ".$start.", ".$eind." ");
}
if($threads > 0)
{
while($nieuws = $nieuws_sqli->fetch_object())
{
//Resultaten
}
}
else{
echo "Geen resultaten.";
}
Als hij 0 resultaten geeft mag ik aannemen dat de query mislukt is?
Gewijzigd op 01/01/1970 01:00:00 door Guido S
Guido schreef op 19.02.2009 14:07:
Als hij 0 resultaten geeft mag ik aannemen dat de query mislukt is?
Dat is dus niet waar.
Query mislukt => Moet opgevangen worden door foutafhandeling
Query gelukt => Geeft 0 of meer resultaten
Dus 0 is ook een resultaat van een gelukte query.
Maar ik heb de query getest zonder MONTH() en YEAR() en nu geeft hij dus wel gewoon resultaten zoals het hoort.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$count = $mysqli->query("
SELECT id, datum, titel, categorie
FROM nieuws
WHERE categorie LIKE '%".$_GET['cat']."%'
AND titel LIKE '".$_GET['alfabet']."%'
AND status='1'");
SELECT id, datum, titel, categorie
FROM nieuws
WHERE categorie LIKE '%".$_GET['cat']."%'
AND titel LIKE '".$_GET['alfabet']."%'
AND status='1'");
Er zit dus een fout in de datum.
Gewijzigd op 01/01/1970 01:00:00 door Guido S
En datum is uiteraard een DATE of DATETIME veld.
Gewijzigd op 01/01/1970 01:00:00 door Guido S
Lees de post van Jelmer nog eens door.
Die oplossing werkt, nu alleen een probleem met die query.
Hij is niet specifiek genoeg. Als ik het haar 2009 wil hebben neemt hij ook 2008 mee. Zodra ik er $year-$month- van maak is hij wel specifiek genoeg.
42 t/m 63 zijn de belangrijkste regels in de code voor het selecteren op datum.
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
if(isset($_GET['cat'], $_GET['month'], $_GET['year'], $_GET['alfabet']))
{
$_GET['cat'] = trim(htmlspecialchars($_GET['cat']));
(in_array($_GET['cat'], array('', 'televisie', 'film'))) ? $_GET['cat'] = $_GET['cat'] : $_GET['cat'] = "";
$_GET['month'] = trim(htmlspecialchars($_GET['month']));
if(is_numeric($_GET['month']))
{
if($_GET['month'] >= "1" AND $_GET['month'] <= "12")
{
if(strlen($_GET['month']) == "1")
{
$_GET['month'] = "0".$_GET['month'];
}
else{
$_GET['month'] = $_GET['month'];
}
}
else{
$_GET['month'] = "";
}
}
else{
$_GET['month'] = "";
}
$_GET['year'] = trim(htmlspecialchars($_GET['cat']));
if(is_numeric($_GET['year']))
{
if($_GET['year'] >= "2008" AND $_GET['year'] <= date('Y'))
{
$_GET['year'] = $_GET['year'];
}
else{
$_GET['year'] = "";
}
}
else{
$_GET['year'] = "";
}
if(!empty($_GET['month']) AND !empty($_GET['year']))
{
$data_ch = $_GET['year']."-".$_GET['month']."-";
}
else{
if(!empty($_GET['month']))
{
$data_ch = "-".$_GET['month']."-";
}
elseif(!empty($_GET['year'])){
$data_ch = $_GET['year']."-";
}
else{
$data_ch = "";
}
}
$_GET['alfabet'] = trim(htmlspecialchars($_GET['alfabet']));
(in_array($_GET['alfabet'], array('', '0-9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'))) ? $_GET['alfabet'] = $_GET['alfabet'] : $_GET['alfabet'] = "";
$sort = true;
$count = $mysqli->query("SELECT id, datum, titel, categorie FROM nieuws WHERE categorie LIKE '%".$_GET['cat']."%' AND datum LIKE '%".$data_ch."%' AND titel LIKE '".$_GET['alfabet']."%' AND status='1'");
}
else{
$count = $mysqli->query("SELECT id FROM nieuws WHERE status='1'");
}
$threads = $count->num_rows;
$thread_limit = "10";
$paginas = ceil($threads/$thread_limit);
if(is_numeric($_GET['p']) AND $_GET['p'] > "1")
{
if($_GET['p'] > $paginas)
{
$_GET['p'] = '1';
$start = '0';
$eind = $thread_limit;
}
else{
$start = $_GET['p']*$thread_limit-$thread_limit;
$eind = $thread_limit;
}
}
else{
$_GET['p'] = '1';
$start = '0';
$eind = $thread_limit;
}
if($sort)
{
$nieuws_sqli = $mysqli->query("SELECT id, auteur, auteur_id, datum, DATE_FORMAT(datum, '%d-%m-%Y %H:%i') AS datum2, titel, discussie_id, discussie_reacties, categorie, artikel, SUBSTR(artikel, 1, 350) AS artikelshort, bron FROM nieuws WHERE categorie LIKE '%".$_GET['cat']."%' AND datum LIKE '%".$data_ch."%' AND titel LIKE '".$_GET['alfabet']."%' AND status='1' ORDER BY datum2 DESC LIMIT ".$start.", ".$eind." ");
}
else{
$nieuws_sqli = $mysqli->query("SELECT id, auteur, auteur_id, datum, DATE_FORMAT(datum, '%d-%m-%Y %H:%i') AS datum2, titel, discussie_id, discussie_reacties, artikel, SUBSTR(artikel, 1, 350) AS artikelshort, bron FROM nieuws WHERE status='1' ORDER BY datum2 DESC LIMIT ".$start.", ".$eind." ");
}
if($threads > 0)
{
while($nieuws = $nieuws_sqli->fetch_object())
{
//resultaat
}
}
else{
echo "Geen resultaten.";
}
{
$_GET['cat'] = trim(htmlspecialchars($_GET['cat']));
(in_array($_GET['cat'], array('', 'televisie', 'film'))) ? $_GET['cat'] = $_GET['cat'] : $_GET['cat'] = "";
$_GET['month'] = trim(htmlspecialchars($_GET['month']));
if(is_numeric($_GET['month']))
{
if($_GET['month'] >= "1" AND $_GET['month'] <= "12")
{
if(strlen($_GET['month']) == "1")
{
$_GET['month'] = "0".$_GET['month'];
}
else{
$_GET['month'] = $_GET['month'];
}
}
else{
$_GET['month'] = "";
}
}
else{
$_GET['month'] = "";
}
$_GET['year'] = trim(htmlspecialchars($_GET['cat']));
if(is_numeric($_GET['year']))
{
if($_GET['year'] >= "2008" AND $_GET['year'] <= date('Y'))
{
$_GET['year'] = $_GET['year'];
}
else{
$_GET['year'] = "";
}
}
else{
$_GET['year'] = "";
}
if(!empty($_GET['month']) AND !empty($_GET['year']))
{
$data_ch = $_GET['year']."-".$_GET['month']."-";
}
else{
if(!empty($_GET['month']))
{
$data_ch = "-".$_GET['month']."-";
}
elseif(!empty($_GET['year'])){
$data_ch = $_GET['year']."-";
}
else{
$data_ch = "";
}
}
$_GET['alfabet'] = trim(htmlspecialchars($_GET['alfabet']));
(in_array($_GET['alfabet'], array('', '0-9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'))) ? $_GET['alfabet'] = $_GET['alfabet'] : $_GET['alfabet'] = "";
$sort = true;
$count = $mysqli->query("SELECT id, datum, titel, categorie FROM nieuws WHERE categorie LIKE '%".$_GET['cat']."%' AND datum LIKE '%".$data_ch."%' AND titel LIKE '".$_GET['alfabet']."%' AND status='1'");
}
else{
$count = $mysqli->query("SELECT id FROM nieuws WHERE status='1'");
}
$threads = $count->num_rows;
$thread_limit = "10";
$paginas = ceil($threads/$thread_limit);
if(is_numeric($_GET['p']) AND $_GET['p'] > "1")
{
if($_GET['p'] > $paginas)
{
$_GET['p'] = '1';
$start = '0';
$eind = $thread_limit;
}
else{
$start = $_GET['p']*$thread_limit-$thread_limit;
$eind = $thread_limit;
}
}
else{
$_GET['p'] = '1';
$start = '0';
$eind = $thread_limit;
}
if($sort)
{
$nieuws_sqli = $mysqli->query("SELECT id, auteur, auteur_id, datum, DATE_FORMAT(datum, '%d-%m-%Y %H:%i') AS datum2, titel, discussie_id, discussie_reacties, categorie, artikel, SUBSTR(artikel, 1, 350) AS artikelshort, bron FROM nieuws WHERE categorie LIKE '%".$_GET['cat']."%' AND datum LIKE '%".$data_ch."%' AND titel LIKE '".$_GET['alfabet']."%' AND status='1' ORDER BY datum2 DESC LIMIT ".$start.", ".$eind." ");
}
else{
$nieuws_sqli = $mysqli->query("SELECT id, auteur, auteur_id, datum, DATE_FORMAT(datum, '%d-%m-%Y %H:%i') AS datum2, titel, discussie_id, discussie_reacties, artikel, SUBSTR(artikel, 1, 350) AS artikelshort, bron FROM nieuws WHERE status='1' ORDER BY datum2 DESC LIMIT ".$start.", ".$eind." ");
}
if($threads > 0)
{
while($nieuws = $nieuws_sqli->fetch_object())
{
//resultaat
}
}
else{
echo "Geen resultaten.";
}
Ik ben naar mijn werken. Ik reageer vanavond weer.
Alvast bedankt voor de hulp :)
Gewijzigd op 01/01/1970 01:00:00 door Guido S
Echo de query eens, dan kun je wat zien.
Jelmer schreef op 18.02.2009 23:04:
ik denk dat DATE_FORMAT redelijk langzaam is.
Ik vermoed het ook, er moet een datum worden omgezet naar een string.
Quote:
en sneller is wanneer je een index op datum zet)
Ik waag het te betwijfelen, je controleert tenslotte met een string en niet met een datum. Ik gok erop dat de functies YEAR() en MONTH() sneller zijn, dan wordt er nog met een datum gewerkt. Ga met EXPLAIN achterhalen wat sneller is en wanneer MySQL nu welke index gebruikt.
Je hebt eigenlijk een functionele index nodig, maar dat wordt niet door MySQL ondersteund.
Allemaal bedankt voor het helpen.
Hier kan een slotje op.
Slotjes doen we niet aan.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(!empty($_GET['month']) AND !empty($_GET['year']))
{
$data_ch = $_GET['year']."-".$_GET['month']."-__ __:__:__";
}
else{
if(!empty($_GET['month']))
{
$data_ch = "____-".$_GET['month']."-__ __:__:__";
}
elseif(!empty($_GET['year'])){
$data_ch = $_GET['year']."-__-__ __:__:__";
}
else{
$data_ch = "";
}
}
{
$data_ch = $_GET['year']."-".$_GET['month']."-__ __:__:__";
}
else{
if(!empty($_GET['month']))
{
$data_ch = "____-".$_GET['month']."-__ __:__:__";
}
elseif(!empty($_GET['year'])){
$data_ch = $_GET['year']."-__-__ __:__:__";
}
else{
$data_ch = "";
}
}
Misschien een wat omslachtige oplossing maar het werkt :) De _ zorgt er voor dat in de LIKE vergelijking de _ elk soort teken kan zijn.