Переменные сеанса, отправляющие определенную переменную из цикла while

У меня есть этот простой цикл while, который извлекает данные из запроса mysql и отображает несколько ссылок на моей домашней странице.

Я хотел бы избежать использования функции php get и добавить строки запроса к моим URL-адресам

Я думаю об использовании переменных сеанса, но мне нужна помощь, и я уверен, что этого не может быть сделано.

Когда посетитель щелкает ссылку из нескольких, отображаемых циклом while, эта конкретная переменная будет установлена ​​в сеансе.

В моем коде сеанс всегда будет отправлять последний var.

Это можно сделать?

<? session_start(); // Start Session Variables $result = mysql_query("my query"); while($slice = mysql_fetch_assoc($result)){ $url = $slice['url']; $name = $slice['name']; ?> <a href="<? echo $url; ?>"><? echo $name; ?></a> <? } $_SESSION['name'] = $name; // Store session data ?> 

То, что вы хотите сделать, может быть выполнено с помощью функции javascript, которая заставит запрос AJAX отправить кликнутое имя на сервер. Затем на стороне сервера будет сохранена требуемая переменная сеанса

  <? session_start(); // Start Session Variables $result = mysql_query("my query"); $name = ''; while($slice = mysql_fetch_assoc($result)){ $url = $slice['url']; $name = $slice['name']; ?> <a href="<? echo $url; ?>" onclick='setSession(<? echo $url;?>);'><? echo $name; ?></a> <? } 

Теперь setSession сделает вызов AJAX, передавая полученное значение. Это можно сохранить в качестве URL-адреса сеанса простым кодом на стороне сервера

Код javascript для представления на той же странице, что и страница с ссылками

 <script type='text/javascript'> function getXMLHTTPRequest() { try { req = new XMLHttpRequest(); } catch(err1) { try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch (err2) { try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch (err3) { req = false; } } } return req; } var http = getXMLHTTPRequest(); function setSession(value) { var myurl = "session.php"; // to be present in the same folder var myurl1 = myurl; myRand = parseInt(Math.random()*999999999999999); var modurl = myurl1+"?rand="+myRand+"url"+value ; // this will set the url to be sent http.open("GET", modurl, true); http.onreadystatechange = useHttpResponse; http.send(null); } function useHttpResponse() { if (http.readyState == 4) { if(http.status == 200) { var mytext = http.responseText; // I dont think u will like to do any thing with the response // u can redirect the user to the req page (link clicked), once the session url has been setted } } else { // don't do anything until any result is obtained } } </script> 

Код на стороне сервера PHP для размещения требуемого URL-адреса в качестве значения сеанса

 <?php session_start(); if($_SESSION['url']!=""){ unset($_SESSION['url']); $_SESSION['url'] = $_REQUEST['url']; } else { $_SESSION['url'] = $_REQUEST['url']; } ?> с <?php session_start(); if($_SESSION['url']!=""){ unset($_SESSION['url']); $_SESSION['url'] = $_REQUEST['url']; } else { $_SESSION['url'] = $_REQUEST['url']; } ?> 

Я не думаю, что вы можете делать то, о чем вы говорите, простым способом … Лучший способ передать данные в URL-адресе, чтобы получить его с помощью $ _GET.

Вы можете использовать цикл while для эха отдельных форм и задать скрытую переменную в каждой форме для значения вашего имени. Затем вам нужно будет вывести ссылку, которая называется функцией javascript, чтобы отправить эту конкретную форму. На следующей странице вы сможете захватить значение для $ name из переменной $ _POST, которая была отправлена ​​скрытым значением в форме с предыдущей страницы …

Но для этого потребуется javascript для работы, и это будет просто странный способ сделать это.

что-то вроде:

 echo '<form action="'.$url.'" method="post" name="myform1" id="myform1">'; echo '<input type="hidden" name="value" id="value" value ="'.$name.'">'; echo '</form>'; echo '<a onclick="document.forms['myform1'].submit();">'.$name.'</a>; 

то на следующей странице ($ url) вы получите значение скрытой переменной с помощью php, например:

 $name = $_POST['value']; 

Опять же, странный способ сделать это …

Я не могу сказать вам, как вы можете решить свою проблему, потому что из вашего вопроса неясно, как скрипт определит, была ли нажата конкретная ссылка.

Однако я вижу недостаток в вашем коде. Вы всегда устанавливаете переменную сеанса последней записи после цикла:

  $_SESSION['name'] = $name; // Store session data 

$name содержит имя последней строки результата mysql. Это явно не то, что вы хотите сделать.

Если вы предоставили больше информации / кода в своем вопросе о том, как вы можете определить, что была нажата конкретная ссылка, вам должно быть показано, как вы можете правильно установить переменную сеанса.

Объявлять имя перед циклом while

 <? session_start(); // Start Session Variables $result = mysql_query("my query"); $name = ''; while($slice = mysql_fetch_assoc($result)){ $url = $slice['url']; $name = $slice['name']; ?> <a href="<? echo $url; ?>"><? echo $name; ?></a> <? } $_SESSION['name'] = $name; // Store session data ?> 

теперь последние значения доступны по имени.

Поэтому вы хотите сохранить значение в области сеанса, когда пользователь нажимает на ссылку. Как вы решаете, это должно зависеть от того, что должно произойти, когда пользователь нажимает. Являются ли клики, вызывающие навигацию, и новым запросом на получение, или просто регистрируют значение имени в сеансе?

Если информация нужна только клиенту, вам следует рассмотреть возможность использования sessionStorage. https://developer.mozilla.org/en/DOM/Storage#sessionStorage

Используя jQuery, вы можете установить значение для sessionStorage следующим образом:

 $('a').click(function(){ sessionStorage.setItem('name', $(this).attr('data-name'); }); 

… и получить доступ к нему позже:

 sessionStorage.getItem('name'); 

Имейте в виду, что sessionStorage не поддерживается старыми браузерами. Если старые браузеры важны, вместо этого вы можете использовать файлы cookie. Куки-файлы отправляются на сервер с каждым запросом, поэтому, если вы установите его с помощью javascript в событии клика, значение будет включено в следующий запрос, таким образом вы можете прочитать его в массиве $ _COOKIE.

 document.cookie = 'name=' + $(this).attr('data-name'); $value = $_COOKIE['name']; 

Вы можете отказаться от старых браузеров, используя функцию обнаружения:

 if(sessionStorage){ /* do the session storage part */ } else{ /* do the cookie part :) */ } 

Если вам нужно немедленно отправить значение на сервер, вам следует рассмотреть возможность использования запроса ajax, как упоминает в своем ответе Прашант Сингх.

Мои аксограммы используют атрибуты пользовательских данных. Я не уверен в содержании ваших имен, и неясно, как выглядит ваша разметка. Вы можете использовать атрибут name, если имена из mysql соответствуют семантике attrbute. В качестве альтернативы вы можете использовать атрибут rel, если имя описывает связь между списком и целью ссылок.

Для этого вам нужны два файла

  1. index.php или любой другой файл, который вы используете для отображения ссылок.
  2. set-session.php или любой другой файл, в котором вы устанавливаете свою переменную сеанса.

    PHP-код в файле index.php будет:

     <?php session_start(); $result = mysql_query("my query"); while($slice = mysql_fetch_assoc($result)){ $url = $slice['url']; $name = $slice['name']; ?> <a class="myUrl" href="<?php echo $url; ?>"><?php echo $name; ?></a> <?php } ?> 

Код jQuery в файле index.php

 $("a.myUrl").click(function() { // Get the name from the link var linkName = $(this).text(); // Send Ajax request to set-session.php, // with linkName set as "name" in the POST data $.post("/set-session.php", {"name": linkName}); }); 

php-код в файле set-session.php будет:

 <?php $_SESSION['name'] = $_POST['name']; // Store session data ?> 

Использование cookie – самый дешевый / самый простой способ добиться того, что вам нужно, – на мой взгляд.
Просто установите cookie на URL-адрес ссылки; вы можете получить его на целевой странице.
Но это не отвечает на этот вопрос: для чего вам нужно знать, на какой URL нажали? Как только пользователь нажимает на ссылку, они должны автоматически быть отправлены на страницу, на которую ссылаются. И один раз на странице вы можете получить URL-адрес страницы через глобальную переменную $ _SERVER [REQUEST_URI]. Если это абсолютно необходимо, я бы предложил сохранить память сервера для других функций.