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.

<?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
Echo eens $sql, dan moet denk ik wel duidelijk worden hoe je de query moet aanpassen.
En is het altijd exact 31 dagen later? En niet een maand later? Niet alle maanden hebben 31 dagen :).
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">


<?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><?php echo $user['date']; ?></td>
<td><?php echo $user['time']; ?></td>
<td><?php echo $user['detail']; ?></td>
<td><?php echo $user['sport']; ?></td>
</tr>
<?php } }else{ ?>
<tr><td colspan="5">No user(s) found...</td></tr>
<?php } ?>
</tbody>

[size=xsmall]Toevoeging op 16/03/2019 20:27:56:[/size]

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.


[size=xsmall]Toevoeging op 16/03/2019 21:23:44:[/size]

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

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.
Hack yourself:

$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).

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'
));
@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.

[size=xsmall]Toevoeging op 16/03/2019 22:26:14:[/size]

Rob Doemaarwat op 16/03/2019 22:16:17

Hack yourself:

$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).

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!



[size=xsmall]Toevoeging op 16/03/2019 23:07:21:[/size]

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?

<?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;
?>

Maak van deze regel :
$conditions['search'] = array('detail'=>$_POST['val']);

Dit :
$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.


[size=xsmall]Toevoeging op 17/03/2019 11:02:18:[/size]

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 :

$sql .= $pre.$key." = '".$value."'";


In :

$sql .= $pre.$key." LIKE '%".$value."%'";


Alternatief is om de functie uit te breiden.
@ 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.



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


[size=xsmall]Toevoeging op 17/03/2019 16:11:49:[/size]

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

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



Reageren