// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= PHP and HTML5 Learning Trail
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:toc: left
:toc-title:
:description: PHP Tutorials

Below are resources for using NetBeans IDE to develop PHP applications and HTML5 applications.

== Getting Started

- link:../webclient/html5-gettingstarted.html[Getting Started with HTML5 Applications]
- link:quickstart.html[Getting Started with PHP Applications]

[[configuration]]
== Configuration

- link:configure-php-environment-mac-os.html[Configuring PHP, Apache, MySQL, and Xdebug for PHP development in MAC OS X]
- link:configure-php-environment-windows.html[Configuring PHP Development Environment in Windows]
- link:configure-php-environment-ubuntu.html[Configuring the PHP Development Environment in Linux Ubuntu]

== Tutorials and Articles

- link:project-setup.html[Setting Up a PHP Project]
- link:code-templates.html[Code Templates in NetBeans IDE for PHP]
- link:ajax-quickstart.html[Introduction to Ajax for PHP Web Applications]
- link:phpunit.html[Testing with PHPUnit and Selenium]
- link:debugging.html[Debugging PHP Source Code in the NetBeans IDE]
- link:remote-hosting-and-ftp-account.html[Deploying a PHP Application on a Remote Web Server Using the NetBeans IDE]

== Creating a Database Driven Application With PHP

- link:wish-list-tutorial-main-page.html[Main Page: Creating a Database Driven Application With PHP]
- link:wish-list-lesson1.html[Lesson 1a: Creating a MySQL Database]
- link:wish-list-oracle-lesson1.html[Lesson 1b: Creating Oracle Database Tables]
- link:wish-list-lesson2.html[Lesson 2: Designing the Application. Reading from the Database]
- link:wish-list-lesson3.html[Lesson 3: Creating a New Application User]
- link:wish-list-lesson4.html[Lesson 4: Optimizing the Code]
- link:wish-list-lesson5.html[Lesson 5: Adding Security. Implementing Application User Logon]
- link:wish-list-lesson6.html[Lesson 6: Adding a New Wish to the Database]
- link:wish-list-lesson7.html[Lesson 7: Updating and Deleting Entries In the Database]
- link:wish-list-lesson8.html[Lesson 8: Making the Application Look Better Using CSS]
- link:wish-list-lesson9.html[Lesson 9: Deploying the Application on a Remote Web Server]

