// 
//     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 pelo Banco de Dados com o 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 pelo Banco de Dados com o PHP - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Criando uma Aplicação Orientada pelo Banco de Dados com o PHP

= Lição 9: Implantando a Aplicação em um Servidor Web Remoto
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Lição 9: Implantando a Aplicação em um Servidor Web Remoto - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Lição 9: Implantando a Aplicação em um Servidor Web Remoto

Normalmente, uma aplicação PHP de vida real é executada em um servidor remoto e é acessada por um Protocolo de Transferência de Arquivo (FTP - File Transfer Protocol). Para implantar a aplicação CRUD em um servidor remoto, você precisará registrar uma conta em um provedor de hospedagem, registrar uma conta de FTP e criar um banco de dados remoto.

Você pode usar a hospedagem que quiser. O documento atual descreve o procedimento de implantação na hospedagem gratuita X10HOSTING. Essa hospedagem inclui um MySQL, mas não ums ervidor de banco de dados Oracle.

Todos os nomes de usuário, senhas e endereços de e-mail são fictícios e utilizados somente como exemplos. A administração da hospedagem bloqueia uma conta, se o usuário não aparecer no fórum por mais de uma semana. Assim, você pode falhar em aplicar exatamente os mesmos nomes de usuário, senhas, endereços de e-mail e outras credenciais do tutorial.

Nesta lição, você aprenderá a fazer o seguinte:

* Alterar suas definições de conexão de banco de dados para usar o banco de dados remoto

O documento atual é uma parte do tutorial Criando uma Aplicação CRUD no NetBeans IDE para PHP.



== Código-fonte da Aplicação da Lição Anterior

Usuários MySQL: clique link:https://netbeans.org/files/documents/4/1934/lesson8.zip[+aqui+] para fazer o download do código-fonte que reflete o estado do projeto depois que a lição anterior for concluída.


== Registrando uma Conta de E-mail

Crie uma conta de e-mail, se ainda não tiver criado. Neste exemplo, o endereço de e-mail é phpuser65@googlemail.com.


== Registrando uma Conta de Hospedagem

Para criar uma conta de hospedagem na hospedagem gratuita link:http://x10hosting.com/[+X10HOSTING+], siga as etapas no assistente, digitando as seguintes definições. Você irá digitar informações similares em qualquer outro site de hospedagem.

|===
|Definição da Conta  |Valor 

|Endereço de E-mail |phpuser65@gmail.com 

|Nome do Domínio |link:http://x10hosting.com/[+x10Hosting.com+] 

|Subdomínio |phpuser 

|Nome de Usuário da Conta de Hospedagem (também para log-in em cPanel) |phpuser 

|Senha da Conta de Hospedagem (também para log-in em cPanel) |qwerty1234 

|Nome de Usuário do Fórum |phpuser 

|Senha do Fórum |qwerty 

|Nome da Conta FTP |uploader 

|Nome de Usuário do FTP |uploader@phpuser.x10hosting.com 

|Servidor FTP |ftp.phpuser.x10hosting.com 

|Nome do Host do Banco de Dados Remoto |phpuser 

|Banco de Dados Remoto |wishlist 

|Nome de Usuário do Banco de Dados Remoto |phpuser 

|Senha do Usuário do Banco de Dados Remoto |phpuserpw 
|===


== Registrando uma Conta FTP

Agora que tem uma conta de hospedagem, você precisará de uma conta FTP na qual irá transferir o código-fonte do PHP e outros arquivos relacionados para execução no servidor. Para x10Hosting, abra o cPanel e selecione Nova Conta FTP e siga o assistente.


== Criando um Banco de Dados Remoto

Como a aplicação CRUD usa um banco de dados, você também precisará implantar o banco de dados MySQL  ``wishlist``  no servidor remoto onde tem uma <<registerHostingAccount,conta de hospedagem>>.


== Configurando um Projeto PHP com Códigos-Fonte Existentes e Configuração de Execução de Web Site Remoto

1. <<previousLessonSourceCode,Faça download dosarquivos de código-fonte>> que correspondem ao estado da aplicação depois da conclusão da lição anterior. Extraia os arquivos.
2. Salve os arquivos de código-fonte na pasta  ``htdocs`` .
3. Crie um link:project-setup.html#importSources[+projeto PHP com códigos-fonte existentes+]:
* Especifique o local dos códigos-fonte dos quais fez download na pasta Source
* Escolha a configuração de execução link:project-setup.html#remiteWebSite[+Web Site Remoto+] e configure a conexão FTP

[start=4]
. Conclua a criação do projeto.


== Atualizando a Classe WishDB

Até agora, você desenvolveu e executou a aplicação de Lista de Desejos no servidor Web local e usou um servidor de banco de dados MySQL ou Oracle local. Para que a aplicação funcione com o banco de dados MySQL remoto, você precisa atualizar as definições de conexão especificadas por meio das variáveis da classe  ``WishDB`` .

1. Abra o arquivo  ``db.php`` .
2. Altere as variáveis da classe  ``WishDB`` :

[source,php]
----

private $user = "<the name of the remote database user>";        
private $pass = "<the password of the remote database user>";
private $dbName = "<the name of the remote database>";
private $dbHost = "<the account username specified during the hosting account creation>";
----
Nesse exemplo, as variáveis serão atualizadas como se segue:

[source,php]
----

private $user = "phpuser";
private $pass = "phpuserpw";
private $dbName = "wishlist";
private $dbHost = "localhost";
----


== Próximas Etapas

link:wish-list-lesson8.html[+<< Lição anterior+]

link:wish-list-tutorial-main-page.html[+Voltar à página principal do Tutorial+]


link:/about/contact_form.html?to=3&subject=Feedback:%20PHP%20Wish%20List%20CRUD%200:%20Using%20and%20CSS[+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+]

