Avatar billede xbobby Nybegynder
14. juli 2003 - 12:20 Der er 21 kommentarer og
1 løsning

Opdateret tæller i en function på sin egen side

Jeg kunne godt tænke mig at have en tæller ligende i en function, lad os kalde variablen i denne tæller for $rigtigt_svar, som selvfølgelig starter den med værdien 0, og lad os kalde function for svar()

Det som jeg så ønsker er at når function svar() bliver kaldt, så bliver der lagt 1 til variablen $rigtigt_svar og denne nye værdi skal functionen, så huske til næste gang den bliver kaldt, hvor der så bliver lagt 1 til variablen igen og så fremdeles, hver gang den kaldes.

Selve functionen skal ligge på side egen side, lad os kalde den for functioner.php og hvis jeg ønsker at hente værdien af variablen $rigtigt_svar, skal jeg kunne gøre det fra en hvilken som helst side hvor jeg lægger dette tag

<? include('funktioner.php');
svar();  ?>

Hvordan gør jeg dette, hvad siger eksperterne?
Avatar billede repox Seniormester
14. juli 2003 - 12:21 #1
Gør du brug af mysql ?
Avatar billede xbobby Nybegynder
14. juli 2003 - 13:12 #2
Ja det gør jeg, men jeg ønsker ikke at benytte den metode hertil, men derimod arrays, som ligger på siden functioner.php, men før jeg når dertil skal jeg lære det trick der gør at en function kan huske en given værdi og opdatere den, når jeg ønsker det. :-)
Avatar billede tballe Nybegynder
14. juli 2003 - 13:23 #3
Hej

Har du overvejet at oprette en tekstfil eks. count.txt, som har variablen liggende. Herefter kan du indlæse variabelværdien og øge  den og skrive resultatet tilbage på tekstfilen.

Hilsen Tballe
Avatar billede xbobby Nybegynder
14. juli 2003 - 14:13 #4
Hej Tballe
Ja den er med i mine overvejelser, og jeg vil klart overveje at bruge den vis det her ikke kan lade sig gøre, men det mener jeg, at det kan.

Jeg læse for en del tid siden at det var noget med en kommando der hed static som kunne få PHP til at huske en variabel inde i en funktion, men hvordan det funker, kan jeg ikke finde ud af.
Avatar billede rtfm Nybegynder
14. juli 2003 - 18:14 #5
Hvis du siger det var noget med "static", selvom jeg da må indrømme, at jeg aldrig har hørt om det, kunne du jo tage et kig her: http://dk.php.net/language.variables.scope
Avatar billede xbobby Nybegynder
14. juli 2003 - 22:24 #6
Hej rftm
Tak for linket, der står noget om static på det link. I mellem tiden har jeg også fundet den bog, som jeg læste det i.

<?php
function test()
{
Avatar billede xbobby Nybegynder
14. juli 2003 - 22:29 #7
Jeg prøver igen:

<?php
function test()
{
static $a = 0;
echo $a;
$a++
}

test();
test();
test();
test();

?>

Det funger "lokalt" altså på samme side, men jeg ved ikke om man kan få det til at fungere globalt ?
Avatar billede raz0 Nybegynder
15. juli 2003 - 15:52 #8
du kunne gøre følgende:

<?php

function svar()
{
    $fp = fopen("./taeller.txt", "rb");
    $rigtigt_svar = intval(fgets($fp, 512));
    fclose($fp);
   
    $rigtigt_svar++;

    $fp = fopen("./taeller.txt", "wb+");
    fwrite($fp, $rigtigt_svar);
    fclose($fp);

    return $rigtigt_svar;
}

print svar();

Husk selvfølgelig at oprette taeller.txt først og giv den skrive rettigheder. Scriptet er som altid ikke testet :P
Avatar billede raz0 Nybegynder
15. juli 2003 - 16:21 #9
Hvis data skal overføres til andre sider er der 4 muligheder:

1. At gemme det i en database eller en tekstfil.
2. At gemme det i en cookie.
3. At gemme det i en PHP session.
4. At gemme det i query string (GET) eller måske en form (POST).
Avatar billede raz0 Nybegynder
15. juli 2003 - 17:04 #10
Ved ikke helt hvad det er du vil, men du kunne også bruge:

<?php

functiono svar()
{
    global $rigtigt_svar;
    $rigtigt_svar++;
    return $rigtigt_svar;
}

print svar();
print svar();
print svar();

?>
Avatar billede xbobby Nybegynder
15. juli 2003 - 19:28 #11
Til Raz0
Selve dit svar fra 17.04 kan jeg ikke bruge, da det stort set hvad jeg skrev 22.29 i går aftes, eneste rigtige forskel er at jeg bruger kommandoen static og du bruger global.

Men det svar du først kommer med er jeg meget begejstret for nemlig den med tekstfilen.

Kan du udvide den til f.eks 5 forskellige tællere i samme txt fil og samtidig lave det så den automatisk nulstiller, når den første gang tages i brug?

Kan du det så er de 60 point dine :-)
Avatar billede raz0 Nybegynder
15. juli 2003 - 21:06 #12
Flere tællere i en fil.. tjae, så bliver det jo straks mere kompliceret.
Prøv med den følgende kode, og ja, jeg har afprøvet den her ;)
Funktionen hent_svar() returnerer et array over de gemte tællere, gem_svar() tager et array som parameter og gemmer det. Arrayet skal indeholde tællerne.
Sig til hvis du ikke forstår det :)

---

<?php

function hent_svar()
{
    $array = array();

    $fp = @fopen("./taeller.txt", "rb");
    if (is_resource($fp))
    {
        while (!feof($fp))
        {
            $string = fgets($fp, 512);
            list($key, $value) = explode("||", $string);
            $array[$key] = $value;
        }
        fclose($fp);
    }

    return $array;
}

function gem_svar($array)
{
    $string = NULL;

    foreach ($array as $key => $value)
        $string .= "$key||$value\n";

    $string = trim($string);

    $fp = fopen("./taeller.txt", "wb+");
    fwrite($fp, $string);
    fclose($fp);
}

$test['test1'] = "test_value_1";
$test['test2'] = "test_value_2";
$test[] = 12;

gem_svar($test);
$test2 = hent_svar();
print_r($test2);

?>
Avatar billede xbobby Nybegynder
15. juli 2003 - 22:17 #13
Hej raz0
Det er meget simpelt, det forstår jeg ikke :-| så jeg har brug for noget hjælpetekst til denne kode, så jeg forstår hvad jeg skal gøre og ligeledes hvordan jeg skal lægge taellerne ind, for dem kan jeg ikke se i dette script.
Jeg venter spændt :-)
Avatar billede raz0 Nybegynder
15. juli 2003 - 23:27 #14
Okay... det der står nedenunder var egenligt for at forklare hvordan det virkede.
Sådan som det er lavet nu tæller den ikke automatisk op, det gør den her derimod. Skulle være nemmere nu :)

---------------
<?php

function hent_taellere()
{
    $array = array();

    $fp = @fopen("./taeller.txt", "rb");
    if (is_resource($fp))
    {
        while (!feof($fp))
        {
            $string = fgets($fp, 256);
            list($key, $value) = explode("||", $string);
            $array[$key] = trim($value);
        }
        fclose($fp);
    }

    return $array;
}

function gem_taellere($array)
{
    $string = NULL;

    foreach ($array as $key => $value)
        $string .= "$key||$value\n";

    $string = trim($string);

    $fp = fopen("./taeller.txt", "wb+");
    fwrite($fp, $string);
    fclose($fp);
}

function taeller($navn)
{
    $taellere = hent_taellere();

    if (isset($taellere[$navn]))
    {
        $taellere[$navn]++;
    }
    else
    {
        $taellere[$navn] = 1;
    }

    gem_taellere($taellere);
    return $taellere[$navn];
}

?>
----------

Okay, det var så funktionerne. Nu til forklaringen ;)
Hvis vi f.eks. siger du vil have en tæller der hedder "abe1", gør du følgende:

taeller("abe1");

Nu vil du have en tæller der hedder "abe1", med værdien 1.
Hvis du bagefter skriver...

print taeller("abe1");

... skulle der gerne komme til at stå 2. Tælleren startede jo på 1 og det er anden gang du kører den nu. Prøv eventuelt at trykke opdater et par gange for at se at tælleren tæller opad.

Hvis du så vil have en anden tæller der hedder "tæller1", kan du f.eks. skrive...

print taeller("tæller1");

Der skulle gerne stå 1 nu. Prøv igen at trykke opdater et par gange og se at tælleren igen tæller opad. Du har nu 2 tæller, en der hedder "abe1" og en der hedder "tæller1". Check eventuelt taeller.txt filen.

Håber det hjalp.
Avatar billede xbobby Nybegynder
16. juli 2003 - 11:26 #15
Hej raz0
Tak for dit meget flotte svar, som jeg har nogle spørgsmål til. Las os sige at jeg har to tællere 1 = rigtigt_svar og 2 forkert_svar. Skal navne på disse to tællere så skrives ned i txt filen af mig eller skal de lægges ind $array = array(); i function hent_taellere() og hvis de skal det skal de så lægge ind med 'rigtigt_svar' => 0, 'forkert_svar' => 0,
Avatar billede xbobby Nybegynder
16. juli 2003 - 11:33 #16
Jeg prøver igen, hvor er det nemt at ramme udfør knappen når man skal rette teksten i den nederste linje :-(

Skal de lægges ind $array = array(); i function hent_taellere() og hvis de skal det skal de så lægge ind med $array = array('rigtigt_svar' => 0, 'forkert_svar' => 0); eller med $array = array('rigtigt_svar', 'forkert_svar'); ?

Hvis du gider ville det være dejligt hvis du ville prøve at retuner et eksempel med de to taellere i kodeform, for jo jeg har læst hvad du skriver, men jeg har det som en andengrads ligning med mange ubekendte jeg ikke kender til og derfor forstår jeg ikke fuldt ud det du skriver, som jo burde være indlysende når man kender alle de ubekendte.
Avatar billede raz0 Nybegynder
16. juli 2003 - 13:04 #17
Den eneste funktion du skal bruge er taeller()
Når du kører taeller("rigtigt_svar"), checker scriptet først om der findes en tæller ved navn "rigtigt_svar" i tekst filen. Hvis der gør det lægges der 1 til tælleren. Hvis tælleren ikke findes endnu laver scriptet selv en tæller med det navn og sætter den til 1. Lige meget hvad retunerer funktionen værdien på tælleren til sidst. Den kan du så f.eks. vælge at print'e.
Se følgende script:

<?php
taeller("rigtigt_svar");
taeller("rigtigt_svar");
print taeller("rigtigt_svar");
?>

Scriptet skulle gerne skrive '3' hvis tælleren da ikke findes i forvejen.
Prøv så at opdater. Nu skulle den gerne sige '6'. Der bliver lagt 1 til tælleren 3 gange.
Avatar billede xbobby Nybegynder
16. juli 2003 - 13:28 #18
Jeg smider lige lidt kode ind, så du kan se hvad det er jeg gør galt?

Jeg får denne fejlmeddelse:

Parse error: parse error, unexpected T_STRING, expecting ')'

function taeller("rigtigt_svar")
{
    $taellere = hent_taellere();

    if (isset($taellere["rigtigt_svar"]))
    {
        $taellere["rigtigt_svar"]++;
    }
    else
    {
        $taellere["rigtigt_svar"] = 1;
    }

    gem_taellere($taellere);
    return $taellere["rigtigt_svar"];
}

?>

</head>

<body>

<?php
taeller("rigtigt_svar");
taeller("rigtigt_svar");
print taeller("rigtigt_svar");
?>

</body>
</html>
Avatar billede raz0 Nybegynder
16. juli 2003 - 13:36 #19
Hmm ja, der er du helt galt på den hehe. Du skulle ikke lave om i funktionen overhovedet, og du skulle selvfølgelig også have de andre funktioner med. Her er et fuldt eksempel *suk* :)

--------------------
<?php

function hent_taellere()
{
    $array = array();

    $fp = @fopen("./taeller.txt", "rb");
    if (is_resource($fp))
    {
        while (!feof($fp))
        {
            $string = fgets($fp, 256);
            list($key, $value) = explode("||", $string);
            $array[$key] = trim($value);
        }
        fclose($fp);
    }

    return $array;
}

function gem_taellere($array)
{
    $string = NULL;

    foreach ($array as $key => $value)
        $string .= "$key||$value\n";

    $string = trim($string);

    $fp = fopen("./taeller.txt", "wb+");
    fwrite($fp, $string);
    fclose($fp);
}

function taeller($navn)
{
    $taellere = hent_taellere();

    if (isset($taellere[$navn]))
    {
        $taellere[$navn]++;
    }
    else
    {
        $taellere[$navn] = 1;
    }

    gem_taellere($taellere);
    return $taellere[$navn];
}

?>

<html>
<head><title>test af tæller</title></head>
<body>

<?php
taeller("rigtigt_svar");
taeller("rigtigt_svar");
print taeller("rigtigt_svar");
?>

</body>
</html>
--------------------

Mit eksempel skulle virke uden at blive ændret overhovedet :)
Avatar billede xbobby Nybegynder
16. juli 2003 - 14:20 #20
Ja ja nok er galt på den, men ikke så galt på den at jeg ikke havde de andre funktioner med - nix du, men det er indrømmet at jeg ikke var klar over hvor smart et script jeg var oppe imod og jeg i virkeligheden bare kunne læne mig tilbage og se dig køre med klatten. Du ved de er lisom hvis man ser en dejlig sild, så er det svært ikke at pille :-)

Tak for din tålmodighed her i sommervarmen, der er 60 velfortjente point afsted til dig.
//xbobby
Avatar billede raz0 Nybegynder
16. juli 2003 - 14:45 #21
Haha, er helt enig om det med silden ;) ... og var så lidt.
Avatar billede xbobby Nybegynder
16. juli 2003 - 16:02 #22
Til Raz0
Her på falderebet har du en smart function, som nulstiller tællerne i txt filen?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester