[php] include in function

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • thegeronimo
  • Registratie: Maart 2002
  • Laatst online: 02-01-2024

thegeronimo

Ich bun ut mer....

Topicstarter
Ik heb een vraagje. Dit progje zorgt ervoor als er geklikt wordt op een hyperlink (bv link.php?go=forum) de waarde a opgehoogd wordt en , met de waarde b niks gebeurt.
Het is dus een counter naar de hoeveelheid clicks.

Deze manier (code 1) werkt, maar is omslachtig. Zoals je ziet zit er in elke if statement eenzelfde functie. Die wil ik dit dus uit laten voeren in een standaard functie linklog() (zie code 2)

Wat de functie doet, is dat ie de hele counter.dat opnieuw opbouwt.
Het probleem is als ik de functie gebruik, dat hij de includes niet meer kent. En dus
niks wegschrijft, alleen de waarde a hoogt hij 1 op, maar waarde b krijgt opeens geen waarde toegekend en gaat dus van de initiële waarde naar niks (leeg dus).
Zet je nu ook die include in de function dan krijgen beide waarden de waarde vanuit de counter.dat en wordt er dus niks opgehoogd.
code:
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
<?php
// filename link.php

if     ($go == "forum") {
    include ("counter.dat");
    $a++;
    $file=fopen ("counter.dat","w"); 
    fputs($file, "<"); 
    fputs($file, "?php $"); 
    fputs($file, "a=$a; $");
    fputs($file, "b=$b; ?");
    fputs($file, ">");
    fclose ($file);
    $url = "http://www.domein.nl/forum/"; }
elseif ($go == "guestbook") { 
    include ("counter.dat");    
    $b++;
    $file=fopen ("counter.dat","w"); 
    fputs($file, "<"); 
    fputs($file, "?php $"); 
    fputs($file, "a=$a; $");
    fputs($file, "b=$b; ?");
    fputs($file, ">"); 
    fclose ($file);
    $url = "http://www.domein.nl/guestbook/"; }
else    {
    $url = "#"; }
Header("Location: $url");
?>


code:
1
2
3
4
5
6
7
8
9
function linklog () {
$file=fopen ("counter.dat","w"); 
    fputs($file, "<"); 
    fputs($file, "?php $"); 
    fputs($file, "a=$a; $");
    fputs($file, "b=$b; ?");
    fputs($file, ">"); 
    fclose ($file);
}


Weet iemand hoe ik toch de functie kan gebruiken, zodat en waarde a opgehoogd wordt en waarde b, die gelijk blijft, opnieuw neergezet wordt.:)

Of een geheel andere oplossing? :?

ps. counter.dat ziet er initieel zo uit

code:
1
2
3
4
5
6
7
<?php
// filename counter.dat

$a=0; 
$b=0;

?>

The only thing to fear is fear itself


Acties:
  • 0 Henk 'm!

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 18-09 19:05
Ten eerste zul de de functie moeten aanroepen met argumenten (a & b). Hoe weet je anders welke waarde a of b heeft?
Ten tweede kun je boven al ge functie, statements ed include("counter.dat"); zetten. Op deze manier wordt counter herkend door alle statements. In je functie hoef je hem niet te kennen, die krijgt immers de waarde van a en b vanuit de statements.

Acties:
  • 0 Henk 'm!

  • thegeronimo
  • Registratie: Maart 2002
  • Laatst online: 02-01-2024

thegeronimo

Ich bun ut mer....

Topicstarter
Als ik hem dus zo maak:
code:
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
//filename link.php

include ("counter.dat");
function linklog() {
    $file=fopen ("counter.dat","w"); 
    fputs($file, "<"); 
    fputs($file, "?php $"); 
    fputs($file, "a=$a; $");
    fputs($file, "b=$b; ?");
    fputs($file, ">"); 
    fclose ($file);
}

if     ($go == "forum") {
    $a++;
    linklog();
    $url = "http://www.domein.nl/forum/"; }
elseif ($go == "guestbook") {   
    $b++;
    linklog();
    $url = "http://www.domein.nl/guestbook/"; }
else    {
    $url = "#"; }
Header("Location: $url");
?>


dan krijg ik dit als counter.dat na uitvoering van bijvoorbeeld "link.php?go=forum"
code:
1
<?php $a=; $b=; ?>

Zoals je zit lege velden die eigenlijk $a=1; $b=0; moesten zijn

met include haalt ie toch de waarden a en b uit counter.dat. Dan zijn die waarden toch bekend.

[ Voor 20% gewijzigd door thegeronimo op 19-02-2003 14:26 ]

The only thing to fear is fear itself


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
wat een omweg zeg :)
Als je dan gewoon 2 getallen in je counters.dat schrijft en niet zo knoeit met php :?

Dus zoiets:
code:
1
2
1
2

PHP:
1
2
3
4
5
6
7
8
9
10
11
function incrementer()
{
    $fp = fopen('counter.dat', 'r+');
    $a  = trim(fgets($fp)); // eerste getal
    $b =  trim(fgets($fp)); //  tweede getal
    $a++;
    rewind($fp); // terug naar het begin
    ftruncate($fp); // leegmaken
    fwrite($fp, "$a\n$b"); // a en b terug schrijven
    fclose($fp); // filepointer sluiten
}

Helaas snapt php geen binary reads/writes, anders kon je nog mooier ermee werken... Dan hoefde je niet eens moeilijk te doen met newlines enzo :)

[ Voor 20% gewijzigd door ACM op 19-02-2003 14:35 ]


Acties:
  • 0 Henk 'm!

  • thegeronimo
  • Registratie: Maart 2002
  • Laatst online: 02-01-2024

thegeronimo

Ich bun ut mer....

Topicstarter
Uhm.... ja, zo kan het ook, maar $a++ moet bij de ene statement staan en $b++ bij de andere statement. Dat gaat hier dus zo niet lukken.?

The only thing to fear is fear itself


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Mijn code zal vast niet precies doen wat jij wil, maar dat zegt nog niet dat dat gelijk maar onbruikbaar als voorbeeld is ;)
je kan het uitbreiden naar zoiets in je counters.dat:
code:
1
2
a=1
b=3


en vervolgens de incrementer uitbreiden met een $countername parameter (ofzo)

naar zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?
function incrementer($update_counter_name)
{
    $counters = array();
    $fp = fopen('counter.dat', 'r+');
    // uitlezen
    while(!feof($fp))
    {
         $line = explode('=', trim(fgets($fp)));
         $counters[$line[0]] = $line[1];
    }
    // ophogen en indien onbekend toevoegen
    $counters[$update_counter_name]++
    // uitschrijven
    rewind($fp); // terug naar het begin
    ftruncate($fp); // leegmaken
    foreach($counters as $name => $value)
    {
        fwrite($fp, "$name=$value\n");
    }
    fclose($fp); // filepointer sluiten
}
?> 


Is ie gelijk geschikt voor een onbeperkt aantal tellers met min of meer willekeurige namen (zolang ze maar geen = bevatten :+ )...

[ Voor 4% gewijzigd door ACM op 19-02-2003 14:51 ]


Acties:
  • 0 Henk 'm!

  • thegeronimo
  • Registratie: Maart 2002
  • Laatst online: 02-01-2024

thegeronimo

Ich bun ut mer....

Topicstarter
Effe voor de duidelijkheid in de statements, moet dus staan:
incrementer(a);

Maar die $name wat moet ik daar mee doen?

The only thing to fear is fear itself


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Als je nou de code leest en probeert te begrijpen? Dat helpt je meer dan erover vragen gok ik.
Je hoeft er zelf namelijk niks mee te doen.

Btw het moet incrementer("a"); zijn trouwens...

Acties:
  • 0 Henk 'm!

  • thegeronimo
  • Registratie: Maart 2002
  • Laatst online: 02-01-2024

thegeronimo

Ich bun ut mer....

Topicstarter
Ik begrijp de code,
maar er waren ; weg dus vandaar dat bij uitvoeren er een error kwam.
En probleempje met ftruncate... opgelost met ftruncate($fp,filesize(counter.dat));
of kan dat makkelijker?
Want de bedoeling daar is dat ie de hele file wist.

The only thing to fear is fear itself


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Humm, ik had niet goed naar de ftruncate functie gekeken, maar ik zou dan naar 0 truncaten, dan weet je zeker dat ie leeg is.
En ik was idd ergens een ; vergeten, kan gebeuren :) Ik heb de code verder ook niet getest ofzo.

Acties:
  • 0 Henk 'm!

  • thegeronimo
  • Registratie: Maart 2002
  • Laatst online: 02-01-2024

thegeronimo

Ich bun ut mer....

Topicstarter
Maar hij doet ut nu....dus bedankt voor de hulp.
Uitlezen voor statistiek is me ook al gelukt.
code:
1
2
3
a=3
b=2
=

The only thing to fear is fear itself

Pagina: 1