Richard Stibbard's "Ultimate Web Development Course"
4.5 (611 ratings)
Course Ratings are calculated from individual students’ ratings and a variety of other signals, like age of rating and reliability, to ensure that they reflect course quality fairly and accurately.
23,721 students enrolled

Richard Stibbard's "Ultimate Web Development Course"

Learn all the major web technologies in one full stack development project: HTML, CSS, MySQL, PHP, jQuery and AJAX
4.5 (611 ratings)
Course Ratings are calculated from individual students’ ratings and a variety of other signals, like age of rating and reliability, to ensure that they reflect course quality fairly and accurately.
23,721 students enrolled
Created by Richard Stibbard
Last updated 10/2019
Current price: $23.99 Original price: $34.99 Discount: 31% off
5 hours left at this price!
30-Day Money-Back Guarantee
This course includes
  • 11.5 hours on-demand video
  • 1 article
  • 14 downloadable resources
  • Full lifetime access
  • Access on mobile and TV
  • Certificate of Completion
Training 5 or more people?

Get your team access to 4,000+ top Udemy courses anytime, anywhere.

Try Udemy for Business
What you'll learn
  • Flexible course design allows for complete beginners or more advanced learners
  • Learn HTML5, CSS, MySQL, PHP, jQuery and AJAX in one working project
  • Up-to-date coding standards using mysqli and prepared statements to ensure database security
  • Instant update website - the most modern web interface
  • Detailed coverage of programming logic and dynamic website coding processes
  • Accompanying FREE PDF or Kindle book allows full-text search of the course
Course content
Expand all 136 lectures 11:52:51
+ Course Introduction
2 lectures 07:49

Build an instant update database interface with jQuery/AJAX

Preview 07:22

Working Files, eBook and Bookmarks
+ Komodo Text Editor
3 lectures 11:44
Komodo Edit is an excellent code editor with many useful features such as intelligent code completion.

This chapter takes you through the process of downloading and installing Komodo Edit, which I use because I like its code completion and syntax highlighting features as well as its preview pane.

If you already have a code editor you like, then feel free to skip this chapter and use your preferred editor for the project.
Preview 02:28

Download Komodo Edit from

Download Komodo Edit
Setting up Komodo Edit with my custom syntax highlighting scheme for more vivid syntax highlighting than the default scheme.
Configure Komodo Edit
+ Local Webserver Installation
6 lectures 21:21

XAMPP is the most popular local webserver package and has versions for Windows, Mac OS, Linux and Solaris.

Preview 02:40

Step-by-step instructions on downloading and installing XAMPP on a Windows PC.

If you get the error message:

Apache shutdown unexpectedly. This may be due to a blocked port, missing dependencies, improper privileges, a crash, or a shutdown by another method. Press the Logs button to view error logs and check the Windows Event Viewer for more clues

then another program, most commonly Skype, is blocking port 80.

Carry out the following steps to solve the problem:

  1. Start Skype, go to Tools > Options > Advanced > Connection and uncheck “Use port 80 and 443 as alternatives for incoming connections”.
  2. Shut down Skype.
  3. Start up the XAMPP control panel by clicking on c:\xampp\xampp-control.exe.
  4. Check the boxes to set both Apache and MySQL as services.
  5. Restart Windows.

If this does not work, or you do not have Skype installed, carry out the folllowing steps:

  1. Start the XAMPP control panel by clicking on c:\xampp\xampp-control.exe.
  2. Cick on the ‘Config’ button next to Apache and select ‘httpd.conf’ to open the config file in a text editor.
  3. In ‘httpd.conf’, find the line ‘Listen 80′ and change the number to another number, e.g. 86.
  4. In XAMPP control panel, click ‘Stop’ next to Apache, wait for the button to change to ‘Start’ and then click it to restart Apache.
  5. Check the boxes to set both Apache and MySQL as services.

Apache and MySQL should now start automatically and without conflicts.

Preview 03:53

The timezone for the Apache server is set by default to Berlin time. In this lesson we use the XAMPP Control Panel to change it to your local timezone.

Change Server Timezone (Optional)
A look at the XAMPP tools and phpMyAdmin. We will use phpMyAdmin much more later on in the course.
XAMPP Tools and phpMyAdmin
+ Bare Bones HTML5
4 lectures 24:48
An introduction to some of the new semantic elements in HTML5.
Preview 04:44
Writing the document structure for our index file, the movies list page.
Bare bones HTML - Movies List Page

Writing the HTML document structure for the single movie page.

Bare Bones HTML - Single Movie Page

Writing the HTML document structure for the generic admin page.

Bare Bones HTML - Admin Page

Test your knowledge of HTML.

Test your HTML
3 questions
+ Styling with CSS
14 lectures 01:50:06
Before we begin styling, we need to strip out all default styles using a CSS reset stylesheet.
CSS Reset

We use classes and IDs to distinguish HTML elements for styling and functional purposes respectively.

Styling with Classes and IDs
We add class names to index.html to distinguish the various parts of the page for later styling.
Applying Classes to index.html
We write the styles to create the basic box layout for index.html.
Box Layout

Internet Explorer versions 8 and below does not support the new HTML5 elements and garbles our box layout. We solve this by using two scripts, html5-shiv and html5-printshiv.

NB - the link to HTML5Shiv has moved to so please make this change in your version of the project.

NOTE AS OF JUNE 2019: A student has informed me that this no longer works. It is becoming unnecessary now to support IE8 - users really should have upgraded a very long time ago, but here is a new link to html5-shiv provided by the student. Please check this and add it if you want to support IE8:

<!--[if lt IE 9]>

<script src=""></script>


HTML-shiv for IE8
Adding the styles for the header and the users and admin navigation lists.
Styling the header and top navigation
Adding the styles for the favourites and movie list panel
Styling the favourites and movie list panel

Adding the styles for the footer.

Styling the footer
Adding the styles for the single movies page. This time you write the style selectors before I give them to you.
Styling the single movie page
The style selectors for the admin pages - you write the selectors and try to write as many of the style declarations as you can before I give you the answers.
Styling the admin pages
Using a CSS sprite for all or nearly all the background images in a website speeds up page loading by reducing the number of HTTP requests and allowing browsers to used access the image from the cache.
Creating background images with a CSS sprite
Before going on we need to check that the web pages we have written display properly in the various different browsers. I develop in Firefox and check in Opera, Chrome, Safari, and IE 10, 9 and 8.
Cross-browser compatibility check
Validate HTML

Test your knowledge of CSS

Test your CSS
3 questions
+ Essential PHP
13 lectures 01:29:06

‘PHP’ stands for ‘PHP – Hypertext Pre-processor’. Ordinary HTML provides the static framework of a website while PHP gets data from a database to provide dynamic, ever-changing, content.

Preview 02:02
PHP is desgined to work in combination with HTML. This video demonstrates various ways in which the two can be combined to display strings, variables, and HTML tags.
Combining PHP and HTML to display strings, variables, and HTML tags
Sometimes quote marks are themselves part of the string we want to display. We then need to escape these characters so they do not interfere with the syntax of our PHP code.
Echoing quote marks - String delimiters
Conditions are at the heart of all computer programs - they allow our code to do entirely different things depending on the data received.
PHP Conditions
'Switch' is an alternative to 'if' clauses when there are multiple values to check.
Switch ... case
Many programming tasks involve large amounts of repetition, which computers perform well, while humans do not.
PHP Loops
Including files within a "parent" file makes our code much more efficient and easier to manage.
PHP Includes

Arrays are a type of variable which contains sets of multiple values in a structured list, allowing us to organise related collections of data.

How to get user input passed in the browser address bar.
Passing variables in the URL
User input can also be passed less pubicly so that it does not appear in the browser address bar.
Passing variables without their appearing in the URL
Making sure our program fails gracefully if user input is missing.
Guarding against missing variables

We use functions to keep our variables from getting out of control.

Functions and variable scope
Using parameters to pass data into functions.
Passing data to functions with parameters

Test your knowledge of PHP

Test your PHP
4 questions
+ MySQL in phpMyAdmin
8 lectures 41:27

A database  is a structured collection of records, organised in tables, each record consisting of a number of fields. Relational databases use linking tables to make links between tables without duplication of data.

What is a Database

Using phpMyAdmin to create a new database and add tables to it.

Create a database, add tables
The SQL INSERT query.
Insert data
How to import data from an external SQL file to a database using phpMyAdmin.
Import data

Using SQL queries in phpMyAdmin to display records from a database table.

Select records

The SQL query in phpMyAdmin to update an existing record in the database.

Update existing database records
The more complex SQL select query we will later use to select favourite movies based on two criteria.
Select favourites
Delete records, empty and delete tables and database
+ MySQL in PHP
8 lectures 45:14
Connecting to a MySQL database in a PHP script.
Initialise and connect to a database with mysqli

How to return all the records from a database using SQL embedded in PHP.

If you get the error "Call to a member function on a non-object", then there is a mismtach between the database column names you have supplied in the PHP and those you have actually used in the table. Double check that you have not, for instance named a column `first_name` when it should be `firstname`.

Backticks (` `), for which the key on a UK/US keyboard is at the top left next to the key for '1', can be used to enclose table and column names if there is a danger that you have used MySQL reserved words to name database columns. To do so is not good practice and should be avoided. As long as your database column names have no special meaning in MySQL, you do not need to enclose them in backticks. 

Values must be enclosed in single quotes ('  ') - if they are not enclosed this will also throw an error.

Select all records from a database
How to display database records which match a pattern supplied by the user.
Select matching records using WHERE ... AND
This lesson demonstrates how to display all the data from a database without any valid login credentials. This is done by entering a snippet of PHP code into a login form in such a way that the logic of the SQL query is altered.
SQL injection demonstrated
SQL injection can be prevented by escaping user input so that it is impossible to tamper with the logic of the SQL query.
Combating SQL injection with mysqli real_escape_string
A better way to prevent SQL injection is to use prepared statements, which prevents user input from interfering with the SQL query.
Combating SQL injection with prepared statements
Making use of code written earlier, we build a simple PHP interface to add data to the database.
Add data through PHP interface
You adapt the code from the previous lesson to DELETE instead of INSERTing data.
Delete data through PHP interface
+ From static HTML to dynamic PHP
31 lectures 02:24:57
Follow the lessons for this chapter in as much detail as you feel you need - after a while you may want to skip ahead using the Working Files if you find I am going too slowly.

I recommend that you complete all the four assignments yourself, however, to check on and reinforce your learning.
Preview 01:48
Duplicated code is inefficient and difficult to manage. In this lesson we move all duplicated code to included files which means they can be re-used throughout the whole project and any edits made in them take effect across the whole site.
Efficient, reusable code with PHP includes

Using PHP includes we create a single parent page which generates either a single movie or a list of movies according to whether a movie is chosen in the URL.

One index file for single movie and movies list
Using the same principle, we create a single parent page which generates both the movies and the users admin pages.
One admin file for users and movies admin
Reusing code from the previous chapter, we connect to the 'movies' database.
Initialise and connect to the favourite movies database
In the navigation include file, we replace dummy links with the list of movie-goers drawn from the database.
Displaying dynamic data - the list of users
As the values of variables set in include files are available everywhere in the project, variable conflicts can occur. Using functions solves this problem.
Convert users list to function

Setting include paths in the parent files, index.php and admin.php, obviates the need to specify the path names of include files and functions.

Set include paths in parent files
This function tests whether a valid user_id is set in the URL and returns a code accordingly.
User navigation - test if valid user set
We pass the code returned by the test users function to the show users function, making it possible to display different user lists according to whether or not a user_id is selected.
Set parameters for show users function
Parameters set in tell show-users.fn.php which sets of movie-goer data to display to form the complete user navigation menu.
Parameterised show users function
The program alerts the user in the event that a user id is not entered, or one is entered which does not match any records, or a non-numerical id is given.
Catching missing and invalid user_id
Your first major assignment - apply your knowledge to write the code to display the list of favourite movies as a formatted list.
ASSIGNMENT: Write the favourite movies display function
1 page
The answer to the assignment - the code for the favourite movies display function.
The favourite movies display function
Adapt the code you have just written, and combine it with the plain HTML from earlier, to produce the main list of non-favourites with thumbnail images and formatting.
ASSIGNMENT: Write the non-favourites display function
1 page
Following the same procedures, we go through the process of building the non-favourites list.
The non-favourite movies display
Inserting a personal greeting is a simple matter of adding a new 'case' to the showUsers() function.
Insert personal greeting on movie list page
The showMovies() function is adapted to display the single movie page.
The single movie display
The principles used to catch errors in the user_id input are applied to the movie_id.
Catching missing and invalid user input - movie_id
We need to complete our error catching by coping with the possibility that database tables are empty. In this lesson we display an alert message and the movie-goers admin page if there is no data in the movie-goers table.
Catching empty movie-goers table
Adapt the code we have just written to produce an alert message and display the movies admin page if the movies database table is empty.
ASSIGNMENT - Catching empty movies table
1 page
Applying the methods used earlier, we catch for the possibility of an empty movies database table.
Catching empty movies table
It is a simple task to produce a custom title for the Favourites list when the list is empty.
Data-dependent title for favourites list
Following the same procedure, add a different message at the top of the list of movies according to whether there are any movies in the list or not.
Data-dependent welcome in movie list display
We need a new function to check whether or not the selected movie is a favourite of the selected user and display the appropriate link, "Add to favourites" or "Remove from favourites". You have done everything you need to write this function.
Data-dependent link on single movie page
ASSIGNMENT – Putting dynamic data into the movie admin table
1 page

Change dummy data in the movies admin table to dynamic data.

Dynamic data in movies admin table
Change dummy data in the movie-goers admin table to dynamic data.
Dynamic data in users admin table
Re-check the pages in the various browsers.
Check again for cross-browser compatibility
Re-check our HTML at the W3C validation service.
Validate HTML
Format HTML source
+ Essential jQuery and AJAX
10 lectures 53:29
A brief introduction to jQuery and the link to jQuery at Google CDN.
Preview 04:56

If you already have Firebug installed in Firefox, skip this lesson. Otherwise, install Firebug from

Install Firebug
Basic jQuery syntax: selector - event - action.
Basic jQuery syntax
If the selector for the event and the selector for the action are the same, use $(this) for the action instead of repeating the selector name.
The $(this) selector

To target elements just added by jQuery we have to use the event handler ‘on’: $(document).on('event', 'selector', function()

Add/remove class and the dynamic event handler 'on'
Retrieve attributes from HTML IDs and use them to set variables in jQuery to target unique page items.
Retrieving and using HTML attributes
Our project features a one-way drag-and-drop interface - the user drags movie titles from the favourites list to the trashcan to remove them from favourites. This lesson shows how to build a simplified version of the visual effect for this.
One-way drag-and-drop effect using jQuery UI

JQuery alone does nothing to the database – to alter database records we must use a PHP script and pass variables to it using an AJAX call.

AJAX - Update database in the background with no page refresh
ASSIGNMENT - The drag-to-delete AJAX call and PHP script
1 page

Adapting the click-to-add AJAX call to make the drag-to-delete equivalent appears simple, but there are two problems to be overcome: enabling jQuery on newly added DOM elements and preventing event-bubbling.

The drag-to-delete AJAX call and PHP script
  • A computer connected to the internet
  • The ability/permission to download software
  • A text editor (I recommend Komodo Edit, which is free)
  • Enthusiasm!

"This has been one of the best web courses ever. It should be used as a model by almost anyone thinking of teaching on the web. It has cleared out nearly a decade of web programming cobwebs. The fact you have made a course which is complete end-to-end is impressive. The fact that code examples all work puts nearly every programming book and most web courses to shame."
Paul Wolfson, Principal Investigator, Dallas Legal Technology


"The Ultimate Web Development course is the most user friendly course I have encountered to date. Additionally, the lecturer, Dr. Richard Stibbard is extremely committed and accessible. Oh! If only all the on-line lecturers could take a page from his book."
Urich Wilmot-Hoyte


"Solid Full Stack Development course - I have been through numerous other books and courses trying to get up to speed on CSS, JQuery, Ajax, and PHP, and so far this is the most effective. I think there are two keys to it's success. First, the app developed throughout the course is reasonably complex and whether its a particular look in CSS or behaviour in jQuery, it accurately reflects what modern apps really look like. Next, there is enough hands on coding in all the tools that it really begins to stick. HIghly recommended for anyone wanting broad introduction to modern web development that really touches almost all the bases."
Donald Brummel


Taught by freelance developer and experienced online educator Dr. Richard Stibbard, this course takes you in easy steps through the entire process of building an up-to-date web interface which updates its database and HTML on the fly without the need for page refreshes, rather like the 'Add to Favourites' function on Youtube or Trivago's hotel search.

You will learn how to:

  • structure a website using HTML5
  • apply styling with cascading stylesheets (CSS)
  • convert a static site to a dynamic one using PHP
  • remove inefficient duplicate code
  • use PHP functions to isolate variables
  • use MySQLi and prepared statements for secure database queries
  • manipulate page content immediately with jQuery
  • update the database silently with AJAX
  • upload the project to a web host and deal with important security considerations.
  • PDF version of the course allows full-text search

The course is equally suitable for beginners or more advanced students. For beginners there are step-by-step instructions which take you through every step of the project until all the principles have been covered, and then hand over to assignments which allow you to put into practice what you have learned before you see the solutions.

For learners already familiar with some aspects of web design and development who want to move onto specific points more quickly, incremental working files and clear guidance are provided at every stage, allowing you to skip lessons you do not need and rejoin the course at any point without losing track of the necessary code.

With studio quality audio, widescreen HD video, and incremental versions of the source code, this efficiently organized course teaches up-to-date coding techniques and gives comprehensive coverage of an important aspect of modern web development.

Who this course is for:
  • Anyone interested in web design and development
  • No prior knowledge needed