// 
//     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.
//

= Creating a Database Driven Application With NetBeans IDE PHP Editor
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Creating a Database Driven Application With NetBeans IDE PHP Editor - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Creating a Database Driven Application With NetBeans IDE PHP Editor


==== Tutorial contents:

1. *=> Creating a Database Driven Application With PHP - Main page*


[start=2]
. Creating the Database

1. link:wish-list-lesson1.html[+Creating a MySQL Database+]
2. link:wish-list-oracle-lesson1.html[+Creating Oracle Database Tables+]
3. 
link:wish-list-lesson2.html[+Designing the Application. Reading from the Database+]


[start=4]
. link:wish-list-lesson3.html[+ Creating a New Application User +]

[start=5]
. link:wish-list-lesson4.html[+Optimizing the Code+]

[start=6]
. link:wish-list-lesson5.html[+Adding Security. Implementing Application User Logon+]

[start=7]
. link:wish-list-lesson6.html[+Adding a New Wish to the Database+]

[start=8]
. link:wish-list-lesson7.html[+Updating and Deleting Entries in the Database+]

[start=9]
. link:wish-list-lesson8.html[+Making the Application Look Better Using the CSS Technology+]

[start=10]
. link:wish-list-lesson9.html[+Deploying the Application on a Remote Web Server+]

In this tutorial, you use the PHP features in the Apache NetBeans to create and run a simple web application. The example shows how to create a wish list. After you create and deploy the application, it enables you to share information on wish lists with your friends, such as lists for wedding, birthday, or holiday gifts. The information is stored in the database that you create in Lesson 1.

Any registered user is able to view the wish lists of other users, and you develop this functionality in Lesson 2.

The application supports registration of new users, a functionality that you develop in Lesson 3.

In Lesson 4 you receive tips for making the code easier to maintain.

Lesson 5 provides you with possible solutions for security issues.

In Lessons 6 and 7 you develop functionality that enables each registered user to edit their own wish list.

You add styles to improve the appearance of your application by applying a CSS style sheet in Lesson 8. Finally, you deploy the application on a remote web server using the hints given in lesson 9.

Code is provided for both users of the MySQL database and users of Oracle Database. The tutorial uses the  ``mysqli``  and OCI8 APIs. For users interested in PDO, a PDO version of the complete tutorial is available for link:https://netbeans.org/projects/www/downloads/download/php/wishlist-pdo.zip[+download+]. Note that the PDO_OCI API is experimental!


*To follow this tutorial, you need the following software and resources.*

|===
|Software or Resource |Version Required 

|A PHP engine |Version 5 

|A web server |link:http://httpd.apache.org/download.cgi[+Apache HTTP Server 2.2+] is recommended.
 

|A database server |MySQL, OracleXE, or Oracle11g 
|===

For details on installing and configuring the required software, see the document that describes link:../../trails/php.html#configuration[+preparing the environment for PHP development+] in your operating system.


== Next Step:

link:wish-list-lesson1.html[+Creating a MySQL Database+]

or

link:wish-list-oracle-lesson1.html[+Creating Oracle Database Tables+]
