Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

[PHP] Styleswitch probleem

Remytje
20 antwoorden
  • [code:1:03830731fd]
    $cookie_naam = "htb_opmaak";

    if($_GET["opmaak"] != "")
    {
    setcookie("$cookie_naam", $_GET["opmaak"]);
    $style = $_COOKIE["$cookie_naam"];
    }
    elseif(!$_COOKIE["$cookie_name"] && ($_GET["opmaak"] == ""))
    {
    $style = "heineken";
    }
    else
    {
    $style = $_COOKIE["$cookie_naam"];
    }[/code:1:03830731fd]In HTML > [code:1:03830731fd] <link rel="stylesheet" type="text/css" href="opmaak/<?php echo $style; ?>.css" />[/code:1:03830731fd]

    Als men de site binnenkomt, dan kom je binnen met de opmaak 'heineken'. Nu heb ik ook een opmaak, grolsch, en die kun je aanklikken met de volgende link[code:1:03830731fd]<p><a href="index.php?inhoud=opmaak_wissel&opmaak=grolsch">grolsch</a></p>[/code:1:03830731fd]Als je die aanklikt, dan zie je de grolsch opmaak. Maar als je dan een ander link aanklikt, dan zie je weer de heineken opmaak.
    Dit is uiteraard niet de bedoeling. De waarde 'grolsch' is toch opgelsagen in het cookie? waardoor het toch grolsch moet blijven totdat het weer in een link wordt gedefineerd?

    Online voorbeeld: http://htb.ath.cx
  • Je kan ook met sessies werken en de opmaak in een sessionvariabele opslaan.

    Enne zet die Grolsch als standaard. :wink:
  • [quote:96687d6284="Sjoerd Boerhout"]Je kan ook met sessies werken en de opmaak in een sessionvariabele opslaan.

    Enne zet die Grolsch als standaard. :wink:[/quote:96687d6284]eeh, en hoe doen we dat? :-?
  • Hier staat een uitleg:

    http://www.phpfreakz.nl/artikelen.php?aid=39&print=1
  • Maar stel wil iemand altijd het grolsch achtergrond. Dan moet ie dat elke keer instellen. Dat is niet echt handig.
    Daarom zou ik het tcoh liever met cookies doen. Iemand een tip om de code ietstje te verbetern?
  • En als je nou wanneer iemand een andere stijl selecteerd die style in een cookie opslaat en als sessionvariabele aanmaakt.
    Wanneer iemand de site weer bezoekt lees je het cookie uit en zet je hem meteen als sessionvariabele.
  • mm, dat kan ik idd doen jah. Zal ff kijken.
    (als iemand een verbetering voor de code heeft, natuurlijk altijd welkom :D )
  • [quote:bc1f8c5a43="Sjoerd Boerhout"]En als je nou wanneer iemand een andere stijl selecteerd die style in een cookie opslaat en als sessionvariabele aanmaakt.
    Wanneer iemand de site weer bezoekt lees je het cookie uit en zet je hem meteen als sessionvariabele.[/quote:bc1f8c5a43]En wat voor voordeel biedt dit? Het is alleen maar extra werk voor niets.

    [quote:bc1f8c5a43="Johnny321"][code:1:bc1f8c5a43]
    setcookie("$cookie_naam", $_GET["opmaak"]);
    $style = $_COOKIE["$cookie_naam"];
    [/code:1:bc1f8c5a43][/quote:bc1f8c5a43]Dit kan niet. Met setcookie wordt een cookie gezet, door dit in de header te zetten (er mag dus nog niets verstuurd zijn). Bij de volgende request is het pas beschikbaar in de $_COOKIE-array, dus niet direct.

    -Rémy
  • Kweet niet of je de site gezien hebt, maar het is meer het probleem dat de cookie (volgens mij) maar een keer uitgelezen wordt, en daarna terug gaat naar het heineken opmaak.
    Probeer maar es de opmaak 'grolsch' uit; dan zie je dat die een keer verschijnt, en na het aanklikken van een link (maakt niet uit welke) dat 'ie dan weer teruggaat naar de heineken opmaak.
  • Ik heb 't ff met Mozilla gecontroleerd, de cookie wordt juist weggeschreven. Wat wel een probleem is, is dat de nieuwe stijl maar tijdelijk wordt toegepast, maar dat is al eerder gezegd. Hieronder ook een aangepaste code, let vooral op de opmerking van Rémy, dat voorkomt een hoop fouten. Daarnaast moet je beter met aanhalingstekens leren werken…[code:1:6c30e4600d]// Cookie naam definieren
    $cookie_naam = "htb_opmaak";

    // Controle op variabelen in de URI
    if($_GET["opmaak"] != ""){
    setcookie($cookie_naam, $_GET["opmaak"]);
    $style = $_GET["opmaak"];

    // Geen variabele via URI, wellicht al eentje in cookie?
    }elseif($_COOKIE[$cookie_name] != ""){
    $style = $_COOKIE[$cookie_name];

    // Geen variabele via URI of cookie: standaard waarde
    }else{
    setcookie($cookie_naam, "heineken");
    $style = "heineken";
    }[/code:1:6c30e4600d]Zoiets zal het moeten zijn, echter niet getest.

    - Bas
  • Zal et proberen, alvast bedankt.

    [edit]
    Ook deze werkt niet :(, heb em inmiddels in de site geimpleteerd. Nog een ingeving toevallig?
  • ahum
    [code:1:beda9fba24]
    }elseif($_COOKIE[$cookie_name] != ""){
    $style = $_COOKIE[$cookie_name];[/code:1:beda9fba24]
    $cookie_name??

    $cookie_naam!!

    Typfout van mezelf, m'n excuus. Nu werkt het wel :oops:
  • Ik heb even gekeken, en het werkt ook hier! ;)

    Nog ff een vraagje: heb je mijn versie gebruikt of je eigen versie? (Just wondering…)

    - Bas
  • [quote:3f8411b6da="Johnny321"]Typfout van mezelf, m'n excuus. Nu werkt het wel :oops:[/quote:3f8411b6da]:lol:, had er ook over heen gelezen.

    Misschien nog een opmerking. Ik zou zelf de code bijv. als volgt schrijven:
    [code:1:3f8411b6da]// check if style is in cookie
    $style = !empty($_COOKIE['style']) ? $_COOKIE['style'] : 'heineken';

    // check if style is in URI
    $style = !empty($_GET['style']) ? $_GET['style'] : 'heineken';

    // check if style exist and set cookie
    switch($style)
    {
    case 'grolsh':
    setcookie('style', 'grolsh');
    break;
    case 'heineken':
    setcookie('style', 'heineken');
    break;
    default: // if wrong style is given
    setcookie('style', 'heineken');
    $style = 'heineken';
    }[/code:1:3f8411b6da]Dit vind ik zelf (maar wie ben ik) een stuk duidelijker, simpeler en de verschillende taken/acties zijn gescheiden.

    Ook wordt nu gecontroleerd of de style wel kan (zo niet dan krijg je de default waarde), zodat er geen mogelijke hacks gedaan kunnen worden of foutmeldingen te zien zijn (stel ik doe bavaria in de querystring).

    Ook heb ik die $cookie_naam verwijdert, want dit heeft geen nut: is het nodig dat een cookievariabele van naam kan veranderen? Dat lijkt mij niet. Misschien dat je dit in de ontwikkelingsfase nog wilt aanpassen, maar dan zou ik search&replace gebruiken in je editor.

    Het enige is dat er nu elke keer een cookie wordt geschreven met mijn code…, maar dit zou ik nog kunnen aanpassen als dat in de performance scheelt (maar dit is gewoon een ongetest voorbeeldje van hoe ik het zou doen ;)).

    -Rémy
  • [quote:c4165af0b5="BasHamar"]Ik heb even gekeken, en het werkt ook hier! ;)

    Nog ff een vraagje: heb je mijn versie gebruikt of je eigen versie? (Just wondering…)

    - Bas[/quote:c4165af0b5]Jouw versie, m'n eigen werkte ondanks alles ook niet.
    [quote:c4165af0b5="Remytje"][quote:c4165af0b5="Johnny321"]Typfout van mezelf, m'n excuus. Nu werkt het wel :oops:[/quote:c4165af0b5]:lol:, had er ook over heen gelezen.

    Misschien nog een opmerking. Ik zou zelf de code bijv. als volgt schrijven:
    [code:1:c4165af0b5]// check if style is in cookie
    $style = !empty($_COOKIE['style']) ? $_COOKIE['style'] : 'heineken';

    // check if style is in URI
    $style = !empty($_GET['style']) ? $_GET['style'] : 'heineken';

    // check if style exist and set cookie
    switch($style)
    {
    case 'grolsh':
    setcookie('style', 'grolsh');
    break;
    case 'heineken':
    setcookie('style', 'heineken');
    break;
    default: // if wrong style is given
    setcookie('style', 'heineken');
    $style = 'heineken';
    }[/code:1:c4165af0b5]Dit vind ik zelf (maar wie ben ik) een stuk duidelijker, simpeler en de verschillende taken/acties zijn gescheiden.[/quote:c4165af0b5]mm, stel ik heb 300 verschillende styles…. dan krijg je een hele lange switch, ben ik niet kapot van.[quote:c4165af0b5="Remytje"]Ook wordt nu gecontroleerd of de style wel kan (zo niet dan krijg je de default waarde), zodat er geen mogelijke hacks gedaan kunnen worden of foutmeldingen te zien zijn (stel ik doe bavaria in de querystring).[/quote:c4165af0b5]Dan wordt de naam van de opmaak 'bavaria.css', dan heb je dus gewoon een kale pagina, 'k zie niet in wat voor enorm beveiligingslek hierdoor zou krijgen[quote:c4165af0b5="Remytje"]Ook heb ik die $cookie_naam verwijdert, want dit heeft geen nut: is het nodig dat een cookievariabele van naam kan veranderen? Dat lijkt mij niet. Misschien dat je dit in de ontwikkelingsfase nog wilt aanpassen, maar dan zou ik search&replace gebruiken in je editor. [/quote:c4165af0b5]Heb je op zich gelijk in, maar ik vind het zo makkelijker werken [quote:c4165af0b5="Remytje"]Het enige is dat er nu elke keer een cookie wordt geschreven met mijn code…, maar dit zou ik nog kunnen aanpassen als dat in de performance scheelt (maar dit is gewoon een ongetest voorbeeldje van hoe ik het zou doen ;)).

    -Rémy[/quote:c4165af0b5]
  • [code:1:9e6a4f9429]// check if style is in cookie
    $style = !empty($_COOKIE['style']) ? $_COOKIE['style'] : 'heineken';[/code:1:9e6a4f9429]Dat is toch de verkorte 'if-notatie'?
    Daar ben ik nog niet zo goed in, dus dat doe ik eerst nog niet :oops:
  • [quote:f200c8a61a="Johnny321"][code:1:f200c8a61a]// check if style is in cookie
    $style = !empty($_COOKIE['style']) ? $_COOKIE['style'] : 'heineken';[/code:1:f200c8a61a]Dat is toch de verkorte 'if-notatie'?
    Daar ben ik nog niet zo goed in, dus dat doe ik eerst nog niet :oops:[/quote:f200c8a61a]

    Dat is anders best een leuk iets om mee te werken hoor.

    if-voorwaarde ? <doe dit when true> : <doe dit when false>;

    Voorbeeld:
    int i = 5;

    ( i > 10 ) ? " i = groter dan 10" : "i = niet groter dan 10";
  • [quote:df41f26a5d="Johnny321"]mm, stel ik heb 300 verschillende styles…. dan krijg je een hele lange switch, ben ik niet kapot van.[/quote:df41f26a5d]Maar bij 300 styles zou ik ook geen switch gebruiken, dan zou ik het anders oplossen ;).

    [quote:df41f26a5d="Johnny321"]Dan wordt de naam van de opmaak 'bavaria.css', dan heb je dus gewoon een kale pagina, 'k zie niet in wat voor enorm beveiligingslek hierdoor zou krijgen[/quote:df41f26a5d]Misschien dat dit geen enorm beveiligingslek is, maar als je een waarde krijgt die je niet verwacht, dan klopt er iets niet. Of jij hebt dan iets fout gedaan of een gebruiker geeft express een verkeerde waarde op (en dat is meestal niet met goede bedoelingen). Omdat je hierop controleert kan je een logmelding laten maken zodra dit gebeurt, zodat je kan bepalen wat er aan de hand is (mogelijke hacker\foutje van jou). Dit zal voor een site zoals jouw niet veel uitmaken, maar stel dat je een site voor een bank aan het programmeren bent. Dan wil ik dit soort info wel weten ;).

    -Rémy
  • [quote:73ad439a8f="Sjoerd Boerhout"][quote:73ad439a8f="Johnny321"][code:1:73ad439a8f]// check if style is in cookie
    $style = !empty($_COOKIE['style']) ? $_COOKIE['style'] : 'heineken';[/code:1:73ad439a8f]Dat is toch de verkorte 'if-notatie'?
    Daar ben ik nog niet zo goed in, dus dat doe ik eerst nog niet :oops:[/quote:73ad439a8f]

    Dat is anders best een leuk iets om mee te werken hoor.

    if-voorwaarde ? <doe dit when true> : <doe dit when false>;

    Voorbeeld:
    int i = 5;

    ( i > 10 ) ? " i = groter dan 10" : "i = niet groter dan 10";[/quote:73ad439a8f]mm, ben er nog steeds niet kapot van.[quote:73ad439a8f="Remytje"][code:1:73ad439a8f]{
    case 'grolsh':
    setcookie('style', 'grolsh');
    break;
    case 'heineken':
    setcookie('style', 'heineken');
    break;
    default: // if wrong style is given
    setcookie('style', 'heineken');
    $style = 'heineken';
    }[/code:1:73ad439a8f][/quote:73ad439a8f]

    dat 'default', wordt die actie dus altijd gedaan als er niet aan de 'cases' wordt voldaan? Ik was deze optie van 'switch' nog niet eerder tegengekomen.
  • [quote:df66215bcd="Johnny321"]dat 'default', wordt die actie dus altijd gedaan als er niet aan de 'cases' wordt voldaan?[/quote:df66215bcd]Ja.

    - Bas

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.