PHP script om CSS te wisselen werkt niet meer

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Malloot
  • Registratie: Maart 2005
  • Laatst online: 21-09 16:29

Malloot

bekijk eens wat anders

Topicstarter
Op mijn persoonlijke website (ik was ooit webdesigner 15 jaar geleden) staat een eenvoudig PHP scriptje dat een cookie aanmaakt om met een knop tussen CSS bestanden te kunnen wisselen. Zo kan ik eenvoudig de website in twee talen aanbieden door delen te verbergen. Het is toegepast in 2011.

Een tijd terug kwam ik erachter dat dit opeens niet meer werkt, in geen enkele browser. Er komt nu een lege pagina (nul tekens in de broncode). De knop heb ik verborgen waardoor de website alleen in het Nederlands beschikbaar is.

Dit is de 'taalknop':
code:
1
<div class="nl taalknop"><a href="/taal.php?choice=/engels">English</a></div>


Dit is de php waar naar gelinkt wordt (taal.php):
code:
1
<?php $Year =31536000 + time(); setcookie ('style', $choice, $year); header("Location: $HTTP_REFERER"); ?>


Dit is het script dat in de <head> van elke pagina staat:
code:
1
<link rel="stylesheet" type="text/css" href="<?php echo (!$style)?'nederlands':$style ?>.css" />


En dit is nederlands.css
code:
1
2
3
4
5
6
7
8
@charset "utf-8";

.en { /* Engelstalig */
    display: none;
}
.nl { /* Nederlandstalig */
    display: inherit;
}


Mijn vraag
Is dit eenvoudig op te lossen? Ik heb helaas bijna geen verstand van scripten. Ik was ooit heel goed in Flash...

Relevante software en hardware die ik gebruik
Dreamweaver (breek me de bek niet open)

Wat ik al gevonden of geprobeerd heb
Gegoegeld maar ik kan het niet vinden.

Beste antwoord (via Malloot op 01-09-2018 13:08)


  • deagan1337
  • Registratie: Oktober 2014
  • Laatst online: 06-10 20:28
Het script werkt, gister getest ( ook cookie aanmaken lukt ), ik denk dat je de en/nl niet hebt aangepast naar jouw situatie ( nederlands/engels als variabele ):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$languages = array('nederlands', 'engels');

if(in_array($_GET['choice'], $languages))
{
    $lang = $_GET['choice'];
}
else
{
    $lang = 'nederlands';
}
$year =31536000 + time(); setcookie ('style', $lang, $year); header("Location: ".$_SERVER['HTTP_REFERER']);
?>


Probeer dat, dat gaat waarschijnlijk werken op basis van jouw code.

Edit:
Wat @Sithistar zegt is wel nog iets, waar komt $style vandaan in de 'head' code?

code:
1
<link rel="stylesheet" type="text/css" href="<?php echo (!$style)?'nederlands':$style ?>.css" />



Je moet hier ergens nog extra code voor hebben om het cookie uit te lezen, misschien staat dat er wel al in.

Wellicht werkt dit:

code:
1
<link rel="stylesheet" type="text/css" href="<?php echo (!$_COOKIE['style'])?'nederlands':$_COOKIE['style'] ?>.css" />

[ Voor 31% gewijzigd door deagan1337 op 08-08-2018 13:24 ]

Alle reacties


Acties:
  • +2 Henk 'm!

  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
De php-code zet variabele $Year met hoofdletter maar leest $year kleine letter?

Als je de logging van fouten aanzet of de logfile bekijkt kan daar een behulpzame foutmelding in staan. Ik verwacht dat dat een 'undefined variable $year' is en daarna een 'headers already sent' en dan krijg je inderdaad niks.

(En ik zou die style gewoon inline zetten, scheelt een request, extra requests kunnen alleen maar fout gaan en het cachen van die paar tekens is de moeite niet waard.)

Never explain with stupidity where malice is a better explanation


Acties:
  • 0 Henk 'm!

  • Belindo
  • Registratie: December 2012
  • Laatst online: 10:36

Belindo

▶ ─🔘─────── 15:02

^^ waarschijnlijk ligt het hieraan.

Tevens set je de cookie met $choice, maar haal je die elders nog uit je URL met GET? Dat stukje ontbreekt in je code.

Coding in the cold; <brrrrr />


Acties:
  • 0 Henk 'm!

  • deagan1337
  • Registratie: Oktober 2014
  • Laatst online: 06-10 20:28
Probeer $_SERVER['HTTP_REFERER'] i.p.v. $HTTP_REFERER

Dit is verder niet echt veilig, je kunt nu alles neerzetten in die var en het wordt ingeladen ( andere url ipv taal ).

Beter zou zoiets zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$languages = array('nl', 'en');

if(in_array($_GET['choice'], $languages))
{
    $lang = $_GET['choice'];
}
else
{
    $lang = 'nl';
}
$year =31536000 + time(); setcookie ('style', $lang, $year); header("Location: ".$_SERVER['HTTP_REFERER']);
?>


en dan i.p.v. choice=/engels gewoon choice=en, dan kun je die extra / eenvoudig standaard toevoegen in je html code:
code:
1
<link rel="stylesheet" type="text/css" href=/"<?php echo (!$style)?'nederlands':$style ?>.css" />

[ Voor 19% gewijzigd door deagan1337 op 07-08-2018 18:20 ]


Acties:
  • 0 Henk 'm!

  • Malloot
  • Registratie: Maart 2005
  • Laatst online: 21-09 16:29

Malloot

bekijk eens wat anders

Topicstarter
Dank voor de reacties,

Het lukt niet :'(

Ik heb jullie advies opgevolgd en ook het andere scriptje van Deagan gebruikt. Het verschil met dat scriptje is dat er nu geen blanco pagina komt, en de pagina gewoon ververst, alleen veranderd de CSS (en dus taal) niet.

De / moet trouwens echter de ", maar dat maakt ook geen verschil helaasch.

Ik begrijp het 'en' en 'nl' niet zo goed..

Misschien had ik moeten melden dat ik dat andere scriptje ook niet zelf heb gemaakt maar destijds van een 'tips&tricks' website had (weet niet meer waar).

Mijn site heeft geen cookie melding maar daar kan het toch niet aan liggen lijkt me.

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:23

AW_Bos

Liefhebber van nostalgie... 🕰️

Wordt je cookie überhaupt wel aangemaakt? Downlaod eens een cookie-manager add-on voor je browser en kijk eens.

PS: Na een Location-header hoort een exit(), want je script wil je ook altijd laten stoppen.
Malloot schreef op dinsdag 7 augustus 2018 @ 20:32:
Mijn site heeft geen cookie melding maar daar kan het toch niet aan liggen lijkt me.
Misschien toch handig om te doen.

[ Voor 37% gewijzigd door AW_Bos op 08-08-2018 10:06 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • +1 Henk 'm!

Verwijderd

En waar wordt het cookie in php uitgelezen? Zo op het oog stond ooit registerglobals aan....

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • deagan1337
  • Registratie: Oktober 2014
  • Laatst online: 06-10 20:28
Het script werkt, gister getest ( ook cookie aanmaken lukt ), ik denk dat je de en/nl niet hebt aangepast naar jouw situatie ( nederlands/engels als variabele ):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$languages = array('nederlands', 'engels');

if(in_array($_GET['choice'], $languages))
{
    $lang = $_GET['choice'];
}
else
{
    $lang = 'nederlands';
}
$year =31536000 + time(); setcookie ('style', $lang, $year); header("Location: ".$_SERVER['HTTP_REFERER']);
?>


Probeer dat, dat gaat waarschijnlijk werken op basis van jouw code.

Edit:
Wat @Sithistar zegt is wel nog iets, waar komt $style vandaan in de 'head' code?

code:
1
<link rel="stylesheet" type="text/css" href="<?php echo (!$style)?'nederlands':$style ?>.css" />



Je moet hier ergens nog extra code voor hebben om het cookie uit te lezen, misschien staat dat er wel al in.

Wellicht werkt dit:

code:
1
<link rel="stylesheet" type="text/css" href="<?php echo (!$_COOKIE['style'])?'nederlands':$_COOKIE['style'] ?>.css" />

[ Voor 31% gewijzigd door deagan1337 op 08-08-2018 13:24 ]


Acties:
  • 0 Henk 'm!

  • Malloot
  • Registratie: Maart 2005
  • Laatst online: 21-09 16:29

Malloot

bekijk eens wat anders

Topicstarter
Sorry voor de late reactie, en mijn dank is groot :)

Het is nu gelukt met de aanpassingen van deagan1337, maar alleen op de homepage. Dat ga ik morgen waarschijnlijk proberen uit te pluizen en heeft ongetwijfeld met mappen te maken... Wordt vervolgd.

Over de cookiemelding, dit cookie voor het veranderen van de CSS is het enige, ik weet niet of je officieel voor zoiets al zo'n &*(#&*$# melding moet geven... ;) Die zou ik dan denk ik bovenop de taalknop plakken.

Acties:
  • 0 Henk 'm!

  • Aganim
  • Registratie: Oktober 2006
  • Laatst online: 09:58

Aganim

I have a cunning plan..

Malloot schreef op donderdag 9 augustus 2018 @ 21:46:
Dat ga ik morgen waarschijnlijk proberen uit te pluizen en heeft ongetwijfeld met mappen te maken... Wordt vervolgd.
Ik zal hem in spoilertags zetten dan. :+
spoiler:
Je geeft geen pad op, dan wordt de standaardwaarde '' gebruikt en werkt je cookie alleen voor de huidige map.

Neem sowieso even http://php.net/manual/en/function.setcookie.php door, kan geen kwaad ook even te kijken naar de 'secure' en 'httponly' parameters. :)

Ennuh, zomg, riep je $choice in je oorspronkelijke script rechtstreeks aan zonder die eerst te declareren? Dan werkte het voorheen dankzij 'register_globals', wat een draak was dat (en hoeveel boze klanten we wel niet hadden toen die bij PHP 5.4 echt definitief tot het verleden behoorde. :+ ).

Zoiets als dit wordt je toch droevig van, ook al is het uiteraard niet het mooiste voorbeeld? :'(

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

Bron: http://php.net/manual/en/security.globals.php

[ Voor 43% gewijzigd door Aganim op 09-08-2018 22:14 ]


Acties:
  • 0 Henk 'm!

  • deagan1337
  • Registratie: Oktober 2014
  • Laatst online: 06-10 20:28
Malloot schreef op donderdag 9 augustus 2018 @ 21:46:
Over de cookiemelding, dit cookie voor het veranderen van de CSS is het enige, ik weet niet of je officieel voor zoiets al zo'n &*(#&*$# melding moet geven... ;) Die zou ik dan denk ik bovenop de taalknop plakken.
Je hebt hiervoor geen cookie melding nodig op je website, dit is een functionele cookie waar je geen melding voor hoeft te plaatsen.

Acties:
  • +1 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Nu online

orf

Waarom met CSS content verbergen, terwijl je de inhoud met PHP makkelijker kan switchen? Dan kun je je HTML beginnen met <html lang="NL">, krijgt de bezoeker en zoekmachines alleen de juiste taal te zien en maak je het beheer ook nog wat makkelijker. Opslaan in een cookie kan dan alsnog.

Acties:
  • 0 Henk 'm!

  • Malloot
  • Registratie: Maart 2005
  • Laatst online: 21-09 16:29

Malloot

bekijk eens wat anders

Topicstarter
Aganim schreef op donderdag 9 augustus 2018 @ 22:00:
Ik zal hem in spoilertags zetten dan. :+
spoiler:
Je geeft geen pad op, dan wordt de standaardwaarde '' gebruikt en werkt je cookie alleen voor de huidige map.
:P
Nou ik heb die / inmiddels op verschillende manieren geprobeerd, maar blijkbaar niet de juiste... Zelfs dat lukt me nog niet.. Ik ben een totale n00b met scripten, blijkt eens temeer. Waar moet ik dit toevoegen?
Ennuh, zomg, riep je $choice in je oorspronkelijke script rechtstreeks aan zonder die eerst te declareren? Dan werkte het voorheen dankzij 'register_globals', wat een draak was dat (en hoeveel boze klanten we wel niet hadden toen die bij PHP 5.4 echt definitief tot het verleden behoorde. :+ ).
Aha, dan weten we in ieder geval de oorzaak waarom het opeens niet meer werkt!
deagan1337 schreef op vrijdag 10 augustus 2018 @ 09:15:
Je hebt hiervoor geen cookie melding nodig op je website, dit is een functionele cookie waar je geen melding voor hoeft te plaatsen.
d:)b Kon het me al niet voorstellen.
orf schreef op vrijdag 10 augustus 2018 @ 09:21:
Waarom met CSS content verbergen, terwijl je de inhoud met PHP makkelijker kan switchen? Dan kun je je HTML beginnen met <html lang="NL">, krijgt de bezoeker en zoekmachines alleen de juiste taal te zien en maak je het beheer ook nog wat makkelijker. Opslaan in een cookie kan dan alsnog.
Dat had ik bij het maken van de website destijds beter kunnen doen inderdaad.

Acties:
  • 0 Henk 'm!

  • Aganim
  • Registratie: Oktober 2006
  • Laatst online: 09:58

Aganim

I have a cunning plan..

Malloot schreef op vrijdag 10 augustus 2018 @ 15:27:
[...]

:P
Nou ik heb die / inmiddels op verschillende manieren geprobeerd, maar blijkbaar niet de juiste... Zelfs dat lukt me nog niet.. Ik ben een totale n00b met scripten, blijkt eens temeer. Waar moet ik dit toevoegen?
Achter de expiration parameter, zie ook de setcookie documentatie die ik gelinkt heb. Dus:
PHP:
1
setcookie ('style', $lang, $year,'/');

Dat zou voldoende moeten zijn, als dat niet werkt is mijn advies om ervoor te zorgen dat je eerst even alle cookies voor je domein wist. Je zou de eerste niet zijn die zich afvraagt waarom iets niet werkt, om er vervolgens achter te komen dat de browser zich hardnekkig vastklampt aan een oude cookie. :+

En het is altijd handig om wat voorbeelden te plaatsen die niet werkten, dan voorkom je dat we blind moeten gokken of wellicht dingen aandragen die je zelf al geprobeerd hebt. :)

[ Voor 11% gewijzigd door Aganim op 10-08-2018 16:07 ]


Acties:
  • 0 Henk 'm!

  • Malloot
  • Registratie: Maart 2005
  • Laatst online: 21-09 16:29

Malloot

bekijk eens wat anders

Topicstarter
Hmm gek, dat heb ik geprobeerd. Ik heb het nu weer gedaan. Ik op op verschillende browsers, ook incognito getest maakt het lukt niet.

Dit is de taal.php nu:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$languages = array('nederlands', 'engels');

if(in_array($_GET['choice'], $languages))
{
    $lang = $_GET['choice'];
}
else
{
    $lang = 'nederlands';
}
$year =31536000 + time(); setcookie ('style', $lang, $year, '/'); header("Location: ".$_SERVER['HTTP_REFERER']);
?>

[ Voor 13% gewijzigd door Malloot op 13-08-2018 12:36 ]


Acties:
  • 0 Henk 'm!

  • Malloot
  • Registratie: Maart 2005
  • Laatst online: 21-09 16:29

Malloot

bekijk eens wat anders

Topicstarter
Vandaag nog eens naar gekeken en dit was de oplossing:

Op de homepage staat dit:
code:
1
<link rel="stylesheet" type="text/css" href="<?php echo (!$_COOKIE['style'])?'nederlands':$_COOKIE['style'] ?>.css" />


Toen het oude script nog werkte kon op alle andere pagina's hetzelfde staan. Maar met het aangepaste script is alles wat ik hoefde te doen, het juiste pad toevoegen.

Dus niet '/' of een hele URL toevoegen in het script zelf, zoals eerder voorgesteld. Dit maakte geen verschil.

Maar gewoon in de html een niveau dieper '../' toevoegen. Zo dus:

code:
1
<link rel="stylesheet" type="text/css" href="../<?php echo (!$_COOKIE['style'])?'nederlands':$_COOKIE['style'] ?>.css" />


Heel logisch eigenlijk maar omdat het eerst niet hoefde had ik nogal lang nodig om me dit te realiseren.

Alternatief zou ik gewoon de hele website url kunnen gebruiken maar ik ga niet dieper dan ../../ ;)

Hoewel het antwoord in verschillende antwoorden hierboven staat, zal ik dit als beste antwoord markeren... EDIT: Oh dat kan niet... Naja dan maar een ander antwoord..

Speciale dank aan deagan1337, zonder zijn hulp was het sowieso niet gelukt :)
Pagina: 1