PHP with MySQL Essential Training
Illustration by Don Barnett

Protecting page visibility


PHP with MySQL Essential Training

with Kevin Skoglund

Start your free trial now, and begin learning software, business and creative skills—anytime, anywhere—with video instruction from recognized industry experts.

Start Your Free Trial Now

Video: Protecting page visibility

In previous movies, we removed the pages that are not visible from our navigation, so that subjects and pages don't show up there if they're not visible. However, that doesn't mean that users can't still view them. Let me show you what I mean. Start out with, go into your admin area and pick a page. I'm going to pick certification. And edit the page, and make it visible? No. So now we have a page that's not visible, we can still see it in the staff area. But if we go into Widget Corp on the public side, we reload the page, services, it's not there. We just see retrofitting.
Expand all | Collapse all
  1. 4m 8s
    1. Welcome
      1m 0s
    2. Using the exercise files
      3m 8s
  2. 15m 6s
    1. What is PHP?
      3m 52s
    2. The history of PHP
      2m 51s
    3. Why choose PHP?
      4m 10s
    4. Installation overview
      4m 13s
  3. 1h 3m
    1. Overview
      2m 33s
    2. Working with Apache Web Server
      6m 56s
    3. Changing the document root
      7m 24s
    4. Installing to Yosemite NEW
      8m 13s
    5. Enabling PHP
      6m 16s
    6. Upgrading PHP
      3m 30s
    7. Configuring PHP
      10m 3s
    8. Installing MySQL
      5m 46s
    9. Configuring MySQL
      7m 24s
    10. Text editor
      5m 1s
  4. 31m 25s
    1. Overview
      3m 27s
    2. Installing WampServer
      5m 46s
    3. Finding the document root
      2m 24s
    4. Configuring PHP
      8m 12s
    5. Configuring MySQL
      5m 45s
    6. Text editor
      5m 51s
  5. 19m 12s
    1. Embedding PHP code on a page
      6m 43s
    2. Outputting dynamic text
      5m 55s
    3. The operational trail
      2m 27s
    4. Inserting code comments
      4m 7s
  6. 1h 18m
    1. Variables
      7m 50s
    2. Strings
      4m 38s
    3. String functions
      8m 54s
    4. Numbers part one: Integers
      6m 27s
    5. Numbers part two: Floating points
      5m 25s
    6. Arrays
      10m 0s
    7. Associative arrays
      6m 37s
    8. Array functions
      6m 33s
    9. Booleans
      3m 50s
    10. NULL and empty
      5m 15s
    11. Type juggling and casting
      8m 27s
    12. Constants
      4m 43s
  7. 27m 37s
    1. If statements
      6m 0s
    2. Else and elseif statements
      4m 16s
    3. Logical operators
      7m 30s
    4. Switch statements
      9m 51s
  8. 42m 15s
    1. While loops
      8m 41s
    2. For loops
      5m 59s
    3. Foreach loops
      8m 16s
    4. Continue
      8m 28s
    5. Break
      4m 8s
    6. Understanding array pointers
      6m 43s
  9. 37m 25s
    1. Defining functions
      8m 25s
    2. Function arguments
      5m 32s
    3. Returning values from a function
      7m 33s
    4. Multiple return values
      4m 53s
    5. Scope and global variables
      6m 2s
    6. Setting default argument values
      5m 0s
  10. 20m 18s
    1. Common problems
      3m 47s
    2. Warnings and errors
      8m 36s
    3. Debugging and troubleshooting
      7m 55s
  11. 57m 57s
    1. Links and URLs
      5m 33s
    2. Using GET values
      5m 35s
    3. Encoding GET values
      8m 41s
    4. Encoding for HTML
      9m 26s
    5. Including and requiring files
      7m 40s
    6. Modifying headers
      6m 45s
    7. Page redirection
      6m 43s
    8. Output buffering
      7m 34s
  12. 1h 3m
    1. Building forms
      7m 28s
    2. Detecting form submissions
      5m 59s
    3. Single-page form processing
      7m 57s
    4. Validating form values
      10m 40s
    5. Problems with validation logic
      9m 54s
    6. Displaying validation errors
      7m 23s
    7. Custom validation functions
      6m 28s
    8. Single-page form with validations
      7m 25s
  13. 28m 5s
    1. Working with cookies
      2m 49s
    2. Setting cookie values
      5m 55s
    3. Reading cookie values
      6m 1s
    4. Unsetting cookie values
      4m 51s
    5. Working with sessions
      8m 29s
  14. 48m 39s
    1. MySQL introduction
      6m 43s
    2. Creating a database
      7m 41s
    3. Creating a database table
      7m 42s
    4. CRUD in MySQL
      5m 48s
    5. Populating a MySQL database
      7m 32s
    6. Relational database tables
      6m 40s
    7. Populating the relational table
      6m 33s
  15. 56m 4s
    1. Database APIs in PHP
      4m 51s
    2. Connecting to MySQL with PHP
      7m 45s
    3. Retrieving data from MySQL
      8m 47s
    4. Working with retrieved data
      6m 12s
    5. Creating records with PHP
      6m 58s
    6. Updating and deleting records with PHP
      9m 6s
    7. SQL injection
      3m 5s
    8. Escaping strings for MySQL
      6m 45s
    9. Introducing prepared statements
      2m 35s
  16. 35m 58s
    1. Blueprinting the application
      7m 19s
    2. Building the CMS database
      5m 14s
    3. Establishing your work area
      4m 38s
    4. Creating and styling the first page
      4m 22s
    5. Making page assets reusable
      6m 36s
    6. Connecting the application to the database
      7m 49s
  17. 32m 49s
    1. Adding pages to the navigation subjects
      5m 58s
    2. Refactoring the navigation
      6m 7s
    3. Selecting pages from the navigation
      6m 2s
    4. Highlighting the current page
      5m 26s
    5. Moving the navigation to a function
      9m 16s
  18. 1h 45m
    1. Finding a subject in the database
      9m 48s
    2. Refactoring the page selection
      10m 52s
    3. Creating a new subject form
      6m 55s
    4. Processing form values and adding subjects
      11m 20s
    5. Passing data in the session
      9m 16s
    6. Validating form values
      9m 40s
    7. Creating an edit subject form
      8m 30s
    8. Using single-page submission
      7m 44s
    9. Deleting a subject
      9m 44s
    10. Cleaning up
      10m 37s
    11. Assignment: Pages CRUD
      4m 30s
    12. Assignment results: Pages CRUD
      6m 10s
  19. 39m 26s
    1. The public appearance
      8m 52s
    2. Using a context for conditional code
      11m 37s
    3. Adding a default subject behavior
      6m 9s
    4. The public content area
      5m 51s
    5. Protecting page visibility
      6m 57s
  20. 1h 3m
    1. User authentication overview
      4m 3s
    2. Admin CRUD
      8m 41s
    3. Encrypting passwords
      7m 26s
    4. Salting passwords
      5m 42s
    5. Adding password encryption to CMS
      11m 54s
    6. New PHP password functions
      3m 13s
    7. Creating a login system
      11m 28s
    8. Checking for authorization
      5m 48s
    9. Creating a logout page
      5m 40s
  21. 2m 4s
    1. Next steps
      2m 4s

please wait ...
PHP with MySQL Essential Training from
14h 24m Beginner Jun 04, 2013 Updated May 20, 2015

Viewers: in countries Watching now:

PHP is a popular, reliable programming language at the foundation of many smart, data-driven websites. This comprehensive course from Kevin Skoglund helps developers learn the basics of PHP (including variables, logical expressions, loops, and functions), understand how to connect PHP to a MySQL database, and gain experience developing a complete web application with site navigation, form validation, and a password-protected admin area. Kevin also covers the basic CRUD routines for updating a database, debugging techniques, and usable user interfaces. Along the way, he provides practical advice, offers examples of best practices, and demonstrates refactoring techniques to improve existing code.

Topics include:
  • What is PHP?
  • Installing and configuring PHP and MySQL
  • Exploring data types
  • Controlling code with logical expressions and loops
  • Using PHP's built-in functions
  • Writing custom functions
  • Building dynamic webpages
  • Working with forms and form data
  • Using cookies and sessions to store data
  • Connecting to MySQL with PHP
  • Creating and editing database records
  • Building a content management system
  • Adding user authentication
Kevin Skoglund

Protecting page visibility

In previous movies, we removed the pages that are not visible from our navigation, so that subjects and pages don't show up there if they're not visible. However, that doesn't mean that users can't still view them. Let me show you what I mean. Start out with, go into your admin area and pick a page. I'm going to pick certification. And edit the page, and make it visible? No. So now we have a page that's not visible, we can still see it in the staff area. But if we go into Widget Corp on the public side, we reload the page, services, it's not there. We just see retrofitting.

Now, let's click on retrofitting. You'll see that its page ID equals five up here at the top. Look over here, and you'll notice that page ID equals six as what certification was. Just change that URL at the top. Change it to six. Look at that. Even though it doesn't show up as an Option for users to pick over here on the side, it is still visible. It is still possible to put in a request and still get that page back. That's bad news. That means that our page that we thought was not public, actually is public. If users want to take the time to start typing in other numbers up there to see what they can find, they can actually discover content they we don't intent for public viewing.

We got to be careful about that as developers. So, let's put in a fix for this. Now, index.php controls the public side of things. Everything is done off of this page. Now we could, at the top of this page, write a function that checks to see and says if this page is not a visible page, then redirect the user the something else. Right? Or return an error of some sort. We could do that. And in some instances, that might make a lot of sense. But I think it's overkill here. I think we can go with something a lot simpler.

Notice that the way that our page works, is if we have a current page, it displays it. Otherwise, we get a welcome message. It's that simple. So all we have to is make sure that we don't find the current page, and then it won't get displayed. If it can't find it, and se, can't set current page to it, then they'll just get the default welcome message instead. Current page is being set by our fine selected page function, so let's go look there. Notice that I'm already passing in true as an argument to find selected page. Here we go, here's find selected page and it now is contact sensitive, public equals false. We were doing that because we were working with this default page, but we have this public sensitivity that we can use down here as well. If page has been set, then it finds the page by ID. It doesn't care whether it's visible or not, it's taking that ID, finding that page and displaying it to us.

That's not what we want, what we want this that to be a context sensitive function. So, let's include something here that just says, pass in public as a second argument to find page by ID. We won't worry about setting public here, because it's already going to have been set when it was first called. We're just going to pass that information along to find page by ID. Let's go up to find page by ID. We know that we're going to need to have that argument here, public equals, and we'll make it default to true, just like we did for our other ones up here. So, find page by ID now, needs to find only visible pages that have the current ID, if we're in the public area.

We know how to do that. Public and query, so where ID equals the ID, and Visible equals 1. And I need a space after it to make sure the SQL still goes together nicely when I finally concatenate it with limit equals one. So, just like we did before, now when we find the page by ID. If we're in the public area, we're going to make sure that it's visible pages with that ID. If were not, if we're in the admin area, then we'll find pages that have that exact ID.

So, let's go and try that real quick. Let's just reload this page looking for page six. Look at that, we get the welcome message. We can still click on retrofitting, no problem, but we can't edit that to anything else. If we put in six, we put in seven. If we put in 700. Right? If it can't find that page that's visible and has that ID, we get our default welcome message. Much better. In our admin area though, it's no problem, we can still go ahead and surf around, and see all those pages just like you'd expect.

Now, anytime that you make a function contact sensitive like that, you also want to look for all other times that you used that function and make sure that you're passing in the context. I happened to know the only other place we're doing it is on delete page. The top of the delete page, we're calling find page by ID. So, we also need to tell it while we're in the admin area, so public equals false. This is admin request. So, let's save that. We also should do the same thing for find subject by ID. it matters a lot less than the page does, but its still a good practice to go ahead and do this throughout our site. So we're going to have public equals true.

And the code for this, the SQL is going to be absolutely the same. In fact, I'll just copy that and I'll just drop it right in there. So where id equals the safe subject ID, and if it's public, also make sure that it's visible. And same thing anytime that we have find subject by ID like we do in delete subject. We're also going to make sure that we pass in the context there as well. The other place that we do it is in functions.php, find_subject_by _id, right here.

And we already have public, we just need to pass it in at the same time. So find selected page, and pass along whether or not it's in the public or not. Now, it's a minor point, but there is the possibility of course, that we won't find the subject, right? If the subject won't be found here, and we're asking for the current subject's ID. So let's also just check and see if we have current subject. If that has been set to something and if we're in the public context, then look for find default page. to find default page is only looking at public ones. Find pages for subject, and it defaults to the public. We're not passing in a context.

So this is by definition, going to be a public function that we're calling. So we don't need to worry about making it more context sensitive. You could add that feature to it, but I think, because we're only using the default pages on the public side, I think it's okay not to. So now, if you take a look at our different find functions, you'll see that we've gone through and made most of our find functions context sensitive. Right? These all have the ability to tell whether we're in the public area or not, and display subjects and pages based on their visibility. But most importantly, we've taken to account the possibility that users are not going to be well behaved.

That they're going to type random things into the URL string, looking for data that they shouldn't have. We've gotta make sure as developers, that we're on guard for that kind of behavior.

Find answers to the most frequently asked questions about PHP with MySQL Essential Training .

Expand all | Collapse all
please wait ...
Q: This course was revised on 6/4/2013. What changed?
A: The old version of this course was 6 years old and it was time for a complete revision, using PHP 5.4. (The tutorials will work with any version of PHP and covers any differences you might encounter). The author has also added updated installation instructions for Mac OS X Mountain Lion and Windows 8. The topics and end project are the same, but the code is slightly different. It also addresses frequently asked questions from the previous version.
Q: This course was updated on 5/20/2015. What changed?
A: We added one movie called "Changing the document root in Yosemite," which helps the Mac installation run more smoothly.
Share a link to this course

What are exercise files?

Exercise files are the same files the author uses in the course. Save time by downloading the author's files instead of setting up your own files, and learn by following along with the instructor.

Can I take this course without the exercise files?

Yes! If you decide you would like the exercise files later, you can upgrade to a premium account any time.

Become a member Download sample files See plans and pricing

Please wait... please wait ...
Upgrade to get access to exercise files.

Exercise files video

How to use exercise files.

Learn by watching, listening, and doing, Exercise files are the same files the author uses in the course, so you can download them and follow along Premium memberships include access to all exercise files in the library.

Exercise files

Exercise files video

How to use exercise files.

For additional information on downloading and using exercise files, watch our instructional video or read the instructions in the FAQ .

This course includes free exercise files, so you can practice while you watch the course. To access all the exercise files in our library, become a Premium Member.

* Estimated file size

Are you sure you want to mark all the videos in this course as unwatched?

This will not affect your course history, your reports, or your certificates of completion for this course.

Mark all as unwatched Cancel


You have completed PHP with MySQL Essential Training.

Return to your organization's learning portal to continue training, or close this page.

Become a member to add this course to a playlist

Join today and get unlimited access to the entire library of video courses—and create as many playlists as you like.

Get started

Already a member ?

Exercise files

Learn by watching, listening, and doing! Exercise files are the same files the author uses in the course, so you can download them and follow along. Exercise files are available with all Premium memberships. Learn more

Get started

Already a Premium member?

Exercise files video

How to use exercise files.

Ask a question

Thanks for contacting us.
You’ll hear from our Customer Service team within 24 hours.

Please enter the text shown below:

The classic layout automatically defaults to the latest Flash Player.

To choose a different player, hold the cursor over your name at the top right of any page and choose Site preferences from the dropdown menu.

Continue to classic layout Stay on new layout
Exercise files

Access exercise files from a button right under the course name.

Mark videos as unwatched

Remove icons showing you already watched videos if you want to start over.

Control your viewing experience

Make the video wide, narrow, full-screen, or pop the player out of the page into its own window.

Interactive transcripts

Click on text in the transcript to jump to that spot in the video. As the video plays, the relevant spot in the transcript will be highlighted.

Learn more, save more. Upgrade today!

Get our Annual Premium Membership at our best savings yet.

Upgrade to our Annual Premium Membership today and get even more value from your subscription:

“In a way, I feel like you are rooting for me. Like you are really invested in my experience, and want me to get as much out of these courses as possible this is the best place to start on your journey to learning new material.”— Nadine H.

Thanks for signing up.

We’ll send you a confirmation email shortly.

Sign up and receive emails about and our online training library:

Here’s our privacy policy with more details about how we handle your information.

Keep up with news, tips, and latest courses with emails from

Sign up and receive emails about and our online training library:

Here’s our privacy policy with more details about how we handle your information.

submit Lightbox submit clicked
Terms and conditions of use

We've updated our terms and conditions (now called terms of service).Go
Review and accept our updated terms of service.