[PHP] Selectie van datums uit MySQL

Hey,

Ik ben iets aan het maken en dat zou het volgende moeten kunnen:

  • Event toegen in database met een datum (dit is niet moeilijk)
  • Alle events weergeven die in de database staan die een bepaalde selectie hebben.
    Alle events van vandaag tot binnen 2 weken weergeven.
    Ook als er lege dagen zouden zijn (zonder event), dan zou de datum weergegeven moeten worden en als event “leeg”.

Hebben jullie tips/truuks/voorbeelden?
Want met timestamps/date() ed. heb ik nog niet veel gewerkt.

Dank.

Je zou kunnen een query draaien die je een result geeft van alle events tussen bepaalde datums. En die array dan gaan vergelijken met een array van alle bestaande datums in die periode. Zo is het niet moeilijk om uiteindelijk op de webpagina ook datums weer te geven waar er geen event is.

Snap je het een beetje? Anders moet je wat gedetailleerdere uitleg gaan geven over welk stuk je juist niet kan programmeren.

Groeten

[code:1:77398be298] $datum_event = explode("-",$datuminDB); [/code:1:77398be298]

datum_event[0] -> jaartal
datum_event[1] -> maand
datum_event[2] -> dag

[code:1:77398be298]

$eerste-tijd = mktime(17,00,0,$datum_event[1],$datum_event[2],$datum_event[0]);

$tweede-tijd = mktime(17,00,0,date("m"),date("d"),date("Y"));

$verschilseconds = $tweede-tijd- $eerste-tijd;
$verschilminutes = $verschilseconds/60;
$verschilhours = $verschilminutes/60;
$verschildays = $verschilhours/24;

[/code:1:77398be298]

Hoop dat je hier iets mee kunt… en anders kun je, zoals in de post hierboven beschreven, ook een query maken.

Waarom PHP gebruiken. Allereerst is MySQL veel sneller in berekeningen etc en daarnaast is het zo dat je zo min mogelijk queries moet doen (een query duurt relatief erg lang).

Zorg dat je data als timestamps in de database zit, en doe vervolgens iets ala: WHERE UNIX_TIMESTAMP(date) < UNIX_TIMESTAMP(".$voorTimestamp.") AND UNIX_TIMESTAMP(date) > UNIX_TIMESTAMP(".$naDatum.").

Reference: Mysql Date and Time function

Jochem

[quote:fec815c5b1="XBL"]Waarom PHP gebruiken. Allereerst is MySQL veel sneller in berekeningen etc en daarnaast is het zo dat je zo min mogelijk queries moet doen (een query duurt relatief erg lang).

Zorg dat je data als timestamps in de database zit, en doe vervolgens iets ala: WHERE UNIX_TIMESTAMP(date) < UNIX_TIMESTAMP(".$voorTimestamp.") AND UNIX_TIMESTAMP(date) > UNIX_TIMESTAMP(".$naDatum.").

Reference: Mysql Date and Time function

Jochem[/quote:fec815c5b1]
Nee nee, voor dates moet je natuurlijk het DATE of DATETIME type gebruiken. Dan kan je namelijk dit doen:

[code:1:fec815c5b1]SELECT * FROM events WHERE ‘date’ < NOW() AND ‘date’ > (‘date’ - 0000-00-07)[/code:1:fec815c5b1]

Of op deze manier kan ook nog dacht ik: [code:1:1eb729312a]SELECT * FROM $dbname WHERE DATE_SUB(CURDATE(),INTERVAL 14 DAY) <= datum[/code:1:1eb729312a]

[quote:a6da5da100="Wallinator"]Nee nee, voor dates moet je natuurlijk het DATE of DATETIME type gebruiken.[/quote:a6da5da100]Bedoel ik, ben er niet helemaal bij.

[quote:a6da5da100=“TheBT”][code:1:a6da5da100]SELECT * FROM $dbname WHERE DATE_SUB(CURDATE(),INTERVAL 14 DAY) <= datum[/code:1:a6da5da100][/quote:a6da5da100]Vet, ik ga eens kijken naar DATE_SUB; kende ik nog niet :).

Jochem

Met dit script, update ik ieder keer de xml file die dan in flash zal worden ingeladen:

[code:1:0e599e6b3a]
<?php
include("connect.php");

$db_name = $database ;
$connection = mysql_connect("$server", "$username", "$password");
$db = mysql_select_db($db_name);
$query = "select * from agenda ORDER BY id ASC";
$result = mysql_query($query, $connection) or die("Could not complete database query");
$num = mysql_num_rows($result);

if ($num != 0) {

$file= fopen("…/agenda/agenda.xml", "w");
$_xml ="<?xml version="1.0" ?>rn";
$_xml .="<agenda>rn";

while ($row = mysql_fetch_array($result)) {

if ($row["naam"] == ""){
$status = "vrij";
}else{
$status = "bezet";
}

$_xml .= "t
<entry myComment="" . $row["naam"] . "" myDatum="" . $row["datum"] . "" myStatus="" . $status . "">rn";
$_xml .= "t </entry>";
}
}

$_xml .="</agenda>";
fwrite($file, $_xml);
fclose($file);

?>

[/code:1:0e599e6b3a]

Maar nu wil ik dus dat hij vanaf de datum van vandaag tot 14 dagen verder items in de xml file wegschrijft.
Maar daartussen moeten dan ook de gegevens die in de database zitten verwerkt worden.
Dat is dus hetgene dat ik niet kan.

Iemand enig idee?
PS: de datum wordt manueel ingegeven als 25/06/2005

[quote:eb97aa750d="konijn"]Met dit script, update ik ieder keer de xml file die dan in flash zal worden ingeladen:

[code:1:eb97aa750d]
<?php
include("connect.php");

$db_name = $database ;
$connection = mysql_connect("$server", "$username", "$password");
$db = mysql_select_db($db_name);
$query = "select * from agenda ORDER BY id ASC";
$result = mysql_query($query, $connection) or die("Could not complete database query");
$num = mysql_num_rows($result);

if ($num != 0) {

$file= fopen("…/agenda/agenda.xml", "w");
$_xml ="<?xml version="1.0" ?>rn";
$_xml .="<agenda>rn";

while ($row = mysql_fetch_array($result)) {

if ($row["naam"] == ""){
$status = "vrij";
}else{
$status = "bezet";
}

$_xml .= "t
<entry myComment="" . $row["naam"] . "" myDatum="" . $row["datum"] . "" myStatus="" . $status . "">rn";
$_xml .= "t </entry>";
}
}

$_xml .="</agenda>";
fwrite($file, $_xml);
fclose($file);

?>

[/code:1:eb97aa750d]

Maar nu wil ik dus dat hij vanaf de datum van vandaag tot 14 dagen verder items in de xml file wegschrijft.
Maar daartussen moeten dan ook de gegevens die in de database zitten verwerkt worden.
Dat is dus hetgene dat ik niet kan.

Iemand enig idee?
PS: de datum wordt manueel ingegeven als 25/06/2005[/quote:eb97aa750d]
Als welk type sla je je datum op in de database?

varchar(200) maar dat is niet correct zeker.

[quote:2fff5882f8="konijn"]varchar(200) maar dat is niet correct zeker.[/quote:2fff5882f8] Nee inderdaad, dat moet je met DATE. Dan kan je deze query gebruiken: [code:1:2fff5882f8]SELECT * FROM `agenda` WHERE 'datum' > NOW() AND 'datum' < ('datum' + 0000-00-14)[/code:1:2fff5882f8]

Done, maar nu kan ik ineen niet meer writen in agenda.xml. Dat heb ik er van gemaakt, dat is toch correct niet?! [code:1:62715c8e2d]$query = "SELECT * FROM agenda WHERE datum > NOW() AND datum < (datum + 0000-00-14)"; [/code:1:62715c8e2d]

[quote:fdc18594f7="konijn"]Done, maar nu kan ik ineen niet meer writen in agenda.xml. Dat heb ik er van gemaakt, dat is toch correct niet?! [code:1:fdc18594f7]$query = "SELECT * FROM agenda WHERE datum > NOW() AND datum < (datum + 0000-00-14)"; [/code:1:fdc18594f7][/quote:fdc18594f7]

Ja, ik zou er alleen dit van maken:

[code:1:fdc18594f7]$query = ‘SELECT * FROM agenda WHERE datum > NOW() AND datum < (datum + 0000-00-14)’;[/code:1:fdc18594f7]

Toch raar dat ik dan een error krijg:

[code:1:4b6839887f]
Warning: fwrite(): supplied argument is not a valid …

Warning: fclose(): supplied argument is not a valid …[/code:1:4b6839887f]

Als ik er dit:

[code:1:763960e356]//$query = ‘SELECT * FORM “agenda” WHERE “datum” > NOW() and “datum” < (“datum” + 0000-00-14)’;
of dit:

//$query = “SELECT * FORM ‘agenda’ WHERE ‘datum’ > NOW() and ‘datum’ < (‘datum’ + 0000-00-14)”;[/code:1:763960e356]

Dat kan ik geen verbindind met de DB maken.

[quote:181f768da5="konijn"]Toch raar dat ik dan een error krijg:

[code:1:181f768da5]
Warning: fwrite(): supplied argument is not a valid …

Warning: fclose(): supplied argument is not a valid …[/code:1:181f768da5][/quote:181f768da5]
Hm, ik niet. Post je PHP-code eens?

[code:1:f877cfca08]<?php include("connect.php");

$db_name = $database ;
$connection = mysql_connect("$server", “$username”, “$password”);
$db = mysql_select_db($db_name);
//$query = “select * from agenda ORDER BY datum ASC”;
//$query = ‘SELECT * FORM “agenda” WHERE “datum” > NOW() and “datum” < (“datum” + 0000-00-14)’;
$query = “SELECT * FORM ‘agenda’ WHERE ‘datum’ > NOW() and ‘datum’ < (‘datum’ + 0000-00-14)”;

$result = mysql_query($query, $connection) or die("Could not complete database query");

$num = mysql_num_rows($result);

if ($num != 0) {

$file= fopen("…/agenda/agenda.xml", "w");
$_xml ="<?xml version="1.0" ?>rn";
$_xml .="<agenda>rn";

while ($row = mysql_fetch_array($result)) {

if ($row["naam"] == "" or $row["naam"] == null or $row["naam"] == undefined ){
$status = "vrij";
}else{
$status = "bezet";
}

$_xml .= "t
<entry myComment="" . $row["naam"] . "" myDatum="" . $row["datum"] . "" myStatus="" . $status . "">rn";
$_xml .= "t </entry>";
}
}

$_xml .="</agenda>";
fwrite($file, $_xml);
fclose($file);
?>[/code:1:f877cfca08]

Probeer dit eens als code:

[code:1:eb2ce8ea95]
<?php

include(‘connect.php’);

$link = mysql_connect($server, $username, $password);
mysql_select_db($database, $link);

$query = ‘SELECT * FROM agenda WHERE datum > CURDATE() AND datum < DATE_ADD(CURDATE(), INTERVAL 14 DAY)’;
$result = mysql_query($query, $link) or die(‘Kan query niet uitvoeren: ‘.$query.’<br />’.mysql_error());

if(mysql_num_rows($result) !== 0)
{

	$file = '../agenda/agenda.xml';
	$handle = fopen&#40;$file, 'w'&#41;;

	$xml = '&lt;?xml version=&quot;1.0&quot; ?&gt;&lt;agenda&gt;';

	while&#40;$row = mysql_fetch_array&#40;$result&#41;&#41;
		$xml .= '&lt;entry myComment=&quot;'.$row&#91;'naam'&#93;.'&quot; myDatum=&quot;'.$row&#91;'datum'&#93;.'&quot; myStatus=&quot;'.&#40;empty&#40;$row&#91;'naam'&#93;&#41; ? 'vrij' &#58; 'bezet'&#41;.'&quot; /&gt;';

	$xml .= '&lt;/agenda&gt;';

	fwrite&#40;$handle, $xml&#41;;
	fclose&#40;$handle&#41;;

}

?>
[/code:1:eb2ce8ea95]