I’ve got a bit of a dilemma with some PHP code. The site I’m working on has a “Back to Previous Page” option and I’d like it to behave much like a browser’s back button. As it stands right now, I’m using a $_SESSION variable to track what the current and previous pages are. I’ve also “refresh-proofed” the variables so that I don’t end up with both the previous and current pages being the same.
So here’s the issue:
With the current implementation, if I go to one page, say “register.php” and then go to “forgot.php”, the previous page will be “register.php” which is fine. However, if I click “Back to Previous Page” I’ll end up back at “register.php” with the previous page being “forgot.php” which now leaves me with a 2-page loop with going back.
I tried implementing SplQueue to help me keep track of variables and I tried using the dequeue() function in my links to get the last page to show up as the link. The problem comes in when the dequeue is actually called and causes the element to disappear so that if I refresh, the element is no longer in the queue and the link changes. I fixed this by “refresh-proofing” the function that calls the dequeue for me and it works as I would like it to. The problem is now forward-linking. If I direct myself to another page, I don’t want the old links to dequeue information.
Ex:
I’m on register.php and my previous page is “forgot.php”. The “Back to Previous Page” link accurately shows that “forgot.php” is the page it will direct to, but now it’s no longer in the queue, so if I go to another page, say “profile.php” and then use the back button to go back to “register.php”, it will no longer show “forgot.php” as the page that you will go to if you hit “Back to Previous Page” again.
So, I guess my question is really how I can make a link call a PHP function without actually calling that function UNTIL the link has been clicked. I’ve tried having the link point to a JavaScript function, but the JS functions tend to tell me that my queue is empty, which is completely wrong.
As a side note, the pages are a mix of HTML and PHP. The HTML is supplied to me and I’ve been adding the PHP in to add functionality to fields and to get data from a database. I have no problem using PHP to echo the HTML links if I have to, and if it can be done in HTML with a small <?php someCode(); ?>, that’s fine too.
I thank you for your time to try and help me out.
EDIT:
So to try and clarify a bit, I have a structure that is currently tracking pages that the user has already been to as they visit them. It creates a mini history of the pages. My issue is that I have code like this:
<a href="somelink">Back To Previous Page</a>
And I don’t know what “somelink” is since it will change depending on your history. I know I can do something like:
<a href="<?php someFunction() ?>">Back To Previous Page</a>
If I do anything like the above, the function is executed as the page is being displayed, so it makes it difficult to use an array_pop() or a dequeue() but again, the PHP will be executed as soon as the page is displayed. What I’m looking for is a way to display the link and then remove it from the history if and only if the “Back to Previous Page” link is clicked. As of right now, I’m storing an array in $_SESSION as was suggested below and since it’s an array, I can show the last element in the array as the link, so the only real problem is to find a way to remove elements from the array when the link is clicked.
EDIT 2:
I’ve been scouring the internet and decided upon using JavaScript with AJAX to call a PHP file. This allows me to us an onClick on the links I have so that I can control when I array_pop from my $_SESSION['links'] variable.
I don’t think my AJAX is actually doing anything sadly, so the code I’m using is below.
<script src="js/jquery-1.4.2.min.js" type="text/javascript">
function dequeue()
{
$.ajax({
type: "POST",
url: "common.php",
data: {action: "rem"},
success: function(output) {
alert(output);
}
});
}
</script>
and the PHP is
switch($_POST['action'])
{
case "rem":
array_pop($_SESSION['links']);
break;
default:
if(isset($_SESSION['current']) && $_SESSION['current'] != $_SERVER['REQUEST_URI'])
{
array_push($_SESSION['links'], $_SESSION['current']);
}
$_SESSION['current'] = $_SERVER['REQUEST_URI'];
break;
}
As far as I can tell, this will allow me to add a link to the history in the session variable unless I’m clicking on the “Back to Previous Page” link since that link will have the “rem” code. I’m also a bit suspicious of the $_SESSION['current'] = $_SERVER['REQUEST_URI']; and where it should be placed.
You can store array in a session and treat the array like a stack (use
array_pushandarray_popaccordingly). When the user hits something but the back button, push the current page to the stack. otherwise, pop it.