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


[start=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+]


[start=4]
. link:wish-list-lesson3.html[+Criando um Novo Usuário da Aplicação+]

[start=5]
. link:wish-list-lesson4.html[+Otimizando o Código+]

[start=6]
. link:wish-list-lesson5.html[+Adicionando Segurança. Implementando o Log-in de Usuário da Aplicação+]

[start=7]
. link:wish-list-lesson6.html[+Adicionando um Novo Desejo ao Banco de Dados+]

[start=8]
. link:wish-list-lesson7.html[+Atualizando e Deletando Entradas no Banco de Dados+]

[start=9]
. link:wish-list-lesson8.html[+Melhorando a Aparência da Aplicação Usando a Tecnologia CSS+]

[start=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+]

