Hallo,

Ik wil binnen mijn website een PHP-functie aanroepen, maar alleen bij de eerste pageload. Dus niet als pagina ververst wordt of opnieuw geladen wordt. De functie is voor een bezoekersteller, vandaar.

Vond dit antwoord:
https://stackoverflow.com/a/25070971

Ben hier mee aan de slag gegaan en dit in mijn PHP paginatemplate gezet:


<?php
echo '<script type="text/javascript">';
echo 'if (!sessionStorage.alreadyClicked) { '.mijn-functie().' sessionStorage.alreadyClicked = 1; }';
echo '</script>';
?>


Maar de functie blijft elke keer uitgevoerd worden, als ik pagina ververs.

Als ik een alert ipv mijn-functie() toe voeg werkt het wél (alert wordt niet getoond als ik pagina ververs).

Doe ik iets verkeerd?

Guido
@Thomas

>> Maar waar wordt deze informatie elders vastgelegd?

Ik neem aan dat dit slechts een stukje van de code is en dat het daadwerkelijke aantal in de database wordt opgeslagen.

@Ward

Wat bedoel je precies te zeggen? Heeft WordPress al een ingebouwde functionaliteit om paginabezoeken te tellen?
Ik sla de value (het aantal views) per pagina/bericht op in een tabel, middels de WordPress functie update_post_meta().

Nogmaals, het is een simpele teller. Ik doe er verder niets mee. Naast het gebruik van een sessie sluit ik ingelogde gebruikers uit (dat kan wel middels een WordPress functie).
Ja, er zijn plugins die het vast beter doen, maar die zijn vaak bloated en hebben features die ik niet gebruik.

Guido
<?php
// start hier ergens je sessie
// ...

$currentPage = function_for_getting_current_page_id(); // bepaal huidige pagina

if (false === isset($_SESSION['pages'][$currentPage])) {
    // tel pagina op een of andere manier
    // ...

    // voeg pagina toe aan $_SESSION
    $_SESSION['pages'][$currentPage] = true;
}
?>

Dat is alles?
>> if (false === isset($_SESSION['pages'][$currentPage]))

Ik doe gewoon zo :)

if (!isset($_SESSION['pages'][$currentPage]))
Kan ook, maar de 'Yoda'-techniek . het leest veel lekkerder, volgens sommige ontwikkelaars, en zorgt ervoor dat je oplettender bent bij programmeren.

Check de voorbeelden in de link maar ;-)
>> het leest veel lekkerder

Ik vind het juist raar lezen ... maar zal wel een persoonlijk dingetje zijn :)
Een ! -de negatie-operator- zie je nog wel eens over het hoofd. En als je deze weg kunt laten, dus als je bijvoorbeeld zoiets hebt:
if (!A) {
    B
} else {
    C
}

Dan kun je het omdraaien zodat je niet eens een ! hoeft te gebruiken:
if (A) {
    C
} else {
    B
}

Als je een ! op een of andere manier kunt weglaten leest dat doorgaans prettiger.
>> Als je een ! op een of andere manier kunt weglaten leest dat doorgaans prettiger.

Wat ik al zeg ... dat is dan iets persoonlijks. Ik vind dat 'omgekeerde' juist minder prettig om te lezen.
Ozzie PHP op 28/08/2020 22:27:59
Wat ik al zeg ... dat is dan iets persoonlijks. Ik vind dat 'omgekeerde' juist minder prettig om te lezen.

Dan vorm je wellicht de uitzondering op de regel en ben je waarschijnlijk de enige die nooit over een ! heen heeft gelezen in code.

Een regel met false === of het omkeren van de codeblokken om zo maar het gebruik van de negatie-operator te voorkomen zorgt er waarschijnlijk vaker voor dat je code in 1x goed leest dan wanneer je een ! gebruikt. Hiermee ga je leesfouten uit de weg, wat mij een goede gewoonte lijkt en daarmee het niveau van persoonlijke voorkeur ontstijgt (het dient een groter doel dan enkel jezelf te plezieren met dit soort constructies).

Ik kan mij ook heel goed voorstellen dat dit soort dingen worden vastgelegd in codeconventies. Al leest dit niet altijd voor iedereen even prettig, het heeft nog steeds tot doel om code minder foutgevoelig en kwalitatief beter te maken.

Ik heb het trouwens ook niet zozeer over deze "eenvoudige" gevallen, maar als je je bedient van dit soort praktijken zet je gewoon de deur open voor meer ellende. Denk bijvoorbeeld aan wat minder triviale voorbeelden waarbij je een soort "dubbele ontkenning" krijgt in de vorm van een Boolse variabele in combinatie met de negatie-operator, bijvoorbeeld: !$doorClosed. Dit ontwerp mondt uiteindelijk uit in slechter leesbare code die een stuk minder intuïtief is dan bijvoorbeeld $doorOpen.

Stop je vervolgens meerdere van dit soort constructies in een predikaat (Bools statement) en strooi je hier wat && en || overheen dan moet je op een gegeven moment een waarheidstabel gaan uitschrijven om uit te vinden wanneer het statement tot true evalueert en of vervolgens het ene of het andere codeblok wordt uitgevoerd. Dit zul je waarschijnlijk toch/ook moeten doen wanneer je deze code niet geschreven hebt en je het werk van iemand anders aan het debuggen bent. En dan kom je misschien na lange tijd erachter dat er één randgeval was die niet klopte waardoor alles in de soep liep...

Dit soort constructies met ongelukkig gekozen Boolse variabelen (of liever gezegd "ontkenningsvariabelen") in combinatie met negatie-operatoren leveren uitsluitend hoofdpijn op. Maar dit begint dus met het vrijelijk strooien met de negatie-operator. Het stuurt je van begins af aan eigenlijk al het verkeerde pad op.

Je bent natuurlijk vrij om dit niet te doen maar het lijkt mij gewoon makkelijker om dit uberhaupt uit de weg te gaan, dan loop je hier ook nooit tegenaan. Maar misschien moet je dat eerst wel doen voordat dit inzicht ontstaat. Wanneer je ergens geen "last" van hebt is er meestal geen stimulans om iets te veranderen.
Ik snap wel wat je bedoelt, maar ik ben gewend om van links naar rechts te lezen. In m'n hoofd maak ik (voor mij) logische zinnen.

Ik lees dus heel gemakkelijk:

Als xxx niet waar is, dan ...

En hier struikel is:

Als niet waar gelijk is aan xxx, dan ...

Dat moet ik dan als het ware eerst 'vertalen'.

Voor mij klinkt 'als Jantje niet thuis is, dan ...' een stuk logischer dan 'als niet thuis gelijk is aan Jantje, dan ...'.

Maar goed ... ieder z'n voorkeur natuurlijk :)

Reageren