Académique Documents
Professionnel Documents
Culture Documents
https://netbeans.org/kb/docs/php/wish-list-lesson4_pt_BR.html?print=yes
Criando uma Aplicao Orientada pelo Banco de Dados com o PHP Lio 4: Otimizando o Cdigo com Classes e Objetos
Contedo do tutorial: 0. Criando uma Aplicao Orientada pelo Banco de Dados com o PHP - Pgina Principal 1. Criando o Banco de Dados a. Criando um Banco de Dados MySQL b. Criando Tabelas do Banco de Dados Oracle 2. Projetando a Aplicao. Lendo o Banco de Dados 3. Criando um Novo Usurio da Aplicao 4. => Otimizando o Cdigo Cdigo-fonte da Aplicao da Lio Anterior Criando o Arquivo db.php Criando a Classe WishDB Instanciando a Classe WishDB Adicionando um Construtor Classe WishDB Funes da Classe WishDB Funo get_wisherID_by_name Funo get_wishes_by_wisher_id Funo create_wisher Refatorando o Cdigo da Sua Aplicao Refatorando o Arquivo wishlist.php Refatorando o Arquivo createNewWisher.php O Cdigo-fonte da Aplicao aps a Lio Atual est Concludo Adicionando Segurana. Implementando o Log-in de Usurio da Aplicao Adicionando um Novo Desejo ao Banco de Dados Atualizando e Deletando Entradas no Banco de Dados Melhorando a Aparncia da Aplicao Usando a Tecnologia CSS Implantando a Aplicao em um Servidor Web Remoto
5. 6. 7. 8. 9.
Nesta lio, voc otimizar o cdigo para facilitar sua manuteno no futuro. Isso afeta os arquivos createNewWisher.php e wishlist.php. Alm disso, um novo arquivo chamado db.php criado. O cdigo do sua aplicao contm vrios blocos de cdigo semelhantes com consultas ao banco de dados. Para facilitar a leitura e a manuteno do cdigo no futuro, voc pode extrair esses blocos, implement-los como funes de uma classe separada chamada WishDB e colocar WishDB em db.php. Depois disso, voc pode incluir o arquivo db.php em qualquer arquivo PHP e usar qualquer funo de WishDB sem duplicao de cdigo. Essa abordagem garante que quaisquer alteraes em consultas ou funes sero feitas em um nico local e voc no ter de fazer parsing do cdigo inteiro da aplicao. Ao usar uma funo de WishDB, voc no altera o valor de quaisquer variveis de WishDB. Em vez disso, use a classe WishDB como um plano grfico para criar um objeto de WishDB, e altere os valores das variveis nesse objeto. Quando voc finaliza o trabalho com esse objeto, ele destrudo. Como os valores da classe WishDB nunca so alterados, voc pode reutilizar a classe por um nmero ilimitado de vezes. Em alguns casos, talvez voc queira ter vrias instncias de uma classe ao mesmo tempo, e em outros casos, talvez voc prefira uma classe "nica", onde voc possui apenas uma instncia de cada vez. O WishDB neste tutorial uma classe nica. Observe que o termo para criar um objeto de uma classe "instanciar" essa classe, e que outra palavra para um objeto uma "instncia" de uma classe. O termo geral para programar com classes e objetos "programao orientada por objeto" ou OOP. O PHP 5 usa um modelo OOP sofisticado. Consulte php.net para obter mais informaes. Neste tutorial, a funcionalidade de chamada do banco de dados movida de arquivos PHP individuais para classes WishDB. Usurios do MySQL tambm podem substituir a chamada mysqli de estilo de procedimento por chamadas orientadas por objetos. Isso para manter com o novo projeto orientado por objetos da aplicao O documento atual uma parte do tutorial Criando uma Aplicao CRUD no NetBeans IDE para PHP.
1 de 7
17/09/2013 13:06
Criando uma Aplicao Orientada pelo Banco de Dados Com o PHP. O...
https://netbeans.org/kb/docs/php/wish-list-lesson4_pt_BR.html?print=yes
// single instance of self shared among all instances private static $instance = null;
// db connection config vars private $user = "phpuser"; private $pass = "phpuserpw"; private $dbName = "wishlist"; private $dbHost = "localhost"; }
// single instance of self shared among all instances private static $instance = null;
// db connection config vars private $user = "phpuser"; private $pass = "phpuserpw"; private $dbName = "wishlist"; private $dbHost = "localhost/XE"; private $con = null;
A funo getInstance "pblica" e "esttica." "Pblica" significa que ela pode ser acessada publicamente de fora da classe. "Esttica" significa que a
2 de 7
17/09/2013 13:06
Criando uma Aplicao Orientada pelo Banco de Dados Com o PHP. O...
https://netbeans.org/kb/docs/php/wish-list-lesson4_pt_BR.html?print=yes
funo est disponvel mesmo quando a classe no tiver sido instanciada. Como a funo getInstance chamada para instanciar a classe, ela deve ser esttica. Observe que essa funo acessa a varivel$instance esttica e ajusta os valores como a instncia da classe. Os dois-pontos duplos (::), chamados de Operador de Resoluo de Escopo, e a palavra-chave self so usados para acessar funes estticas. Self usado na definio da classe para se referir classe em si. Quando os dois-pontos duplos forem usados fora da definio da classe, o nome da classe ser usado em vez de self. Consulte php.net no Operador de Resoluo de Escopo.
Observe o uso da pseudovarivel $this em vez das variveis $con, $dbHost, $user ou $pass. A pseudovarivel $this usada quando um mtodo chamado de dentro do contexto de um objeto. Ela se refere ao valor de uma varivel nesse objeto.
Funo get_wisher_id_by_name
A funo requer o nome de um wisher como parmetro de entrada e retorna o wisher id. Digite ou cole a seguinte funo na classe WishDB, depois da funo WishDB: Para o banco de dados MySQL:
public function get_wisher_id_by_name($name) { $name = $this->real_escape_string($name); $wisher = $this->query("SELECT id FROM wishers WHERE name = '" . $name . "'"); if ($wisher->num_rows > 0){ $row = $wisher->fetch_row(); return $row[0]; } else return null; }
O bloco de cdigo executa a consulta SELECT ID FROM wishers WHERE name = [varivel para o nome do wisher]. O resultado da consulta um array de IDs dos registros que satisfazem a consulta. Se o array no estiver vazio, isso significa automaticamente que ela contm um elemento porque o nome do campo especificado como NICO durante a criao da tabela. Nesse caso, a funo retorna o primeiro elemento do array $result (o elemento
3 de 7
17/09/2013 13:06
Criando uma Aplicao Orientada pelo Banco de Dados Com o PHP. O...
https://netbeans.org/kb/docs/php/wish-list-lesson4_pt_BR.html?print=yes
com zero). Se o array estiver vazio, a funo retornar nula. Observao sobre Segurana: Para o banco de dados MySQL, a string $name tem escape para evitar os ataques de injeo SQL. Consulte Wikipedia sobre injees SQL e a documentao mysql_real_escape_string. Embora no contexto deste tutorial voc no esteja correndo o risco de injees SQL prejudiciais, recomendamos escapar as strings nas consultas MySQL que estariam correndo risco de tal ataque. O banco de dados Oracle evita esse problema usando variveis de ligao.
Funo get_wishes_by_wisher_id
A funo exige o id de um wisher como o parmetro de entrada e retorna os desejos registrados para o wisher. Indique o seguinte bloco de cdigo: Para o banco de dados MySQL:
public function get_wishes_by_wisher_id($wisherID) { return $this->query("SELECT id, description, due_date FROM wishes WHERE wisher_id=" . $wisherID); }
O bloco de cdigo executa a consulta "SELECT id, description, due_date FROM wishes WHERE wisherID=" . $wisherID e retorna um conjunto de resultados que um array de registros que atende consulta. (O banco de dados Oracle usa variveis de ligao para o desempenho do banco de dados e motivos de segurana). A seleo realizada pelo wisherID, que a chave estrangeira dos desejos da tabela. Observao: o valorid no necessrio at a Lio 7.
Funo create_wisher
A funo cria um novo registro na tabela de wishers. A funo requer o nome e a senha de um novo wisher como os parmetros de entrada e no retorna dados. Indique o seguinte bloco de cdigo: Para o banco de dados MySQL:
public function create_wisher ($name, $password){ $name = $this->real_escape_string($name); $password = $this->real_escape_string($password); $this->query("INSERT INTO wishers (name, password) VALUES ('" . $name . "', '" . $password . "')"); }
O bloco de cdigo executa a consulta "INSERT wishers (Name, Password) VALUES ([variveis representando o nome e a senha do novo wisher]). A consulta adiciona um novo registro tabela "wishers" com os campos "nome" e "senha" preenchidos com os valores de $name e $password respectivamente.
2. Substitua o cdigo que estabelece conexo com o banco de dados e que obtm o wisher ID por uma chamada para a funo get_wisher_id_by_name. Para o banco de dados MySQL, o cdigo a ser substitudo :
$con = mysqli_connect("localhost", "phpuser", "phpuserpw"); if (!$con) { exit('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); }
4 de 7
17/09/2013 13:06
Criando uma Aplicao Orientada pelo Banco de Dados Com o PHP. O...
https://netbeans.org/kb/docs/php/wish-list-lesson4_pt_BR.html?print=yes
//set the default client character set mysqli_set_charset($con, 'utf-8'); mysqli_select_db($con, "wishlist"); $user = mysqli_real_escape_string($con, $_GET['user']); $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='" . $user . "'"); if (mysqli_num_rows($wisher) < 1) { exit("The person " . $_GET['user'] . " is not found. Please check the spelling and try again"); } $row = mysqli_fetch_row($wisher); $wisherID = $row[0]; mysqli_free_result($wisher);
$wisherID = WishDB::getInstance()->get_wisher_id_by_name($_GET["user"]); if (!$wisherID) { exit("The person " .$_GET["user"]. " is not found. Please check the spelling and try again" ); }
$wisherID = WishDB::getInstance()->get_wisher_id_by_name($_GET["user"]); if (!$wisherID) { exit("The person " .$_GET["user"]. " is not found. Please check the spelling and try again" ); }
O novo cdigo chama primeiro a funo getInstance no WishDB. O getInstance retorna uma instncia de WishDB, e o cdigo chama a funo get_wisher_id_by_name dentro dessa instncia. Se a lista de desejos solicitada no for encontrada no banco de dados, o cdigo terminar o processo, e exibir uma mensagem de erro. Nenhum cdigo necessrio para abrir uma conexo ao banco de dados. A conexo aberta pelo construtor da classe WishDB. Se o nome e/ou a senha for alterado, voc precisar atualizar somente as variveis relevantes da classe WishDB. 3. Substitua o cdigo que recebe desejos de um wisher identificado pelo ID com um cdigo que chama a funo get_wishes_by_wisher_id. Para o banco de dados MySQL, o cdigo a ser substitudo :
$result = mysqli_query($con, "SELECT description, due_date FROM wishes WHERE wisher_id=". $wisherID); $result = WishDB::getInstance()->get_wishes_by_wisher_id($wisherID);
O cdigo no necessrio porque a conexo ao banco de dados automaticamente fechada quando o objeto WishDB destrudo. No entanto, mantenha o cdigo que libera o recurso. necessrio liberar todos os recursos que usam uma conexo para garantir que a conexo seja fechada corretamente, mesmo quando a funo close chamada ou se a instncia for destruda com a conexo do banco de dados.
5 de 7
17/09/2013 13:06
Criando uma Aplicao Orientada pelo Banco de Dados Com o PHP. O...
https://netbeans.org/kb/docs/php/wish-list-lesson4_pt_BR.html?print=yes
2. Delete a credencial da conexo do banco de dados ($dbHost, etc). Esses esto agora em db.php.. 3. Substitua o cdigo que estabelece conexo com o banco de dados e que obtm o wisher ID por uma chamada para a funo get_wisher_id_by_name. Para o banco de dados MySQL, o cdigo a ser substitudo :
$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');
/** Check whether a user whose name matches the "user" field already exists */ mysqli_select_db($con, "wishlist"); $user = mysqli_real_escape_string($con, $_POST['user']); $wisher = mysqli_query($con, "SELECT id FROM wishers WHERE name='".$user."'"); $wisherIDnum=mysqli_num_rows($wisher); if ($wisherIDnum) { $userNameIsUnique = false; }
O objeto WishDB existe enquanto a pgina atual estiver sendo processada. Ele destrudo depois que o processamento concludo ou interrompido. O cdigo para abrir uma conexo ao banco de dados no necessrio porque isso feito pela funo WishDB. O cdigo para fechar a conexo no necessrio porque a conexo fechada assim que o objeto WishDB destrudo. 4. Substitua o cdigo que insere novos desejos no banco de dados pelo cdigo que chama a funo create_wisher. Para o banco de dados MySQL, o cdigo a ser substitudo :
if (!$userIsEmpty && $userNameIsUnique && !$passwordIsEmpty && !$password2IsEmpty && $passwordIsValid) { $password = mysqli_real_escape_string($con, $_POST["password"]); mysqli_select_db($con, "wishlist"); mysqli_query($con, "INSERT wishers (name, password) VALUES ('" . $user . "', '" . $password . "')"); mysqli_free_result($wisher); mysqli_close($con); header('Location: editWishList.php'); exit; } if (!$userIsEmpty && $userNameIsUnique && !$passwordIsEmpty && !$password2IsEmpty && $passwordIsValid) { WishDB::getInstance()->create_wisher($_POST["user"], $_POST["password"]); header('Location: editWishList.php' ); exit; }
6 de 7
17/09/2013 13:06
Criando uma Aplicao Orientada pelo Banco de Dados Com o PHP. O...
https://netbeans.org/kb/docs/php/wish-list-lesson4_pt_BR.html?print=yes
exit; }
if (!$userIsEmpty && $userNameIsUnique && !$passwordIsEmpty && !$password2IsEmpty && $passwordIsValid) { WishDB::getInstance()->create_wisher($_POST["user"], $_POST["password"]); header('Location: editWishList.php' ); exit; }
Prximas Etapas
<< Lio anterior Prxima lio >> Voltar pgina principal do Tutorial
Links teis
Saiba mais sobre o uso de classes em PHP: Classes e Objetos Saiba mais sobre a refatorao de cdigo PHP: Sete Etapas Para Melhorar o Cdigo PHP Refatorao do PHP Envie-nos Seu Feedback Para enviar comentrios e sugestes, obter suporte e manter-se informado sobre os desenvolvimentos mais recentes das funcionalidades de desenvolvimento PHP do NetBeans IDE, junte-se lista de correspondncia users@php.netbeans.org. Voltar Trilha de Aprendizado PHP
7 de 7
17/09/2013 13:06