Ah, you've already got a good foundation and more than enough experience to be able to tell a good habit from a bad habit.
Sorry if my post was long-winded and granular -- you get more than your fair share of the standard "I'm 19 -- teach me how to program web sites" kind of thing here on this forum. A not-so-wise man on a forum once said about WYSIWYG editors, "I don't know anything about programming, I don't know anything about HTML, nor do I have any inclination to learn, but I DO want to produce beautiful and functional websites so WYSIWYG editors are a boon for people like me."
To which I replied, "I don't know anything about structural engineering, I don't know anything about trigonometry or geometry, nor do I have any inclination to learn, but I DO want to build beautiful and structurally sound bridges so..."
It may have been overkill but it gets the point across. Building functional websites is not something that one can just jump head-first into without any experience and expect to be able to learn enough within the limited attention spans that people seem to have nowadays. If anyone could build a website, web designers and web programmers would be out of business overnight... if anyone could build a bridge, architects would be rendered obsolete overnight. You catch my drift...
Apparently, NONE of that applies to you! You obviously have the experience, desire, drive, and education in which to build a solid web design/programming career off of -- at least more so than those who choose that path typically.
I don't recant on my suggestion that sitting in a boring class is the number one way to learn a new skill or trade -- I can say from personal experience that one does not have to re-learn every single language out there -- once you have a solid foundation in one language and understand the primitives and constructs and basic structure of a good program, hopping from language to language is as simple as consulting a reference manual to find out the niggling differences in syntax. The basic construct and form is identical across all languages: data types, looping, error checking, data structures -- they're all the same. So I say "int i = 1" in one language and I say "dim i as integer; i = 1" in another -- either way, it's functionally equivalent. You understand that i is storing 1, and that's the understanding that is important.
Also, as you say, doing something from scratch is already a great learning experience -- for one, well, you have to actually do it and mess up along the way and troubleshoot. There's really no substitute for that. Two, you get to cut the fat -- off the shelf solutions include a lot of stuff you won't use and may get in the way of you reading and understanding the code and what does exactly what within that code.
Let us know if you'd like any suggestions on where to start. Here's a bit of old code, but still very functional and clean, that has to do with creating a php "login" system for a website:
http://www.evolt.org/node/60384
It's well documented and clean code and isn't too terribly advanced. It uses both php and a mySQL (or other) database back-end and is quite elegant, in my opinion. If you're going to do a shopping cart, you gotta have a way to remember who is currently logged in, and getting a login system going may be step one (or it may not, as you're the one familiar with the scope of your project). Let me know if it's helpful or not -- I may be able to dig up some tutorials on php shopping carts that I know are clean, elegant, and done the correct way.