vorige volgende pagina met $var-- en $var++

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mar kla

mar kla

26/03/2024 23:23:22
Quote Anchor link
voor mijn website zit ik met een (vreemd) probleem.

Wat is het geval?
Men kan wedstrijden op vragen, die zijn dan per seizoen gegroepeerd in een overzicht.
Ieder seizoen heeft een seizoen_id.

ik heb het voor elkaar dat er boven in het overzicht staat :

<<< vorige seizoen | huidige seizoen | volgende seizoen >>

De bedoeling is dat je met vorige en volgende kan door bladeren.


via een $get wordt de gevraagde seizoen_id ontvang.
daarmee wordt het gewest seizoen overzicht opgeroepen en getoond.

Dat doe ik met

<<< vorige seizoen | huidige seizoen | volgende seizoen >>
$seizoen_id-1 | seizoen_id | seizoen_id+1

Dat werkt....maar dan zijn er constant errors
PHP Notice: A non well formed numeric value encountered

De $seizoen_id-1 of $seizoen_id+1 is dus niet DE juiste methode om de variabele te verlagen of te verhogen.

Maar als ik $seizoen_id-- en $seizoen_id++ doe werkt het niet :-(
De $seizoen_id++ krijgt een waarde die kleiner is dan het huidige $seizoen_id.

Dit de huidige code waarbij ik de error

PHP Notice: A non well formed numeric value encountered
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
##########################################################
if
    (isset($_GET['id'],$_GET['pid']))
        {
        $season_id = $_GET['id'];
        $player_id = $_GET['pid'];
        }
elseif
    (isset($_GET['id']))
        {$season_id = $_GET['id'];}
else
    {$season_id=$as_current_season_id;} //$as_current_season_id is een globale variable die in de config file wordt gezet
##########################################################



##########################################################
# uitrekenen wat het VORIGE $season_ID moet zijn        ##
##########################################################

if ($season_id<=1) //n.b. er bestaat geen seizoen kleiner dan 1!
{
    $previous_season='';
    }else{
    $prev_season_id=($season_id-1);
    $previous_season='<a href="/'.$var_subject.'/'.$prev_season_id.'/seizoen'.showseason_name($prev_season_id).'.htm" title="ga naar het seizoen '. showseason_name($prev_season_id).'"> &lt; &lt; &lt; Vorige  </a>';
}
##########################################################


##########################################################
## uitrekenen wat het volgende $season_ID moet zijn    ##
##########################################################
if ($season_id==$as_current_season_id) //n.b. er bestaat nog geen seizoen groter dan het huidige seizoen !
    {
    $next_season='';
    }else{
    $next_season_id=($season_id+1);
    $next_season='<a href="/'.$var_subject.'/'.$next_season_id.'/seizoen'.showseason_name($next_season_id).'.htm" title="ga naar het seizoen'.showseason_name($next_season_id).'"> Volgend &gt; &gt; &gt;  </a>';
    }
##########################################################

zou iemand mij misschien kunnen uitleggen wat ik fout doe ?
 
PHP hulp

PHP hulp

27/04/2024 08:19:36
 
- Ariën  -
Beheerder

- Ariën -

27/03/2024 01:42:29
Quote Anchor link
Kijk eens wat voor type het is met var_dump()
 
Ad Fundum

Ad Fundum

27/03/2024 06:28:15
Quote Anchor link
Als ik jouw idee 1-op-1 overneem:
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
<?php

// init
$_GET['id'] = '3';            // van '0' (Lente) tot en met '3' (Winter)
$as_current_season_id = 3;    // globale variable die in de config file wordt gezet
$var_subject = 'Boerenkool';  // onderwerp

/// Is string leeg?

function is_empty(string $s) : bool { return strlen($s) === 0; }

/// Toon naam seizoen
function showseason_name(int $s) : string {
  return ['Lente', 'Zomer', 'Herfst', 'Winter'][abs($s % 4)];
}


$season_id = isset($_GET['id']) && ! is_empty($_GET['id'])
  ?
abs(intval($_GET['id']) % 4) : $as_current_season_id;

$player_id = isset($_GET['pid']) && ! is_empty($_GET['pid'])
  ?
abs(intval($_GET['pid'] % PHP_INT_MAX)) : 0;

// uitrekenen wat het VORIGE $season_ID moet zijn
// n.b. er bestaat geen seizoen kleiner dan 1!

$prev_season_id = $season_id > 0 ? $season_id - 1 : '';
$previous_season = is_int($prev_season_id)
  ?
'<a href="/' . $var_subject . '/' . $prev_season_id . '/seizoen'
      . showseason_name($prev_season_id) . '.htm" title="ga naar het seizoen '
      . showseason_name($prev_season_id) . '"> &lt; &lt; &lt; Vorige  </a>'
  : '';

// uitrekenen wat het volgende $season_ID moet zijn
// n.b. er bestaat nog geen seizoen groter dan het huidige seizoen !

$next_season_id = $season_id < $as_current_season_id ? $season_id + 1 : '';
$next_season = is_int($next_season_id)
  ?
'<a href="/' . $var_subject . '/' . $next_season_id . '/seizoen'
       . showseason_name($next_season_id) . '.htm" title="ga naar het seizoen '
       . showseason_name($next_season_id) . '"> Volgende &gt; &gt; &gt;  </a>'
  : '';

print $previous_season . PHP_EOL
    . $next_season . PHP_EOL;
?>


Mocht je het huidige seizoen niet willen configureren, maar automatisch laten berekenen, dan heb je hier misschien iets aan:
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
<?php

class Seizoen
{
  /** @const MAAND_MAX aantal maanden in een jaar */
  const MAAND_MAX = 12;
  /** @const DAG_MIN minimum aantal dagen in een maand */
  const DAG_MIN = 1;
  /** @const DAG_MAX maximum aantal dagen in een maand */
  const DAG_MAX = 31;
  /** @const DAG_OFFSET dag van eerste maand van seizoen */
  const DAG_OFFSET = 21;
  /** @const aantal seizoenen per jaar */
  const SEIZOENEN = 4;

  /** @var $nummer Seizoensnummer van 0 (Lente) tot en met 4 (Winter) */
  protected $nummer;

  /**
   * C-tor, stelt seizoen in op huidig seizoen
   * @return void (impliciet)
   */


  function __construct()
  {

    $this->nummer = $this->huidig();
  }



  /**
   * Bereken het huidige seizoen
   * @param int $maand van 0 tot en met 11
   * @param int $dag van 0 tot en met 31
   */


  function van_datum(int $maand, int $dag)
  {

    $maand = abs($maand % Self::MAAND_MAX);
    $dag = $dag > Self::DAG_MAX ? Self::DAG_MAX
      : ($dag < Self::DAG_MIN ? Self::DAG_MIN : $dag);
    $maanden_in_seizoen = Self::MAAND_MAX / Self::SEIZOENEN;
    $seizoen = (int) ($maand / $maanden_in_seizoen);
    if ($maand % $maanden_in_seizoen == 0) {
      $offset = $dag < Self::DAG_OFFSET ? 1 : 0;
      $this->nummer = ($seizoen - $offset + Self::MAAND_MAX) % Self::MAAND_MAX;
      return;
    }

    $this->nummer = $seizoen;
  }


  /**
   * Lees het seizoensnummer vanuit een string
   * @param string $n Seizoensnummer
   */


  function van_string(string $n) : int
  {
    $this->nummer = abs(intval($n) % Self::SEIZOENEN);
  }


  /**
   * Gebruik het huidige seizoen
   */


  function huidig()
  {

    $this->van_datum(Date('n') - 1, Date('j'));
  }



  /**
   * Lees de seizoensnaam
   * @return string Naam van het seizoen
   */


  function naam()
  {

    return ['Lente', 'Zomer', 'Herfst', 'Winter']
      [
$this->nummer];
  }

}
  // class Seizoen

$seizoen_huidig = new Seizoen;
print $seizoen_huidig->naam();
?>
Gewijzigd op 27/03/2024 06:36:41 door Ad Fundum
 
Mar kla

mar kla

27/03/2024 11:08:14
Quote Anchor link
- Ariën - op 27/03/2024 01:42:29:
Kijk eens wat voor type het is met var_dump()


De var_dump() en andere tests om de waarde van de variabele te controleren ben ik helaas niet veel wijzer van geworden. :-(
 
- Ariën  -
Beheerder

- Ariën -

27/03/2024 11:10:34
Quote Anchor link
Ik denk dat je wel wat wijzer zou worden als je de uitvoer van die functie deelde. ;-)
 
Mar kla

mar kla

27/03/2024 11:17:16
Quote Anchor link
Ad Fundum op 27/03/2024 06:28:15:
Als ik jouw idee 1-op-1 overneem:
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
<?php

// init
$_GET['id'] = '3';            // van '0' (Lente) tot en met '3' (Winter)
$as_current_season_id = 3;    // globale variable die in de config file wordt gezet
$var_subject = 'Boerenkool';  // onderwerp

/// Is string leeg?

function is_empty(string $s) : bool { return strlen($s) === 0; }

/// Toon naam seizoen
function showseason_name(int $s) : string {
  return ['Lente', 'Zomer', 'Herfst', 'Winter'][abs($s % 4)];
}


$season_id = isset($_GET['id']) && ! is_empty($_GET['id'])
  ?
abs(intval($_GET['id']) % 4) : $as_current_season_id;

$player_id = isset($_GET['pid']) && ! is_empty($_GET['pid'])
  ?
abs(intval($_GET['pid'] % PHP_INT_MAX)) : 0;

// uitrekenen wat het VORIGE $season_ID moet zijn
// n.b. er bestaat geen seizoen kleiner dan 1!

$prev_season_id = $season_id > 0 ? $season_id - 1 : '';
$previous_season = is_int($prev_season_id)
  ?
'<a href="/' . $var_subject . '/' . $prev_season_id . '/seizoen'
      . showseason_name($prev_season_id) . '.htm" title="ga naar het seizoen '
      . showseason_name($prev_season_id) . '"> &lt; &lt; &lt; Vorige  </a>'
  : '';

// uitrekenen wat het volgende $season_ID moet zijn
// n.b. er bestaat nog geen seizoen groter dan het huidige seizoen !

$next_season_id = $season_id < $as_current_season_id ? $season_id + 1 : '';
$next_season = is_int($next_season_id)
  ?
'<a href="/' . $var_subject . '/' . $next_season_id . '/seizoen'
       . showseason_name($next_season_id) . '.htm" title="ga naar het seizoen '
       . showseason_name($next_season_id) . '"> Volgende &gt; &gt; &gt;  </a>'
  : '';

print $previous_season . PHP_EOL
    . $next_season . PHP_EOL;
?>


Mocht je het huidige seizoen niet willen configureren, maar automatisch laten berekenen, dan heb je hier misschien iets aan:
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
<?php

class Seizoen
{
  /** @const MAAND_MAX aantal maanden in een jaar */
  const MAAND_MAX = 12;
  /** @const DAG_MIN minimum aantal dagen in een maand */
  const DAG_MIN = 1;
  /** @const DAG_MAX maximum aantal dagen in een maand */
  const DAG_MAX = 31;
  /** @const DAG_OFFSET dag van eerste maand van seizoen */
  const DAG_OFFSET = 21;
  /** @const aantal seizoenen per jaar */
  const SEIZOENEN = 4;

  /** @var $nummer Seizoensnummer van 0 (Lente) tot en met 4 (Winter) */
  protected $nummer;

  /**
   * C-tor, stelt seizoen in op huidig seizoen
   * @return void (impliciet)
   */


  function __construct()
  {

    $this->nummer = $this->huidig();
  }



  /**
   * Bereken het huidige seizoen
   * @param int $maand van 0 tot en met 11
   * @param int $dag van 0 tot en met 31
   */


  function van_datum(int $maand, int $dag)
  {

    $maand = abs($maand % Self::MAAND_MAX);
    $dag = $dag > Self::DAG_MAX ? Self::DAG_MAX
      : ($dag < Self::DAG_MIN ? Self::DAG_MIN : $dag);
    $maanden_in_seizoen = Self::MAAND_MAX / Self::SEIZOENEN;
    $seizoen = (int) ($maand / $maanden_in_seizoen);
    if ($maand % $maanden_in_seizoen == 0) {
      $offset = $dag < Self::DAG_OFFSET ? 1 : 0;
      $this->nummer = ($seizoen - $offset + Self::MAAND_MAX) % Self::MAAND_MAX;
      return;
    }

    $this->nummer = $seizoen;
  }


  /**
   * Lees het seizoensnummer vanuit een string
   * @param string $n Seizoensnummer
   */


  function van_string(string $n) : int
  {
    $this->nummer = abs(intval($n) % Self::SEIZOENEN);
  }


  /**
   * Gebruik het huidige seizoen
   */


  function huidig()
  {

    $this->van_datum(Date('n') - 1, Date('j'));
  }



  /**
   * Lees de seizoensnaam
   * @return string Naam van het seizoen
   */


  function naam()
  {

    return ['Lente', 'Zomer', 'Herfst', 'Winter']
      [
$this->nummer];
  }

}
  // class Seizoen

$seizoen_huidig = new Seizoen;
print $seizoen_huidig->naam();
?>


@Ad Fundum dank voor de uitgebreide reactie.

De seizoen zijn niet die 4 van Vivaldi ;-) maar competitieseizoenen, te weten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
1=1905-1906  //het eerste seizoen ooit
2=1906-1907
3=1907-1908
...
...
117=2021-2022
118=2022-2023
119=2023-2024   // het huidige seizoen

[s]120=2024-2025 [/s] die waarde bestaat echter nog niet.

op regel 17 zet jij een % 4. die waarde snap ik niet (ligt aan mijn beperkte PHP kennis) maar kan ik daar $as_current_season_id plaatsen?
 
Ad Fundum

Ad Fundum

27/03/2024 12:03:56
Quote Anchor link
Die waarde is het aantal seizoenen - per jaar in mijn voorbeeld.
Het procentteken is modulo, die geeft de restwaarde van een deling.

Je kunt in plaats van 4 ook $as_current_season_id gebruiken, alleen moet je dan voor de 'off by one' corrigeren voor het feit dat de nummering van seizoenen niet start bij 0, maar bij 1.
 
Ivo P

Ivo P

27/03/2024 12:08:28
Quote Anchor link
Ik zie niet helemaal wat het issue is met je raargevormde getallen is.

Maar waar ik vaak de voorkeur aan geef, is om niet het volgende ID aan te nemen als "$huidige + 1", omdat het voor kan komen dat in je database de reeks onderbroken wordt.
Bijvoorbeeld omdat seizoen 2020 2x had ingevoerd en daarom 1x gewist had.
Of omdat je eerst seizoen 2025 invoerde met id = 120 en daarna pas 2024 wat id 121 kreeg.

Ik doe (deed) dan vaker:
<a href="seizoen?huidige=$huidigeSeizoen&nav=volgende">volgende</a>

Je kunt dan in je script op allerhande manieren uitzoeken of er een volgende ís, en welk id daar dan bij hoort.

Mogelijk lost dat ook je probleem op, al kan raar geplaatst = teken ook een oorzaak zijn.
 
Mar kla

mar kla

27/03/2024 16:35:01
Quote Anchor link
- Ariën - op 27/03/2024 11:10:34:
Ik denk dat je wel wat wijzer zou worden als je de uitvoer van die functie deelde. ;-)

:-)

als ik $season_id=118 geef

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
echo var_dump($season_id, $prev_season_id, $next_season_id )


dan krijg ik dit resultaat :-(
string(3) "118", init(117), init(119)

Toevoeging op 27/03/2024 16:46:24:

Ivo P op 27/03/2024 12:08:28:
Ik zie niet helemaal wat het issue is met je raargevormde getallen is.

Maar waar ik vaak de voorkeur aan geef, is om niet het volgende ID aan te nemen als "$huidige + 1", omdat het voor kan komen dat in je database de reeks onderbroken wordt.
Bijvoorbeeld omdat seizoen 2020 2x had ingevoerd en daarom 1x gewist had.
Of omdat je eerst seizoen 2025 invoerde met id = 120 en daarna pas 2024 wat id 121 kreeg.

Ik doe (deed) dan vaker:
<a href="seizoen?huidige=$huidigeSeizoen&nav=volgende">volgende</a>

Je kunt dan in je script op allerhande manieren uitzoeken of er een volgende ís, en welk id daar dan bij hoort.

Mogelijk lost dat ook je probleem op, al kan raar geplaatst = teken ook een oorzaak zijn.


Er zal iets aan de hand zijn met de juiste invulling van één van de variabele, het script werkt wel maar PHP vindt het toch niet zo lekker en geeft daarom een warning

Gelukkig is in mijn geval de tabel seizoen juist gevuld

Ga straks ff kijken of de andere tips de oplossing zijn. iig dank voor je reactie


Toevoeging op 27/03/2024 17:04:04:

Ad Fundum op 27/03/2024 12:03:56:
Die waarde is het aantal seizoenen - per jaar in mijn voorbeeld.
Het procentteken is modulo, die geeft de restwaarde van een deling.

Je kunt in plaats van 4 ook $as_current_season_id gebruiken, alleen moet je dan voor de 'off by one' corrigeren voor het feit dat de nummering van seizoenen niet start bij 0, maar bij 1.


Dit gedeelte heb ik van je overgenomen (met bronvermelding in de code :-)

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
// uitrekenen wat het VORIGE $season_ID moet zijn
// n.b. er bestaat geen seizoen kleiner dan 1!
$prev_season_id = $season_id > 0 ? $season_id - 1 : '';
$previous_season = is_int($prev_season_id)
  ? '<a href="/' . $var_subject . '/' . $prev_season_id . '/seizoen'
      . showseason_name($prev_season_id) . '.htm" title="ga naar het seizoen '
      . showseason_name($prev_season_id) . '"> &lt; &lt; &lt; Vorige  </a>'
  : '';

// uitrekenen wat het volgende $season_ID moet zijn
// n.b. er bestaat nog geen seizoen groter dan het huidige seizoen !
$next_season_id = $season_id < $as_current_season_id ? $season_id + 1 : '';
$next_season = is_int($next_season_id)
  ? '<a href="/' . $var_subject . '/' . $next_season_id . '/seizoen'
       . showseason_name($next_season_id) . '.htm" title="ga naar het seizoen '
       . showseason_name($next_season_id) . '"> Volgende &gt; &gt; &gt;  </a>'
  : '';


en a) het werkt b) ik krijge geen warnings of errors meer

m.a.w. Thanks!
 



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.