Hello Kristina,

David summed this up pretty darn well. I don't see why you are reluctant to use session_id and the other functions. It solves all the problems
I can see that you are mentioning.

Maybe you could create a test script to play with session_id to get a better feel for how it works, and remove and doubts you have as well.

Good luck,

- Ben

David Krings wrote:
Kristina Anderson wrote:
Yes, but if I do $_SESSION['cart_id'], it is effectively the same thing, I'm using this random string as an identifier for the unique cart. This is effectively the same as $_SESSION['session_id'] -- only the name is different.

And there is no reason to name it differently. I have a script using sessions extensively and create a temporary folder using the session string. I have code in place that checks if the directory already exists, but session IDs generated by PHP are so unique that I yet have to see that code getting executed - and that after I don't know how many ten thousand times. I agree with John that there is absolutely no reason to generate your own ID.

the unique identifier is generated when index.php loads, and is passed as a querystring throughout the user's shopping and each product they view/order is tagged with their unique identifier.

Which isn't necessary if you run session_start() at the top of each page before executing any other code and sending anything to the browser.


The problem is that if they refresh/reload index.php...that value will change and their cart will be nuked. Which will be bad.

Not if you use session_start() as John rightfully mentioned already. As far as I know session_start() checks if the requesting browser connection ever started a PHP session and if yes, it uses the same session ID again, otherwise it generates a new one. And that is exactly that you want. You have an entry point such as a login or a "Shop 'til you drop now" button or in your case the index.php. When the browser requests that resource for the first time session_start() will not find any session ID for that requesting browser session. So it creates a new one that can be retrieved via session_id(). And that ID does not change when each consecutive script calls session_start() before executing any other code and before sending anything to the browser. So when you have session_start() as the first line after the opening tag in the index.php two things can happen: a) the current browser connection never had a session ID and a new one is generated b) the current browser connection has already a session ID established and uses that one

Especially case b) allows for a browser to call index.php as many times as desired and any consecutive request will cause that PHP / the web server always end up with exactly the same session ID. And what is even better, PHP takes care of getting this to work even when the requesting browser does not accept cookies. I think PHP's session handling is absolutely awesome and makes things so much easier. I key everything off the session ID, even the name of temporary tables in MySQL (you just need to add a _ in front of the ID to prevent illegal table names to occur). And the big master key for everything is always in place when you just make sure that the first thing to do in a script is call session_start(). I have the bad habit to start writing all kinds of things into the session array because it gets conveniently carried around for me, but I guess in a serious application that involves money you want to keep things on the server.

One thing that I just thought of a couple minutes ago would be to just use index.php to generate that...then include a new page and exit index.php so they won't ever be going back to that page during the session.

Well, but they DID get to the initial index.php in the first place, so they can get back there again, just by using the back button of their browser. Using session_start() will even take care of that.



As for why I do things the way I do...I am using $_SESSION and not just $_GET which may not have been clear from what I posted.


I found only one case where GET saved the day in all the years I deal with PHP (well, on your schedule it ends up to be maybe only a few months). POST or keeping things on the server side and keying off a session ID is better.


What you could do is add code to the index.php to fire some housecleaning script that takes care of stale carts. In my projects I store the session ID with the user ID and the date / time of login in a table. Each time the main page gets loaded I run a quick check against the date / time field and see if there are any stale logins. Anything older than a day is considered stale and I ditch any temporary directories, tables, and eventually the login entry itself. That works reasonably well for my purposes and cleans up the crud for all those cases where the user did not log out, which I assume will happen often. I doubt that my approach scales well as I hit the database once for typically nothing and potentially end up cleaning up a lot of stuff. For example on one day I end up with 50000 stale sessions and two days later the next user comes along and now I start this big cleanup and let that poor bastard wait until I'm done. What might be better is to write the login info into a flat file so that a cron / scheduled job can run during slow times and kick off a script that does the house cleaning then. There may also be better solutions.

Basically, I can only nod in agreement with what John wrote, you do want to use session_start().


David

_______________________________________________
New York PHP Community Talk Mailing List
http://lists.nyphp.org/mailman/listinfo/talk

NYPHPCon 2006 Presentations Online
http://www.nyphpcon.com

Show Your Participation in New York PHP
http://www.nyphp.org/show_participation.php

_______________________________________________
New York PHP Community Talk Mailing List
http://lists.nyphp.org/mailman/listinfo/talk

NYPHPCon 2006 Presentations Online
http://www.nyphpcon.com

Show Your Participation in New York PHP
http://www.nyphp.org/show_participation.php

Reply via email to