Wat gaat er verkeerd met dit scriptje? (1e script)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marc van Gemeren

Marc van Gemeren

28/10/2008 15:29:00
Quote Anchor link
Met het volgende script probeer ik een plaatje weer te geven als het tussen de opgegeven datum is. Anders een ander plaatje.
Hellaas geeft het script op dit moment telkens het plaatje aan wat weergegeven moet worden als het de juiste datum is. M.a.w. Als ik de datum op dit moment wijzig naar een datum die niet geldig is blijft het plaatje weergegeven worden. (Wijzig de datum op mijn eigen PC die ik nu gebruik als localhost)

Ideeen en oplossingen om dit makkelijker te doen zijn uiteraard van harte welkom. Ben compleet nieuw in php, dus wil graag leren en ontdekken.

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
<?php
setlocale (LC_ALL, "nl_NL");

$aDatumBegin = array(    "15 September 2008",     // De datum instellen wanneer de reclame moet verschijnen.
                        "29 September 2008",
                        "20 October 2008",
                        "5 January 2009",
                        "19 January 2009",
                        "25 February 2009");
                        
$aDatumEind = array("24 September",             // De datum instellen wanneer de reclame moet eindigen.
                    "08 October 2008",
                    "30 October 2008",
                    "15 January 2009",
                    "29 January 2009",
                    "11 March 2009");
                    
foreach($aDatumBegin as $DatumBegin);            // Instellen dat deze Array de werkelijke informatie bevat.

foreach($aDatumEind as $DatumEind);                // Instellen dat deze Array de werkelijke informatie bevat.

// Hieronder stellen we in van welke datum tot de datum waarop het plaatje weergegeven mag worden.


if(time() >= strtotime("$DatumBegin 00:00:01AM") and time() <= strtotime("$DatumEind 11:59:59PM"))
{

  echo "<img src=reclame/plaatje.jpg>"; // Het plaatje wat weergegeven wordt als het tussen de juiste data valt.
}
else
{
     echo "<img src=reclame/anderplaatje.jpg>"; // Het plaatje dat wordt weergegeven wanneer het niet de juiste datum is.
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Marc van Gemeren
 
PHP hulp

PHP hulp

26/12/2024 15:36:27
 
Joren de Wit

Joren de Wit

28/10/2008 15:41:00
Quote Anchor link
Het zou veel eenvoudiger zijn om hier een database voor te gebruiken. In een tabel sla je voor een plaatje zowel de begin als einddatum op en met een eenvoudige query kun je het plaatje selecteren dat vandaag getoond moet worden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT
  plaatje
FROM
  tabel
WHERE
  CURRENT_DATE BETWEEN begin AND eind

Mocht deze query geen resultaten opleveren, weet je dus dat er geen enkel plaatje voldoet en dat je dus een standaard plaatje moet tonen.
 
Jesper Diovo

Jesper Diovo

28/10/2008 15:55:00
Quote Anchor link
Blanche, als je de titel leest, had je geweten dat dit Marcs eerste script is. Dan moet je nog niet met een database aan de gang gaan, dat wil je gewoon niet. Marc maakt hier de fout, dat hij een foreach-loop als een gewone functie behandelt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach($array as $value) {

}

?>


Het voorgaande scriptje geeft aan dat ieder element in de array in $value staat, gedurende de loop (alles tussen { en }). Die accolades ({ en }) ontbreken bij jou. Overigens zou het beter zijn als je gebruik maakt van de index (automatische key van een value).

Dat doe je dan zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach($array as $key => $value) {

}

?>


Je kunt nu $key gebruiken om bij de andere array de einddatum op te halen. (Via $array2[$key]). Nog beter zou zijn als je de start- en einddatum in één array zet. Dus:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$array
("begindatum"=>"einddatum",
           "begindatum"=>"einddatum");

foreach($array as $begin => $eind) {
  if($datumnu > $begin && $datumnu < $eind) {
    // toon
  } else {
    // niet tonen
  }
}

?>
 
Marc van Gemeren

Marc van Gemeren

29/10/2008 16:29:00
Quote Anchor link
Oké. Bedankt zover.

Inderdaad kan ik me voorstellen dat zoiets vanuit een database nog makkelijker is te organiseren en benaderen. Maar laat ik maar rustig beginnen.

Ik ga eens aan het werk met de tip van Jezpur.

Je hoort en ziet wel weer van me terug.
 
--

--

29/10/2008 16:33:00
Quote Anchor link
Jezpur schreef op 28.10.2008 15:55:
Blanche, als je de titel leest, had je geweten dat dit Marcs eerste script is. Dan moet je nog niet met een database aan de gang gaan, dat wil je gewoon niet.
Waarom niet? Ik vind een stukje SQL begrijpend lezen een stuk makkelijker voor een beginner dan dat met PHP te doen. Meteen goed leren, daar heb je later profijt van.
 
Jesper Diovo

Jesper Diovo

29/10/2008 16:46:00
Quote Anchor link
Maar wat als er verder geen SQL gedachten bij zitten? Dan zit je met een database met één tabel, een paar velden en maar één record? Nee dat schiet op. Gewoon eerst PHP leren, en dan de verbinding tussen database en PHP maken. Dat is véél handiger. Dan weet je gewoon als er ergens iets fout gaat of het aan PHP of aan SQL ligt. Ga je meteen van start met SQL, ga je meteen de bietenbrug op.
 
Marc van Gemeren

Marc van Gemeren

30/10/2008 10:15:00
Quote Anchor link
Ik zal wel iets simpels over het hoofd zien.

Heb nu het volgende scriptje :

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

$datumnu
= date('d-m-Y');

$toondata("20-10-2008"=>"30-10-2008",
            "05-01-2009"=>"15-01-2009");

foreach($toondata as $begin => $eind) {
  if($datumnu > $begin && $datumnu < $eind) {
    
    echo "de juiste datum" ;// toon
  
  }
  else
  {
  
    echo "niet de juiste datum"; // niet tonen
    
  }
}


echo "$datumnu"; // data checken
echo "$begin"; // data checken
echo "$eind";  // data checken
echo "$toondata";  //data checken
?>



De Onderste "echo's" heb ik even neergezet om te kijken wat hij weergeeft.
Maar ik krijg nu slechts de melding

unexpected T_DOUBLE_ARROW (op lijn 14)

Waar ga ik verkeerd? Ligt het aan de functie data? Nogmaals 1e script dus het is heel veel knippen en plakken om te proberen.

Alvast bedankt.
 
- SanThe -

- SanThe -

30/10/2008 10:21:00
Quote Anchor link
$toondata("20-10-20........

$toondata = array("20-10-20......

Maar je weet dat dit geen datums zijn maar strings met tekst.
 
Jesper Diovo

Jesper Diovo

30/10/2008 10:21:00
Quote Anchor link
Je maakt geen array van de data.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$toondata
= array("20-10-2008"=>"30-10-2008", "05-01-2009"=>"15-01-2009");
?>


Bovendien zet je variabelen niet binnen quotes. Die zet je daarbuiten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
// fout:
echo "dit is een $var";
// goed:
echo "dit is een ".$var."";
// of:
echo "dit is een ".$var;
?>


$begin en $eind zullen na jouw foreach() altijd de laatst gebruikte gegevens uit de array bevatten. Ná de loop checken wat het inhoud is dus niet nodig, je kunt beter ín de loop kijken wat het is ;).
 
Jelle Posthuma

Jelle Posthuma

30/10/2008 10:22:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$toondata
= array("20-10-2008"=>"30-10-2008","05-01-2009"=>"15-01-2009");
?>


Trouwens, variables moet je buiten quotes houden:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
echo $datumnu; // data checken
echo $begin; // data checken
echo $eind;  // data checken
echo $toondata;  //data checken
?>


// EDIT //

Jezpur, was me net voor met exact dezelde tips :P.

Trouwens:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo "dit is een ".$var."";
?>


Dat kan nog wel goed gerekend worden, maar is wat onzinnig...
Overzichtelijker en meer aan te raden is dan toch die laatste ."" weg te houden.
Gewijzigd op 01/01/1970 01:00:00 door Jelle Posthuma
 
- SanThe -

- SanThe -

30/10/2008 10:26:00
Quote Anchor link
Jezpur schreef op 30.10.2008 10:21:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
// fout:
echo "dit is een $var";
// goed:
echo "dit is een ".$var."";
// of:
echo "dit is een ".$var;
?>

De tweede
echo "dit is een ".$var."";
is ook niet goed. Je echoot daar 'lucht'. Die "" is zinloos.
Dus gewoon alleen
echo "dit is een ".$var;
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
 
Marc van Gemeren

Marc van Gemeren

30/10/2008 10:35:00
Quote Anchor link
Oké array gemaakt van de "$toondata" , variabele buiten quotes gehaald.

En heel belangrijk even de datum veranderd naar 01-11-2008 want ik wil hem vandaag nog wel weergeven.

Wanneer ik nu het script laat lopen krijg ik het volgende geechoëd :

niet de juiste datum (maar de datum valt weltussen de gevraagde)
niet de juiste datum ( waarvoor wordt dit weergegeven?)
30-10-2008 ( dit geeft hij waarschijnlijk weer voor $datumnu)
05-01-2009 ( dit voor $begin)
15-01-2009 ( dit voor $eind)
Array (dit voor toondata)

Iets werkt dus nog niet naar behoren, het gaat natuurlijk om de eerste weergave van "niet de juiste datum" aangezien de datum van vandaag wel juist is.

De andere echo's haal ik toch weer weg maar wilde ook graag zien wat die weergaven.
 
- SanThe -

- SanThe -

30/10/2008 10:43:00
Quote Anchor link
De if() werkt niet zoals jij denkt. Dat komt omdat je een verkeerd format gebruikt voor de datum.
Als je 01-11-2008 vergelijkt met 31-01-1999 dan is 31-01-1999 groter dan 01-11-2008 om de simpele reden dat er vanuit het meest linker character wordt gekeken. En 3 is groter dan 0.
Om met datums te rekenen gebruik je altijd het YYYY-mm-dd format
 
Jelle Posthuma

Jelle Posthuma

30/10/2008 10:43:00
Quote Anchor link
$datumnu = '30-10-2008';

Dus het is logisch dat de 1e item in die toondata array niet gaat werken.
Die eerste check van datumnu > begin, dat is true, maar datumnu < eind, daar gaat ie fout.
Want $datumnu is niet kleiner dan 30-10-2008, maar gelijk aan...

De 2e gaat ook fout, daar heb je "$datumnu > $begin"
En ie begin datum van de 2e item in die toondata array, is groter dan datum nu, niet andersom.
Oftewel, is is volkomen logisch dat ze allebij naar de else toe gaan.

// EDIT //

En kijk naar SanThe's reactie hier boven.
Je telt hier niet met hele datums, maar met 3 blokjes integers.
Eerst jaar vergelijken, dan maand en dan pas dag.
Dus:

$datumnu = date('Y-m-d');

En de waarden in de array: JJJJ-MM_DD.
Gewijzigd op 01/01/1970 01:00:00 door Jelle Posthuma
 
Marc van Gemeren

Marc van Gemeren

30/10/2008 11:29:00
Quote Anchor link
Oke, het scriptje is nu als volgt :

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

$datumnu
= date('Y-m-d');

$toondata = array ("2008-10-20"=>"2008-11-01",
                    "2009-01-05"=>"2009-01-15");

foreach($toondata as $begin => $eind) {
  if($datumnu > $begin && $datumnu < $eind)
  {

    
    echo "de juiste datum" ;// toon
  
  }
  else
  {
  
    echo "niet de juiste datum"; // niet tonen
    
  }
}

?>


Als ik het nu probeer krijg ik terug : "dejuistedatumnietdejuistedatum"
Wanneer ik de $datumnu verander in date(YYYY-mm-dd) krijg ik terug : "nietdejuistedatumnietdejuistedatum"

Nu begrijp ik niet waarom ik 2 keer een waarde terug krijg. Ik wil alleen een juiste waarde terug krijgen als de datum tussen $begin en $eind klopt. En een "else" als de datum niet klopt.

Het gaat uiteindelijk om plaatjes als een soort waarschuwing. Dus als de datum tussen $begin en $eind valt het plaatje weergeven anders een ander plaatje.

Ben waarschijnlijk erg lastig voor een simpel scriptje in jullie ogen, maar ik doe mijn best. Alvast bedankt alweer.
Gewijzigd op 01/01/1970 01:00:00 door Marc van Gemeren
 
- SanThe -

- SanThe -

30/10/2008 11:37:00
Quote Anchor link
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
<?php
$datumnu
= date('Y-m-d');
$toondata = array ("2008-10-20"=>"2008-11-01",
                    "2009-01-05"=>"2009-01-15");

$okee = false;
foreach($toondata as $begin => $eind)
{

    if($datumnu > $begin && $datumnu < $eind)
    {

        $okee = true;
    }
}

if($okee)
{

    echo "de juiste datum" ;// toon
}
else
{
    echo "niet de juiste datum"; // niet tonen
}
?>
 
Jelle Posthuma

Jelle Posthuma

30/10/2008 12:08:00
Quote Anchor link
@SanThe, nu voor hem nog een kleine uitleg waarom hiuj 2x een bericht krijgt:

In die $toondata array, staan 2 waarden (en 2 keys), die foreach loopt door elke waarde heen (2x dus), en aangezien jij echoëd binnen die foreach, zal die ook 2x die echo doen.
Zoals SanThe dat heeft, gaat ie eerst naar de 1e waarde kijken, vergelijken, en dan $okee op true of false zetten, dan kijkt ie naar de 2e waarden, dan gaat ie $okee overschijven met een true of false aan de hand van of die waarde wel in je if boompje past.

Wat me gelijk brengt op issue met het bovenstaande script:

Het maakt niet uit wat de 1e waarde in de array is, zolang de 2e waarde klopt, dan geeft ie sowieso een true terug. (Ook als de 1e dus false is)
Dan kan je dus beter zo iets doen:

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
<?php
$datumnu
= date('Y-m-d');
$toondata = array ("2008-10-20"=>"2008-11-01",
                    "2009-01-05"=>"2009-01-15");

$okee = 0;
foreach($toondata as $begin => $eind)
{

    if($datumnu > $begin && $datumnu < $eind)
    {

        $okee++;
    }
}

if($okee == count($toondata))
{

    echo "de juiste datum" ;// toon
}
else
{
    echo "niet de juiste datum"; // niet tonen
}
?>
 
- SanThe -

- SanThe -

30/10/2008 12:19:00
Quote Anchor link
Jelle Posthuma schreef op 30.10.2008 12:08:
Het maakt niet uit wat de 1e waarde in de array is, zolang de 2e waarde klopt, dan geeft ie sowieso een true terug. (Ook als de 1e dus false is)

Bij mijn scriptje is altijd minimaal 1 array()-waarde waar. Het is mij ook niet echt duidelijk of er 1 of dat ze allemaal waar moeten zijn. Wel scherp opgemerkt trouwens.
 
Jelle Posthuma

Jelle Posthuma

30/10/2008 13:13:00
Quote Anchor link
SanThe schreef op 30.10.2008 12:19:
Jelle Posthuma schreef op 30.10.2008 12:08:
Het maakt niet uit wat de 1e waarde in de array is, zolang de 2e waarde klopt, dan geeft ie sowieso een true terug. (Ook als de 1e dus false is)

Bij mijn scriptje is altijd minimaal 1 array()-waarde waar. Het is mij ook niet echt duidelijk of er 1 of dat ze allemaal waar moeten zijn. Wel scherp opgemerkt trouwens.

Geef ik je gelijk in.
Eerst stond het in een foreach waardoor je individueel de uitkomst kon zien.
Maarja, zolang de TS maar snapt hoe het in elkaar moet zitten aan de hand van je voorbeeld.
Voor de TS is het nu kwestie van uitbreiden zo hij het wilt, de basis staat er.
 
Jesper Diovo

Jesper Diovo

30/10/2008 13:46:00
Quote Anchor link
SanThe schreef op 30.10.2008 10:26:
Jezpur schreef op 30.10.2008 10:21:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
// fout:
echo "dit is een $var";
// goed:
echo "dit is een ".$var."";
// of:
echo "dit is een ".$var;
?>

De tweede
echo "dit is een ".$var."";
is ook niet goed. Je echoot daar 'lucht'. Die "" is zinloos.
Dus gewoon alleen
echo "dit is een ".$var;


Ik bedoelde eigenlijk dat je na een var nog wel door kan gaan met tekst. Had ik misschien beter zo kunnen doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo "dit is een ".$var.", toch?";
?>
 
Marc van Gemeren

Marc van Gemeren

30/10/2008 15:25:00
Quote Anchor link
Kijk zo leren we nog eens wat, en als ik me al niet blind had zitten staren had ik dit eigenlijk ook al wel moeten vinden.

Vele malen dank voor de hulp.
 



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.