[mysqli] DATA_FORMAT + LIKE geeft geen resultaten

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Guido S

Guido S

17/02/2009 21:30:00
Quote Anchor link
Hoi
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)
PHP script in nieuw venster Selecteer het PHP script
1
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
}

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
 
PHP hulp

PHP hulp

26/12/2024 11:19:25
 
- SanThe -

- SanThe -

17/02/2009 21:36:00
Quote Anchor link
Nooit input van de users direct in de query zetten.
 
Guido S

Guido S

17/02/2009 22:06:00
Quote Anchor link
@SanThe
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)
PHP script in nieuw venster Selecteer het PHP script
1
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'");
Gewijzigd op 01/01/1970 01:00:00 door Guido S
 
Guido S

Guido S

18/02/2009 22:56:00
Quote Anchor link
Niemand? Ik zit namelijk nog steeds met het probleem :(
 
Jelmer -

Jelmer -

18/02/2009 23:04:00
Quote Anchor link
Krijg je ook een bepaalde foutmelding? Wat is de fout, wat is er fout? Want zo op het eerste gezicht zou het inderdaad gewoon goed moeten werken.

(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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
AND datum LIKE '$year-$month-%'

ook kan en sneller is wanneer je een index op datum zet)
 
Pieter Jansen

Pieter Jansen

18/02/2009 23:06:00
Quote Anchor link
Hoe worden je gegevens verstuurd? Die month bijvoorbeeld. Die show je nu als 2 cijfers. Die eerste mag dus alleen 0 of 1 zijn.. de 2, mag 0 tot 10 zijn.

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
 
Guido S

Guido S

19/02/2009 13:56:00
Quote Anchor link
@Jelmer
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.
 
- SanThe -

- SanThe -

19/02/2009 14:02:00
Quote Anchor link
Je checkt nergens of de query wel is gelukt.
 
Guido S

Guido S

19/02/2009 14:07:00
Quote Anchor link
Ik zal voor de duidelijkheid even de hele code posten.
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
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.";
    }


Als hij 0 resultaten geeft mag ik aannemen dat de query mislukt is?
Gewijzigd op 01/01/1970 01:00:00 door Guido S
 
- SanThe -

- SanThe -

19/02/2009 14:18:00
Quote Anchor link
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.
 
Guido S

Guido S

19/02/2009 14:20:00
Quote Anchor link
Oke dat wist ik niet.
Maar ik heb de query getest zonder MONTH() en YEAR() en nu geeft hij dus wel gewoon resultaten zoals het hoort.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'");

Er zit dus een fout in de datum.
Gewijzigd op 01/01/1970 01:00:00 door Guido S
 
- SanThe -

- SanThe -

19/02/2009 14:29:00
Quote Anchor link
En datum is uiteraard een DATE of DATETIME veld.
 
Guido S

Guido S

19/02/2009 14:30:00
Quote Anchor link
Ja het is een DATATIME.
Gewijzigd op 01/01/1970 01:00:00 door Guido S
 
- SanThe -

- SanThe -

19/02/2009 14:37:00
Quote Anchor link
Lees de post van Jelmer nog eens door.
 
Guido S

Guido S

19/02/2009 14:41:00
Quote Anchor link
Was er al mee bezig ;)
Die oplossing werkt, nu alleen een probleem met die query.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
AND datum LIKE '$year-%'
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)
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
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.";
    }

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
 
- SanThe -

- SanThe -

19/02/2009 14:47:00
Quote Anchor link
Echo de query eens, dan kun je wat zien.
 
Frank -

Frank -

19/02/2009 14:47:00
Quote Anchor link
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.
 
Guido S

Guido S

19/02/2009 19:32:00
Quote Anchor link
Probleem is opgelost :)
Allemaal bedankt voor het helpen.
Hier kan een slotje op.
 
- SanThe -

- SanThe -

19/02/2009 20:46:00
Quote Anchor link
En de oplossing vermeld je uiteraard ook even voor de andere forumleden.
Slotjes doen we niet aan.
 
Guido S

Guido S

19/02/2009 22:35:00
Quote Anchor link
Uiteraard
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
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 = "";
            }
        }

Misschien een wat omslachtige oplossing maar het werkt :) De _ zorgt er voor dat in de LIKE vergelijking de _ elk soort teken kan zijn.
 



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.