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

= Criando uma Aplicação Orientada a Banco de Dados com o Editor NetBeans IDE PHP
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Criando uma Aplicação Orientada a Banco de Dados com o Editor NetBeans IDE PHP - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Criando uma Aplicação Orientada a Banco de Dados com o Editor NetBeans IDE PHP



1. *=> Criando uma Aplicação Orientada a Banco de Dados com PHP - Página principal*

2. Criando o Banco de Dados

1. link:wish-list-lesson1.html[+Criando um Banco de Dados MySQL+]
2. link:wish-list-oracle-lesson1.html[+Criando Tabelas do Banco de Dados Oracle+]
3. 
link:wish-list-lesson2.html[+Projetando a Aplicação. Lendo o Banco de Dados+]

4. link:wish-list-lesson3.html[+Criando um Novo Usuário da Aplicação+]
5. link:wish-list-lesson4.html[+Otimizando o Código+]
6. link:wish-list-lesson5.html[+Adicionando Segurança. Implementando o Log-in de Usuário da Aplicação+]
7. link:wish-list-lesson6.html[+Adicionando um Novo Desejo ao Banco de Dados+]
8. link:wish-list-lesson7.html[+Atualizando e Deletando Entradas no Banco de Dados+]
9. link:wish-list-lesson8.html[+Melhorando a Aparência da Aplicação Usando a Tecnologia CSS+]
10. link:wish-list-lesson9.html[+Implantando a Aplicação em um Servidor Web Remoto+]

image::images/netbeans-stamp-80-74-73.png[title="O conteúdo desta página se aplica ao NetBeans IDE 7.2, 7.3, 7.4 e 8.0"]

Neste tutorial, use o suporte a PHP no NetBeans IDE para criar e executar uma aplicação Web simples. O exemplo mostra como criar uma lista de desejos. Depois de ter criado e implantado a aplicação, ele permitirá que você compartilhe as informações nas listas de desejos com seus amigos, como listas de casamento, aniversário ou presentes de datas comemorativas. As informações são armazenadas no banco de dados criado na Lição 1.

Qualquer usuário registrado pode exibir as listas de desejos de outros usuários, e essa funcionalidade é desenvolvida na Lição 2.

A aplicação oferece suporte ao registro de novos usuários, uma funcionalidade desenvolvida na Lição 3.

Na Lição 4, você recebe dicas para facilitar a manutenção do código.

A Lição 5 fornece soluções possíveis para problemas de segurança.

Nas Lições 6 e 7, você desenvolve a funcionalidade que permite que cada usuário registrado edite sua própria lista de desejos.

Adicione estilos para aprimorar a aparência da aplicalção aplicando uma folha de estilo CSS na Lição 8. Finalmente, você irá implantar a aplicação em um servidor Web remoto usando as dicas fornecidas na Lição 9.

O código fornecido para os dois usuários do banco de dados MySQL e usuários do Banco de Dados Oracle. O tutorial usa o  ``mysqli`` e APIs OCI8. Para usuários interessados em PDO, uma versão em PDO do tutorial completo está disponível para link:https://netbeans.org/projects/www/downloads/download/php/wishlist-pdo.zip[+download+]. Observe que a API PDO_OCI é experimental!


*Para seguir este tutorial, são necessários os recursos e o software a seguir.*

|===
|Software ou Recurso |Versão Necessária 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |Pacote de download do PHP 

|Um mecanismo PHP |Versão 5 

|Um servidor web |É recomendado o link:http://httpd.apache.org/download.cgi[+Apache HTTP Server 2.2+].
 

|Um servidor de banco de dados |MySQL, OracleXE, ou Oracle11g 
|===

Para obter detalhes sobre como instalar e configurar o software necessário, consulte o documento que descreve a link:../../trails/php.html#configuration[+preparação do ambiente para desenvolvimento de PHP+] no sistema operacional.


== Próxima Etapa:

link:wish-list-lesson1.html[+Criando um Banco de Dados MySQL+]

ou

link:wish-list-oracle-lesson1.html[+Criando Tabelas do Banco de Dados Oracle+]


link:/about/contact_form.html?to=3&subject=Feedback:%20PHP%20Wish%20List%20CRUD%20Main[+Enviar Feedback neste Tutorial+]


Para enviar comentários e sugestões, obter suporte e manter-se informado sobre os desenvolvimentos mais recentes das funcionalidades de desenvolvimento PHP do NetBeans IDE, link:../../../community/lists/top.html[+junte-se à lista de correspondência users@php.netbeans.org+].

link:../../trails/php.html[+Voltar à Trilha do Aprendizado PHP+]

