Setting session variable with hyperlink

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • hgeithus
    New Member
    • Oct 2008
    • 20

    Setting session variable with hyperlink

    Hi.

    I have a session variable stored within a cookie, and I want this to change when pressing a hyperlink.

    i.e. I have this variable
    Code:
    $_SESSION['language'] = 'en_US';
    This is set initially if it hasn't been set before using an if statement:
    Code:
    if (! isset($_SESSION['language']))
    { 
        $_SESSION['language'] = 'en_US';
    }
    I want to set this variable to something else using a hyperlink; like a language bar:

    Code:
    <a href="<?php $_SESSION['language'] = 'nb_NO'; ?>">Bokmål</a> |
    <a href="<?php $_SESSION['language'] = 'nn_NO'; ?>">Nynorsk</a>
    The problem is that the code enclosed in the php tags is invoked wether i press the link or not. It just runs. How do I restrict it to run only when pressing the link?

    Thanks in advance.
  • Markus
    Recognized Expert Expert
    • Jun 2007
    • 6092

    #2
    Originally posted by hgeithus
    Code:
    <a href="<?php $_SESSION['language'] = 'nb_NO'; ?>">Bokmål</a> |
    <a href="<?php $_SESSION['language'] = 'nn_NO'; ?>">Nynorsk</a>
    The problem is that the code enclosed in the php tags is invoked wether i press the link or not. It just runs. How do I restrict it to run only when pressing the link?

    Thanks in advance.
    Ok, no problem; this is easily fixed. Your logic is wrong for the above. Let's fix it!

    Each time you do
    Code:
    <?php $_SESSION['language'] = 'lang'; ?>
    you're resetting the session variable to the given language. What you actually want to do is just pass the language value to the href attribute. Like so:

    Code:
    <a href="?lang=nb_NO">Bokmål</a> |
    <a href="?lang=nn_NO">Nynorsk</a>
    This then passes the language to the URL which you can later obtain using GET. Consider:

    Code:
    <?php
    
    /*
       This checks that the parameter exists in the query string. If it does
       we assign that value to the $lang variable. If it doesn't, we assign a default value: en_US
    */
    $lang = ( isset ( $_GET['lang'] ) ? $_GET['lang'] : 'en_US' );
    
    echo $lang;
    
    ?>
    Does that help you?

    Comment

    • hgeithus
      New Member
      • Oct 2008
      • 20

      #3
      Hi, yes that works pretty well :D

      but I also encountered another problem that I didn't figure out how to solve well (when trying to apply this to multiple pages within my site). I have, say, three pages one.php, two.php and three.php, and all of them now has this language selection bar:

      Code:
      <div id="navbar"><div class="langbar"><a href="?locale=en_US">English</a> | <a href="?lang=de_DE">Deutsch</a> |
      <a href="?lang=ru_RU">Русский</a> |                     
      <a href="?lang=nb_NO">Bokmål</a> |
      <a href="?lang=nn_NO">Nynorsk</a></div></div>
      I want the user to be able to make a language choice at any point while visiting my site. I read somewhere that storing the variable in a cookie (in a session) was a nice way to do this.

      So all my pages should start with:

      Code:
      <?php session_start(); 
          /* and then I tried this */
          $lang = ( isset ($_GET['lang'] ) ? $_GET['lang'] : 'en_US' );
          /* store the variable in a cookie so I can remeber it between the pages */   
          $_SESSION['language'] = $lang;
          setlocale(LC_ALL, $_SESSION['language']);
      ?>
      But the problem is that when I browse to another page the URL will change to (i.e.) "www.mywebsite. com/two.php", and the $lang variable is then set to 'en_US'. Hmm.

      I know there should be a simple solution to this. Just can't see it, because I'm a noob.

      Any help is very much appreciated :D

      Comment

      • pbmods
        Recognized Expert Expert
        • Apr 2007
        • 5821

        #4
        Heya, hgeithus.

        Check to make sure $_GET['lang'] is set before changing $_SESSION['language'].

        Comment

        • Markus
          Recognized Expert Expert
          • Jun 2007
          • 6092

          #5
          Originally posted by pbmods
          Heya, hgeithus.

          Check to make sure $_GET['lang'] is set before changing $_SESSION['language'].
          I think you mean, check if $_SESSION['language'] is already set before changing it.

          The way you're doing it now, the session will be updated on every page regardless of whether it's been set previously. So all we need to do is: check and see if the session is already set. We can do that using isset().

          Code:
          // The ! operator checks for FALSE instead of TRUE in the IF condition.
          // So it basically reads: if the session ISN'T set, then do the code.
          if( ! isset ( $_SESSION['language'] ) )
          {
              $lang = ( isset ($_GET['lang'] ) ? $_GET['lang'] : 'en_US' );
              /* store the variable in a cookie so I can remeber it between the pages */   
              $_SESSION['language'] = $lang;
              setlocale(LC_ALL, $_SESSION['language']);
          }

          Comment

          • Atli
            Recognized Expert Expert
            • Nov 2006
            • 5062

            #6
            Originally posted by Markus
            I think you mean, check if $_SESSION['language'] is already set before changing it.
            He probably meant; make sure the GET variable is set before setting the SESSION variable, or else the SESSION variable will always be reset to the default value if no GET variable is passed.

            Your code, while it would successfully prevent the session from reverting to the default on every page, would also prevent the code from changing the language in the SESSION, which is what the OP was aiming for.

            This would probably be closer:
            [code=php]
            if(isset($_GET['lang'])) {
            $_SESSION['lang'] = $_GET['lang'];
            }[/code]
            Then you could either add a elseif clause to set the default value for the SESSION variable if it isn't set, or simply have the code that uses the SESSION variable check that, rather than have it done on ever page.
            Last edited by Atli; Dec 23 '08, 11:35 AM. Reason: Added the code example.

            Comment

            • hgeithus
              New Member
              • Oct 2008
              • 20

              #7
              I ended up doing this, and it works very well :)

              Code:
              session_start();
              if(isset($_GET['lang'])) 
              {
                  $_SESSION['lang'] = $_GET['lang'];
                  setlocale(LC_ALL, $_SESSION['lang']);
              }
              else
              {
              setlocale(LC_ALL, $_SESSION['lang']);
              }
              Thanks alot. Not so difficult as it first seem ;)

              Comment

              Working...