Nesta lição, você cria e configura o projeto PHP para desenvolver sua aplicação, cria uma lista de páginas na aplicação e define as relações entre eles. Também desenvolve a funcionalidade básica da aplicação e a testa contra os dados inseridos no banco de dados de amostra na lição 1.
O código PHP escrito nessa lição executa as seguintes funções:
1. Obtém o nome de uma pessoa que o usuário digita.
2. Verifica se a pessoa realmente está no banco de dados. Fecha com uma mensagem de erro caso a pessoa não esteja no banco de dados.
3. Exibe uma tabela dos desejos dessa pessoa.
O documento atual é uma parte do tutorial Criando uma Aplicação Orientada pelo Banco de Dados no NetBeans IDE para PHP.
Criando um Projeto PHP
Selecione Arquivo > Novo Projeto (Ctrl-Shift-N no Linux e Windows, ⌘-Shift-N no MacOS). Crie um novo projeto PHP chamado “wishlist” (lista de desejos). Quando você cria um projeto PHP, ele contém o arquivo index index.php por default. Para obter informações sobre como criar e configurar um projeto PHP, consulte Configurando um Projeto PHP.
Definindo um Diagrama de Fluxo de Página
O escopo da sua aplicação cobre os seguintes casos de uso:
O usuário visualiza a lista de desejos de uma pessoa.
O usuário se registra como um novo wisher.
O usuário se conecta e cria sua lista de desejos.
O usuário se conecta e edita sua lista de desejos.
Para cobrir essa funcionalidade básica, você precisará implementar os seguintes arquivos PHP:
A página "inicial" index.php é usada para fazer log-in, registrar e alternar para as listas de desejos de outros usuários.
A página wishlist.php para exibir a lista de desejos de um wisher.
A página createNewWisher.php para registro como um wisher.
A página editWishList.php para editar uma lista de desejos pelo proprietário.
A página editWish.php para criar e editar desejos.
Agora que finalizou as etapas preliminares, você pode começar a implementar a funcionalidade básica da sua aplicação. Comece visualizando a lista de desejos de um wisher. Esta funcionalidade não envolve quaisquer validações e pode ser testada facilmente, já que você já indicou os dados de teste no banco de dados. A funcionalidade será implementada em duas páginas, index.php e wishlist.php.
Adicionando um Form a um index.php
O arquivo index.php não conterá códigos PHP, portanto, você poderá remover facilmente o seguinte bloco:
O arquivo index.php é usado para dois propósitos:
Exibir uma página com controles para indicar dados.
Transferir os dados inseridos a outro arquivo PHP, onde os dados serão processados. Neste tutorial, os dados são passados para um arquivo chamado wishlist.php, no qual, na próxima seção, você criará e escreverá os códigos.
Essas ações são realizadas por meio de um form HTML. Cada form HTML contém:
Um conjunto de campos que corresponde aos controles na página.
A “ação” que é executada depois que o usuário envia os dados do form. A ação é representada pelo caminho à página que processa os dados.
Para adicionar um form ao index.php:
Alterne para a janela Projetos, expanda o nó do seu projeto e o nó de Arquivos de Código-fonte e clique duas vezes no arquivo index.php. O arquivo index.php se abre na área do editor principal do IDE. O arquivo contém um modelo para a inserção dos códigos HTML e PHP.
Observação: você pode ignorar as advertências do validador HTML.
.
Remova o bloco PHP. O arquivo index.php não conterá códigos PHP.
Abra a Paleta no menu Janela ou pressione Ctrl-Shift-8.
Na seção Forms HTML da Paleta, arraste e solte um Form na seção <body> do index.php.
A Caixa de Diálogo Inserir Form abre. No campo Ação, digite o caminho até o arquivo para o qual o form transferirá dados. Nesse caso, digite wishlist.php. (Você criará esse arquivo no mesmo local que o index.php. Consulte Criando wishlist.php e Testando a Aplicação.) Selecione o método GET para a transferência de dados. Dê um nome arbitrário ao form, como wishList. Clique em OK quando acabar.
O arquivo agora tem a seguinte aparência:
Entre os identificadores de abertura e fechamento do form, digite o texto “Show wish list of: ”.
Arraste um componente de Entrada de Texto da seção Forms HTML da Paleta até o espaço após o texto “Show wish list of: ”. A caixa de diálogo Inserir Texto abre.
Nomeie a entrada como user. Selecione o tipo de entrada text. Deixe todos os outros campos vazios e clique em OK.
O arquivo agora tem a seguinte aparência:
Adicione uma linha em branco acima da tag </form>. Nessa linha em branco, arraste e solte um componente Botão da seção Forms HTML da Paleta.
A caixa de diálogo Inserir Botão abre. Digite Go no campo Label e clique em OK.
Agora, o form se parece com o código abaixo, com uma única diferença. No código abaixo, o atributo method está explícito na tag <form>. O NetBeans IDE não adicionou o atributo method ao seu form, pois o GET é o valor default desse atributo. Entretanto, você pode entender o código com mais facilidade se o atributo method estiver explícito.
<form action="wishlist.php" method="GET" name="wishList"> Show wish list of: <input type="text" name="user" value=""/> <input type="submit" value="Go" /> </form>
Observe os seguintes elementos do form:
A tag de abertura <form> contém o atributo action. O atributo action especifica o arquivo para o qual o form transferirá dados. Nesse caso, o arquivo se chama wishlist.php e está na mesma pasta que o index.php. (Você criará esse arquivo na seção Criando wishlist.php e Testando a Aplicação.)
A tag de abertura <form> também contém o método a ser aplicado para a transferência de dados (GET). O PHP usa um array $_GET ou $_POST para os valores passados pelo form, dependendo do valor do atributo method. Nesse caso, o PHP usa $_GET.
Um componente de entrada detexto. Esse componente é um campo de texto usado para inserir o nome do usuário cuja lista de desejos você deseja exibir. O valor inicial do campo de texto é uma sequência de caracteres vazia. O nome desse campo é user. O PHP usa o nome do campo ao criar um array para os valores do campo. Nesse caso, o array para os valores desse campo é htmlentities($_GET["user"]).
Um componente de entrada submit com o valor “Ir”. O tipo "submit" significa que o campo de entrada aparece na página como um botão. O valor “Ir” é o label do botão. Quando o usuário clica no botão, os dados no componente texto são transferidos para o arquivo especificado no atributo action.
Criando wishlist.php e Testando a Aplicação
Em Adicionando um Form ao index.php, foi criado um form no qual o usuário envia o nome de alguém cuja lista de desejos o usuário deseja ver. O nome é passado para a página wishlist.php. Entretanto, essa página não existe. Se você executar o index.php, ocorrerá um erro 404: File Not Found ao enviar um nome. Nesta seção, você criará a página wishlist.php e testará a aplicação.
Para criar a wishlist.php e testar a aplicação:
Dentro do projeto “lista de desejos” que você criou, clique com o botão direito do mouse no nó dos arquivos de código-fonte e, no menu de contexto, selecione Novo > Página Web PHP. O assistente Nova Página Web de PHP é aberto.
Digite wishlist no campo Nome do Arquivo e pressione Finalizar.
Clique com o botão direito do mouse no nó Código-fonte e selecione Executar Projeto no menu de contexto ou clique no ícone Executar Projeto Principal na barra de ferramentas, caso você tenha definido o seu projeto como Principal.
Na lista de desejos Mostrar : caixa de edição, digite Tom e clique em Ir. Uma página vazia com a seguinte URL aparecerá: http://localhost:90/Lesson2/wishlist.php?user=tom. Esse URL indica que a sua página principal funciona corretamente.
Estabelecendo a Conexão e Obtendo o Wisher ID
Nesta seção, você primeiro adiciona o código ao arquivo wishlist.php que cria uma conexão ao banco de dados. Em seguida, adiciona o código para recuperar o número do wisher ID cujo nome foi digitado no form index.php.
Clique duas vezes no arquivo wishlist.php. O modelo que se abre é diferente do index.php. Comece e termine o arquivo com as tags <html></html> e <body></body>, já que o arquivo também conterá um código HTML.
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <?php // put your code here ?> </body> </html>
Para exibir o título, digite o seguinte bloco de código imediatamente depois da tag de abertura <body>, antes da tag <?php gerada:
Wish List of <?php echo htmlentities($_GET["user"])."<br/>";?>
O código agora tem a seguinte aparência:
<body>Wish List of <?php echo htmlentities($_GET["user"])."<br/>";?> <?php
// put your code here
</body>
O bloco de código PHP exibe os dados recebidos usando o método GET no campo "user". Esses dados são transferidos do index.php onde o nome do proprietário da lista de desejos Tom foi inserido no campo de texto "user". Repita as etapas de Testando index.php para ver se o wishlist.php funciona corretamente.
Delete a seção comentada no bloco PHP do modelo. Em seu lugar, digite ou cole no código a seguir. Esse código abre a conexão ao banco de dados.
Para o banco de dados MySQL:
$con = mysqli_connect("localhost", "phpuser", "phpuserpw"); if (!$con) { exit('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); } //set the default client character set mysqli_set_charset($con, 'utf-8');
O código tenta abrir uma conexão ao banco de dados e gera uma mensagem de erro, caso haja uma falha.
Observação para os usuários do banco de dados Oracle: Pode ser preciso alterar a conexão ao banco de dados no comando oci_connect. A sintaxe padrão é “nome do host/nome do serviço". A conexão ao banco de dados Oracle XE nesse snippet de código é “localhost/XE” para seguir essa sintaxe.
Observação: É possível usar a funcionalidade autocompletar código do NetBeans IDE para as funções mysqli ou OCI8.
Abaixo do código para abrir a conexão ao banco de dados, no mesmo bloco PHP, digite ou cole o código a seguir. Esse código recupera o wisher ID cuja lista tenha sido solicitada. Se o wisher não estiver no banco de dados, o código terminará o processo, ou sairá dele, e exibirá uma mensagem de erro.
Para o banco de dados MySQL:
mysqli_select_db($con, "wishlist");
$user = mysqli_real_escape_string($con, htmlentities($_GET["user"]));
$wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'");
if (mysqli_num_rows($wisher) < 1) {
exit("The person " . htmlentities($_GET["user"]) . " is not found. Please check the spelling and try again");
} $row = mysqli_fetch_row($wisher); $wisherID = $row[0]; mysqli_free_result($wisher);
Para o banco de dados Oracle: (Observe que o oci8 não tem um equivalente para mysqli_num_rows)
$query = "SELECT id FROM wishers WHERE NAME = :user_bv";
$stid = oci_parse($con, $query);
$user = $_GET['user'];
oci_bind_by_name($stid, ':user_bv', $user);
oci_execute($stid);
//Because user is a unique value I only expect one row
$row = oci_fetch_array($stid, OCI_ASSOC);
if (!$row) {
exit("The person " . $user . " is not found. Please check the spelling and try again" );
}
$wisherID = $row['ID'];
oci_free_statement($stid);
Os dados são selecionados no banco de dados wishlist usando a conexão $con. O critério de seleção é o nome recebido do index.php como "user".
A sintaxe de uma instrução SQL SELECT pode ser descrita brevemente da seguinte forma:
Depois de SELECT, especifique os campos dos quais você deseja obter os dados. Um asterisco (*) representa todos os campos.
Depois da cláusula FROM, especifique o nome da tabela da qual os dados devem ser recuperados.
A cláusula WHERE é opcional. Especifique as condições do filtro nela.
A consulta mysqli retorna um objeto de resultado. O OCI8 retorna uma instrução executada. Em ambos os casos, você extrai uma linha como o resultado da consulta executada e extrai o valor da linha ID, armazendo-o na variável $wisherID.
Por último, você libera o resultado da mysqli ou a instrução do OCI8. É necessário liberar todos os recursos que usam uma conexão antes que a conexão seja fisicamente fechada. Do contrário, o sistema interno de refcounting do PHP continuará mantendo a conexão do banco de dados subjacente aberta, mesmo se o $con não for mais utilizável seguindo a chamada mysqli_close() ou oci_close().
Observação de segurança: Para MySQL, o parâmetro htmlentities($_GET["user"]) tem escape para evitar os ataques de injeção SQL. Consulte Wikipedia sobre injeções SQL e a documentação mysql_real_escape_string. Embora no contexto deste tutorial você não esteja correndo o risco de injeções SQL prejudiciais, recomendamos escapar as strings nas consultas MySQL que estariam correndo risco de tal ataque. O OCI8 evita isso por meio de variáveis de bind.
Este bloco PHP agora está concluído. Se você estiver usando um banco de dados MySQL, o arquivo wishlist.php se parecerá com o seguinte:
Wish List of <?php echo htmlentities($_GET["user"]) . "<br/>"; ?>
<?php
$con = mysqli_connect("localhost", "phpuser", "phpuserpw");
if (!$con) {
exit('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
//set the default client character set
mysqli_set_charset($con, 'utf-8');
mysqli_select_db($con, "wishlist");
$user = mysqli_real_escape_string($con, htmlentities($_GET["user"]));
$wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'");
if (mysqli_num_rows($wisher) < 1) {
exit("The person " . htmlentities($_GET["user"]) . " is not found. Please check the spelling and try again");
}
$row = mysqli_fetch_row($wisher);
$wisherID = $row[0];
mysqli_free_result($wisher);
?>
Se você estiver usando um banco de dados Oracle, o arquivo wishlist.php se parecerá com o seguinte:
Wish List of <?php echo htmlentities($_GET["user"]) . "<br/>"; ?>
<?php
$con = oci_connect("phpuser", "phpuserpw", "localhost/XE", "AL32UTF8");
if (!$con) {
$m = oci_error();
exit('Connect Error ' . $m['message'];
exit;
}
$query = "SELECT id FROM wishers WHERE name = :user_bv";
$stid = oci_parse($con, $query);
$user = htmlentities($_GET["user"]);
oci_bind_by_name($stid, ':user_bv', $user);
oci_execute($stid);
//Because user is a unique value I only expect one row
$row = oci_fetch_array($stid, OCI_ASSOC);
if (!$row) {
exit("The person " . $user . " is not found. Please check the spelling and try again" );
}
$wisherID = $row["ID"];
oci_free_statement($stid);
?>
Se você testar a aplicação e inserir um usuário inválido, a mensagem seguinte aparecerá.
Exibindo uma Tabela de Desejos
Nessa seção, você pode adicionar o código que exibe uma tabela HTML dos desejos associados ao wisher. O wisher é identificado pelo ID recuperada no código da seção anterior.
Abaixo do bloco PHP, digite ou cole o seguinte bloco de código HTML. Esse código abre uma tabela, especifica a cor de suas bordas (preto), e "desenha" o cabeçalho da tabela com as colunas "Item" e "Data de vencimento."
A consulta SELECT recupera os desejos com suas datas de vencimento para o whisher especificado por seu ID, que foi recuperada na etapa 4, e armazena os desejos e as datas de vencimento em um array $result.
Um loop exibe os itens do array $result como linhas na tabela enquanto o array não está vazio.
As linhas do form das tags <tr></tr>, as células do form das tags <td></td> nas linhas, e \n inicia uma nova linha.
A função htmlentities converte todos os caracteres que tenham a entidade HTML equivalentes às entradas HTML. Isso ajuda a prevenir scripts de site cruzados.
As funções, no final, liberam todos os recursos (resultados do mysqli e instruções do OCI8) e fecha a conexão ao banco de dados. Observe que é necessário liberar os recursos que usam uma conexão antes que a conexão possa ser fisicamente fechada. Do contrário, o sistema interno de refcounting do PHP manterá a conexão do banco de dados subjacente aberta, mesmo se a conexão não for mais utilizável seguindo a chamada oci_close() ou mysqli_close().
Cuidado: Certifique-se de digitar os nomes dos campos de banco de dados exatamente como eles foram especificados durante a criação da tabela do banco de dados. Para Oracle, os nomes das colunas são retornados com letras maiúsculas por default.
Para testar a aplicação, execute o projeto como descrito na seção Testando index.php.
O código-fonte da Aplicação após a Lição Atual está Concluído
Usuários MySQL: clique aqui para fazer o download do código-fonte que reflete o estado do projeto depois que a lição estiver concluída.
Usuários de banco de dados Oracle: clique aqui para fazer o download do código-fonte que reflete o estado do projeto depois que a lição estiver concluída.
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, junte-se à lista de correspondência .