I have this simple while loop which retrieves data from a mysql query and displays several links on my homepage.
I would like to avoid using the php get function and add query strings to my urls
I am thinking of using session variables but I need help and I'm pretty sure this can't be done.
When a visitor clicks a link from the several ones displayed by the while loop, that particular variable would be set in a session.
In my code, the session will always send the last var.
Can this be done?
<? 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 ?>
What you wish to do can be done by using a javascript function which will make an AJAX request sending the clicked name to the server. The server side code will then store the required session variable
<?
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>
<? }
Now the setSession will make an AJAX call passing the value obtained. This can be then saved as session url by a simple server side code
The javascript code to present on the same page as your page having links
<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 server side code to be present to set the required url as session value
<?php
session_start();
if($_SESSION['url']!=""){
unset($_SESSION['url']);
$_SESSION['url'] = $_REQUEST['url'];
}
else {
$_SESSION['url'] = $_REQUEST['url'];
}
?>
Declare name before while loop
<? 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 ?>
now the last values is accessible in name.
I don't think you can do what you are talking about in a simple fashion... The best way to pass the data is in the url, to be retrieved with $_GET.
You could use your while loop to echo individual forms, and set a hidden variable in each form to the value of your $name. Then you'd have to output a link that called a javascript function to submit that particular form. On the next page, you'd be able to grab the value for $name from the $_POST variable that was submitted by the hidden value in the form from the previous page...
But that would require javascript to function, and would just be an odd way to go about it.
something like:
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>;
then on the next page ($url), you would get the value of the hidden variable using php, like so:
$name = $_POST['value'];
Again though, an odd way to go about it...
So you want to store a value in the session scope when a user clicks a link. How you solve this should depend on what should happen when the user clicks. Are the clicks causing navigation and a new get request, or is it simply registering the name value in the session?
If the information is only needed on the client, you should consider using sessionStorage. https://developer.mozilla.org/en/DOM/Storage#sessionStorage
Using jQuery you could set a value to sessionStorage like this:
$('a').click(function(){
sessionStorage.setItem('name', $(this).attr('data-name');
});
...and access it later on:
sessionStorage.getItem('name');
Keep in mind that sessionStorage is not supported by older browsers. If older browsers are important, you could use cookies instead. Cookies are sent to the server with each request, so if you set it with javascript on the click event, the value will be included in the next request, thus you can read it form the $_COOKIE array.
document.cookie = 'name=' + $(this).attr('data-name');
$value = $_COOKIE['name'];
You could fallback for older browsers by using feature detection:
if(sessionStorage){ /* do the session storage part */ }
else{ /* do the cookie part :) */ }
If you need to send the value to the server immediately you should consider using an ajax request, like Prashant Singh mentions in his answer.
My axamples use custom data attributes. I'm not sure about the content of your name values, and it's not clear how your markup looks like. You could use the name attribute if the names from mysql fits the attrbute semantically. Alternatively you could use the rel attribute, if the name describes a relation between the list and the target of the links.
I can not tell you how you can solve your problem, because it's not clear from your question how the script will determine if a specific link has been clicked.
However, I see a flaw in your code. You're setting the session variable always to the last entry after the loop:
$_SESSION['name'] = $name; // Store session data
$name
contains the name of the last mysql result row. This is obviously not what you want to do.
If you provide more information/code in your question how you can determine that a specific link has been clicked, it should be possible to show you how you can set the session variable properly.
For this you need two files
set-session.php or any other file where you set your session variable.
php code on index.php file will be :
<?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 code on your index.php file
$("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 code on your set-session.php file will be :
<?php $_SESSION['name'] = $_POST['name']; // Store session data ?>
Using cookie is the cheapest/easiest way to achieve what you need -in my opinion.
Just set a cookie to the url of the link clicked; you can then retrieve it on the destination page.
But that doesn't answer this question: Why do you need to know the URL being clicked on? Once the user clicks on the link, they should automatically be taken to the page being referenced. And once on the page, you can obtain the URL of the page through the global $_SERVER[REQUEST_URI] variable. Unless it's absolutely needed, I would suggest saving your server memory for other features.