// 
//     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
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+]

