CURDATE + 31 dagen later

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

16/03/2019 19:02:44
Quote Anchor link
Beste leden,

Graag zou ik records van vandaag en 31 dagen later willen zien.
Dat is gelukt met de volgende sql query:
SELECT * FROM `table` WHERE date >= CURDATE()
AND date < CURDATE() + INTERVAL 31 DAY

Nu zou ik deze query willen combineren met een andere query,
omdat in deze query alle rows van de datum laat zien.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
                include 'db.php';
                $db = new DB();
                $users = $db->getRows('table',array('order_by'=>'date ASC'));         if(!empty($users)){ $count = 0;
foreach($users as $user){ $count++;
            ?>


Config database file(db.php)

public function getRows($table,$conditions = array()){

$sql = 'SELECT ';
$sql .= array_key_exists("select",$conditions)?$conditions['select']:'*';
$sql .= ' FROM '.$table;


if(array_key_exists("where",$conditions)){
$sql .= ' WHERE ';
$i = 0;

foreach($conditions['where'] as $key => $value){
$pre = ($i > 0)?' AND ':'';
$sql .= $pre.$key." = '".$value."'";
$i++;
}
}

De andere query is bedoelt voor het zoeken van een sport (bijvoorbeeld voetbal)

Dus dan gaat het om de query van het laden van de gegevens en bij het zoeken van een sport, met het doel dat de pagina de rows vandaag toont en 31 dagen later.

Graag hoor ik van jullie,

Met vriendelijke groet,

Levy van der Meijden
 
PHP hulp

PHP hulp

29/03/2024 09:10:55
 
- Ariën  -
Beheerder

- Ariën -

16/03/2019 20:01:13
Quote Anchor link
Echo eens $sql, dan moet denk ik wel duidelijk worden hoe je de query moet aanpassen.
 
Thomas van den Heuvel

Thomas van den Heuvel

16/03/2019 20:25:34
Quote Anchor link
En is het altijd exact 31 dagen later? En niet een maand later? Niet alle maanden hebben 31 dagen :).
 

16/03/2019 20:26:12
Quote Anchor link
Hoe bedoel je echo eens $sql?
De records worden wel getoond, maar ik wil graag dat de records worden getoont van vandaag en aankomende 31 dagen.

<tbody id="userData">


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
                include 'db.php';
                $db = new DB();
                $users = $db->getRows('table',array('order_by'=>'date ASC'));         if(!empty($users)){ $count = 0;
foreach($users as $user){ $count++;
            ?>



<tr>
<td>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $user['date']; ?>
</td>
<td>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $user['time']; ?>
</td>
<td>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $user['detail']; ?>
</td>
<td>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo $user['sport']; ?>
</td>
</tr>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php } }else{ ?>

<tr><td colspan="5">No user(s) found...</td></tr>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php } ?>

</tbody>

Toevoeging op 16/03/2019 20:27:56:

Thomas van den Heuvel op 16/03/2019 20:25:34:
En is het altijd exact 31 dagen later? En niet een maand later? Niet alle maanden hebben 31 dagen :).


Dat maakt niet zoveel uit, ik zou de dagen ook naar 365 dagen kunnen veranderen.


Toevoeging op 16/03/2019 21:23:44:

https://levyvandermeijden.nl/tabellen.php

Op de pagina begint de record met 2019-03-05, maar de bedoeling is dat de record begint met 2019-03-17.

Onderaan de pagina is het wel gelukt met de query.

2019-03-17 06:10:00 -> Grand Prix -> Formule 1
 
Thomas van den Heuvel

Thomas van den Heuvel

16/03/2019 21:48:45
Quote Anchor link
Je maakt gebruik van een databaselaag, deze voorziet niet, althans niet met de door jouw verstrekte informatie, over functionaliteit waarmee je intervallen kunt selecteren. Immers, key-value paren worden altijd verbonden met een =-teken, er is geen optie voor andere operatoren zoals >= of <=.

Ik weet niet waar je deze vandaan hebt getrokken of zelf hebt geschreven, maar je zou deze kunnen uitbreiden zodat WHERE-condities ook dergelijke mogelijkheden hebben.

En zoals @Ariën zegt zou het ook handig zijn om de opgebouwde SQL-string ergens te kunnen dumpen zodat je deze kunt inspecteren.
 
Rob Doemaarwat

Rob Doemaarwat

16/03/2019 22:16:17
Quote Anchor link
Hack yourself:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
$users = $db->getRows('table',array(
  'order_by'=>'date ASC',
  'where' => array(
    'date >= CURDATE() AND date < CURDATE() + INTERVAL 31 DAY OR "0"' => 1
  )
));

Maar zoals Thomas al aangaf: voeg het gewoon toe. Bijvoorbeeld door ook een 'ruwe' WHERE toe te kunnen voegen (string ipv een assoc.array).
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
if(array_key_exists("where",$conditions)){
  $sql .= ' WHERE ';
  $i = 0;
  if(is_string($where = $conditions['where'])) $sql .= $where; //ruwe WHERE
  else foreach($where as $key => $value){
    $pre = ($i > 0)?' AND ':'';
    $sql .= $pre.$key." = '".$value."'";
    $i++;
  }
}

//en dan:

$users = $db->getRows('table',array(
  'order_by'=>'date ASC',
  'where' => 'date >= CURDATE() AND date < CURDATE() + INTERVAL 31 DAY'
));
 

16/03/2019 22:19:08
Quote Anchor link
@Thomas van den Heuvel, bedankt voor je bericht. Ja, geprobeerd om de CURDATE query ergens te dumpen, maar geen idee waar.

@Rob Doemaarwat, de code aangepast, maar dan vindt hij geen resultaten.

Toevoeging op 16/03/2019 22:26:14:

Rob Doemaarwat op 16/03/2019 22:16:17:
Hack yourself:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
$users = $db->getRows('table',array(
  'order_by'=>'date ASC',
  'where' => array(
    'date >= CURDATE() AND date < CURDATE() + INTERVAL 31 DAY OR "0"' => 1
  )
));

Maar zoals Thomas al aangaf: voeg het gewoon toe. Bijvoorbeeld door ook een 'ruwe' WHERE toe te kunnen voegen (string ipv een assoc.array).
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
if(array_key_exists("where",$conditions)){
  $sql .= ' WHERE ';
  $i = 0;
  if(is_string($where = $conditions['where'])) $sql .= $where; //ruwe WHERE
  else foreach($where as $key => $value){
    $pre = ($i > 0)?' AND ':'';
    $sql .= $pre.$key." = '".$value."'";
    $i++;
  }
}

//en dan:

$users = $db->getRows('table',array(
  'order_by'=>'date ASC',
  'where' => 'date >= CURDATE() AND date < CURDATE() + INTERVAL 31 DAY'
));


Thanks, het is gelukt!



Toevoeging op 16/03/2019 23:07:21:

Hoe kan ik ook een where aanmaken voor de records, wanneer ik een sport selecteer?

Waar kan ik dit in het script het beste aanpassen?

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
<?php
include 'db.php';
$db = new DB();
$tblName = 'table';
$conditions = array();
if(!empty($_POST['type']) && !empty($_POST['val'])){
    if($_POST['type'] == 'search'){
        $conditions['search'] = array('detail'=>$_POST['val']);
        $conditions['order_by'] = 'date ASC';
    }
elseif($_POST['type'] == 'sort'){
        $conditions['order_by'] = 'date ASC';
        $sortVal = $_POST['val'];
        $sortArr = array(
            'voetbal'=>array(
                'where'=>array('sport'=>'voetbal')
                ),

            'tennis'=>array(
                'where'=>array('sport'=>'tennis')
                ),

            'shorttrack'=>array(
                'where'=>array('sport'=>'shorttrack')
                ),

            'darten'=>array(
                'where'=>array('sport'=>'darten')
                ),

            'formule1'=>array(
                'where'=>array('sport'=>'formule 1')
                ),

            'atletiek'=>array(
                'where'=>array('sport'=>'atletiek')
                ),

            'rugby'=>array(
                'where'=>array('sport'=>'rugby')
                ),
            
        );

        $sortKey = key($sortArr[$sortVal]);
        $conditions[$sortKey] = $sortArr[$sortVal][$sortKey];
    }
}
else{
    $conditions['order_by'] = 'date ASC';
}

$users = $db->getRows($tblName,$conditions);
if(!empty($users)){
    $count = 0;
    
    foreach($users as $user): $count++;
        echo '<tr>';
        echo '<td>'.$user['date'].'</td>';
        echo '<td>'.$user['time'].'</td>';
        echo '<td>'.$user['detail'].'</td>';
        echo '<td>'.$user['sport'].'</td>';
        echo '</tr>';
    endforeach;
}
else{
    echo '<tr><td colspan="5">No results</td></tr>';
}

exit;
?>
 
Adoptive Solution

Adoptive Solution

17/03/2019 10:46:35
Quote Anchor link
Maak van deze regel :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$conditions['search'] = array('detail'=>$_POST['val']);

Dit :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$conditions['where'] = array('detail'=>$_POST['val']);


Voor de nieuwsgierigen, dit is de Database class :

https://www.codexworld.com/php-crud-operations-jquery-ajax-mysql/

Het was misschien handig geweest om dat in het vorige topic te vermelden.


Toevoeging op 17/03/2019 11:02:18:

In het zoekveld moet de complete, exacte, tekst worden ingevuld.

Wat is de kans dat iemand dat weet/kan?

Omdat in de db.class voor zover ik kan zien geen LIKE voorkomt, zou regel 41 moeten worden gewijzigd van :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql .= $pre.$key." = '".$value."'";


In :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql .= $pre.$key." LIKE '%".$value."%'";


Alternatief is om de functie uit te breiden.
 

17/03/2019 15:30:11
Quote Anchor link
@ Adoptive Solution, bedankt voor uw reactie.

Bij het filteren van een sport wordt de exacte tekst ingevuld. Bijvoorbeeld: voetbal en tennis.

Maar als ik nu filter voor een sport(voetbal), worden de resultaten van alle records (alle datums) van voetbal getoond.
 
Adoptive Solution

Adoptive Solution

17/03/2019 16:06:26
Quote Anchor link
Ik heb de data die ik op je tabellen.php pagina zag, overgenomen, verfromfraaid, en in een database gestopt.

De database class heb ik aangepast zoals aangegeven. Dus '=' door 'LIKE' vervangen. Inclusief de % tekens.

En in getData.php heb ik 'search' vervangen door 'where'.

Als ik nu een sport uit het menu kies, krijg ik alle records met die sport.

Als ik in het zoekveld een deel van de tekst uit het databaseveld 'detail' kies, krijg ik alle records waar die tekst in voorkomt.

En als een terzijde. De database class is vrij beperkt. Zelf gebruik ik deze :

https://github.com/bennettstone/simple-mysqli


Toevoeging op 17/03/2019 16:11:49:

En voor wie het wil proberen, hier de tabel. Wel effe de tblName in getData.php aanpassen.

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
-- Adminer 4.7.1 MySQL dump

SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

SET NAMES utf8mb4;

DROP TABLE IF EXISTS `sports`;
CREATE TABLE `sports` (
  `date` date NOT NULL,
  `time` time NOT NULL,
  `detail` varchar(500) NOT NULL,
  `sport` varchar(500) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `sports` (`date`, `time`, `detail`, `sport`) VALUES
('2019-03-17',    '06:10:00',    'Race - Melbourne in Australia',    'Formule 1'),
('2019-03-21',    '19:55:00',    'Berlijn -> Gerwyn Price tegen Rob Cross === James Wade tegen Peter Wright === Michael van Gerwen tegen Daryl Gurney === Michael Smith tegen Mensur Suljovic === Max Hopp tegen Raymond van Barneveld',    'Darten'),
('2019-03-31',    '14:10:00',    'Race - Sakhir in Bahrein',    'Formule 1'),
('2019-04-09',    '21:00:00',    'Tottenham Hotspur FC - Manchester City FC === Liverpool FC - FC Porto',    'Voetbal'),
('2019-04-10',    '21:00:00',    'AFC Ajax - Juventus FC === Manchester United FC - FC Barcelona',    'Voetbal'),
('2019-04-11',    '21:00:00',    'Arsenal - Napoli === Slavia Praag - Chelsea === Benfica - Eintracht Frankfurt === Villarreal - Valencia',    'Voetbal'),
('2019-04-14',    '08:10:00',    'Race - Shanghai in China',    'Formule 1'),
('2019-04-16',    '21:00:00',    'Juventus FC - AFC Ajax === FC Barcelona - Manchester United FC',    'Voetbal'),
('2019-04-17',    '21:00:00',    'Manchester City FC - Tottenham Hotspur FC === FC Porto - Liverpool FC',    'Voetbal'),
('2019-04-18',    '21:00:00',    'Napoli - Arsenal === Chelsea - Slavia Praag === Eintracht Frankfurt - Benfica - === Valencia - Villarreal',    'Voetbal'),
('2019-04-28',    '14:10:00',    'Race - Bakoe in Azerbeidzjan',    'Formule 1'),
('2019-05-05',    '18:00:00',    'Ajax tegen Willem II',    'Voetbal'),
('2019-05-11',    '00:00:00',    'tot en met 02-06-2019',    'Wielrennen'),
('2019-05-12',    '10:00:00',    'Race - Spanje',    'Formule 1'),
('2019-05-26',    '15:10:00',    'Race - Monaco',    'Formule 1'),
('2019-05-29',    '21:00:00',    'Olympisch Stadion - Bakoe in Azerbeidzjan',    'Voetbal'),
('2019-06-01',    '20:45:00',    'Wanda Metropolitano - Madrid in Spanje',    'Voetbal'),
('2019-06-05',    '20:45:00',    'Portugal tegen Zwitserland',    'Voetbal'),
('2019-06-06',    '20:45:00',    'Nederland tegen Engeland',    'Voetbal'),
('2019-06-09',    '20:10:00',    'Race - Canada',    'Formule 1'),
('2019-06-11',    '15:00:00',    'Nederland in Le Havre tegen Nieuw-Zeeland',    'Voetbal'),
('2019-06-14',    '00:00:00',    'tot en met 07-07-2019',    'Voetbal'),
('2019-06-15',    '15:00:00',    'Nederland tegen Kameroen',    'Voetbal'),
('2019-06-15',    '00:00:00',    'tot en met 13-07-2019',    'Voetbal'),
('2019-06-20',    '18:00:00',    'Nederland tegen Canada',    'Voetbal'),
('2019-06-23',    '15:10:00',    'Race - Frankrijk',    'Formule 1'),
('2019-06-30',    '15:10:00',    'Race - Oostenrijk',    'Formule 1'),
('2019-07-01',    '00:00:00',    'tot en met 14-07-2019',    'Tennis'),
('2019-07-06',    '00:00:00',    'tot en met 28-07-2019',    'Wielrennen'),
('2019-07-14',    '15:10:00',    'Race - van Groot-Brittanni',    'Formule 1'),
('2019-07-28',    '15:10:00',    'Race - Duitsland',    'Formule 1'),
('2019-08-04',    '15:10:00',    'Race - Hongarije',    'Formule 1'),
('2019-08-24',    '00:00:00',    'tot en met 15-09-2019',    'Wielrennen'),
('2019-08-26',    '00:00:00',    'tot en met 08-09-2019',    'Tennis'),
('2019-09-01',    '15:10:00',    'Race - Belgi',    'Formule 1'),
('2019-09-08',    '15:10:00',    'Race - Itali',    'Formule 1'),
('2019-09-22',    '14:10:00',    'Race - Singapore',    'Formule 1'),
('2019-09-22',    '00:00:00',    'tot en met 29-09-2019',    'Wielrennen'),
('2019-09-29',    '18:10:00',    'Race - Rusland',    'Formule 1'),
('2019-10-13',    '07:10:00',    'Race - Japan',    'Formule 1'),
('2019-10-27',    '20:10:00',    'Race - Mexico',    'Formule 1'),
('2019-11-03',    '20:10:00',    'Race - de Verenigde Staten',    'Formule 1'),
('2019-11-17',    '18:10:00',    'Race - Brazili',    'Formule 1'),
('2019-11-30',    '00:00:00',    'tot en met 15-12-2019',    'Handbal'),
('2019-12-01',    '14:10:00',    'Race - Abu Dhabi',    'Formule 1'),
('2019-09-28',    '00:00:00',    'tot en met 02-10-2019',    'Atletiek'),
('2019-03-08',    '09:00:00',    'Sofia in Bulgarije - Kwalificatie: 500, 1000 en 1500 meter',    'Shorttrack'),
('2019-03-09',    '13:02:00',    'Sofia in Bulgarije - Finale, halve finale en kwartfinale: 500, 1000 en 1500 meter',    'Shorttrack'),
('2019-03-10',    '13:02:00',    'Sofia in Bulgarije - Finale, halve finale en kwartfinale: 500, 1000 en 1500 meter',    'Shorttrack'),
('2019-03-09',    '13:15:00',    'TeamNL Heren XV (Nederland) tegen Portugal',    'Rugby'),
('2019-03-09',    '15:45:00',    'Oranje dames XV (Nederland) tegen Duitsland',    'Rugby'),
('2019-09-20',    '00:00:00',    'tot en met 02-10-2019',    'Rugby'),
('2019-03-10',    '21:00:00',    'Bertens K. (Ned) tegen Konta J. (Gbr)',    'Tennis'),
('2019-03-10',    '19:00:00',    'Rublev A. (Rus) tegen Haase R. (Ned)',    'Tennis'),
('2019-03-11',    '22:00:00',    'Brady J./Riske A. tegen Bertens K./Vekic D.',    'Tennis'),
('2019-03-12',    '20:00:00',    'Bertens K. (Ned) tegen Muguruza G. (Esp)',    'Tennis'),
('2019-05-26',    '12:00:00',    'tot en met 09-06-2019',    'Tennis');

-- 2019-03-17 15:07:54
 

17/03/2019 16:29:51
Quote Anchor link
Nogmaals bedankt voor het reageren, maar de functie van het selecteren van een sport werkt al.

Het enige dat ik nog graag zou willen, is dat ik niet alle records van een sport worden getoond.
Vanaf de datum van vandaag en de komende 365 dagen.
 
Adoptive Solution

Adoptive Solution

17/03/2019 16:45:38
Quote Anchor link
Het antwoord weet je. Je juichte zelfs dat het was gelukt!

https://www.phphulp.nl/php/forum/topic/curdate-31-dagen-later/102833/1/#743125
 

17/03/2019 17:14:40
Quote Anchor link
Dat klopt, maar dat is alleen bij het laden van de records.
Nu bij het filteren, filtert hij echt specifiek bijvoorbeeld voetbal.



Toevoeging op 17/03/2019 17:18:29:

$users = $db->getRows($tblName,$conditions,array(
'order_by'=>'date ASC',
'where' => 'date >= CURDATE() AND date < CURDATE() + INTERVAL 365 DAY'
));

Maar dan worden alsnog alle resultaten van een sport (voetbal) weergegeven.
Volgens mij is het mogelijk om de $conditions aan te passen, maar ik weet niet hoe.
Gewijzigd op 17/03/2019 17:22:06 door
 
Adoptive Solution

Adoptive Solution

17/03/2019 17:28:22
Quote Anchor link
1. date is een gereserveerd woord. Om het te gebruiken moet je ze tussen die ticks plaatsen. Zonder lukt niet.

2. Hier een kunstgreep om de datumbereik te kiezem. Aanpassen in de db class waar 'where' wordt bepaald.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
        if( array_key_exists( "where", $conditions ) )
        {
            $where = " AND `date` >= CURDATE() AND `date` < CURDATE() + INTERVAL 31 DAY";
            $sql .= ' WHERE ';
            $i = 0;
            foreach( $conditions['where'] as $key => $value )
            {
                $pre = ($i > 0)?' AND ':'';
                $sql .= $pre . $key . " LIKE '%" . $value . "%'";
                $i++;
            }
            $sql .= $where;
        }




Toevoeging op 17/03/2019 18:23:47:

Nieuwe oplossing :

Voeg deze nieuwe condition op de aangegeven plek in getData.php

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
// nieuwe condition
$conditions['bereik'] = " AND `date` >= CURDATE() AND `date` < CURDATE() + INTERVAL 31 DAY";

$users = $db->getRows( $tblName, $conditions );


Vervang in het database class bestand in function getRows() de eerder opgegeven oplossing met dit :

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
if( array_key_exists( "where", $conditions ) )
{
    $sql .= ' WHERE ';
    $i = 0;
    foreach( $conditions['where'] as $key => $value )
    {
        $pre = ($i > 0)?' AND ':'';
        $sql .= $pre . $key . " LIKE '%" . $value . "%'";
        $i++;
    }
    
    // dit is  nieuw
    if( array_key_exists( "bereik",$conditions) )
    {
        $sql .= $conditions['bereik'];
    }
}


In de bereik condition kan je bijvoorbeeld ook variabelen ingeven met een begin en einddatum.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$conditions['bereik'] = " AND `date` >= " . $begindatum . " AND `date` < " . $begindatum . " + " . " INTERVAL " . $getal . " DAY";


Alles wat je kan verzinnen.

Oh, en pas je LinkenIn profiel eens aan, IT Consultant. Ik moet altijd in mijn broek pissen van het lachen als ik dat lees. En dan moet ik me weer verschonen.
 

17/03/2019 19:13:35
Quote Anchor link
Super bedankt! Niet te vaak dan kijken, haha. Ik verander het.
 



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.