Jump to content


Balala

Member Since 30/01/2003
Offline Last Active 14/01/2011, 12:20
*****

#600532 Padrões De Postagem

Posted by Balala on 16/06/2005, 16:00

Segue abaixo um exemplo de como deve ser seguido como padrão para demais Scripts postados aqui:

========================================

Título: minha_funcao()
Descrição: Quebra a frase por espaço

---------------------------------------------------------

Sintaxe: minha_funcao(STR FRASE , STR SEPARADOR)
Retorno: Array
Descrição: Chame a função passando a frase para ser cortada como primeiro parâmetro e o caractere separador como segundo parâmetro.
Limitações: JS 1.x

Função:
<script type="text/javascript">
function minha_funcao(frase,separador){
result=new Array(1);
var count=0;
var temp=new String(frase);

while (temp.indexOf(separador)>0) {
result[count]=temp.substr(0,temp.indexOf(separador));
temp=temp.substr(temp.indexOf(separador)+1,temp.length-temp.indexOf(separador)+1);
count=count+1;
}

result[count]=temp;
return result;
}</script>

========================================

Código inserido entre as TAGs [ CODE ] e [ /CODE ].

Qualquer dúvida sobre os padrões podem ser postadas nesse tópico. Obrigado a todos ;)


#579906 Xmlhttprequest

Posted by Balala on 06/05/2005, 14:13

Tutorial: Utilização do XMLHttpRequest (JavaScript), para apresentar conteúdo sem necessidade de atualizar a página.
Nível: Básico - Intermediário.
Requerimentos Extras (bibliotecas): Nenhum.

===============-===============

Hello there!

Antes de mais nada, algumas explicações. Esse tutorial tem como base para o script, praticamente, JavaScript, mas porque PHP? Simples, estamos combinando as duas linguaguens para podermos trabalhar com dados em formulários (pode ir muito além), que se alteram dependendo de opções selecionadas, sem ter que atualizar a página, para fazer a requisição PHP novamente.

No mais, vamos ao que interessa.

===============-===============

Como é feito essa consulta?
Você se pergunta. É algo simples como uma query string. Na verdade, é uma pura query string. Quem já trabalhou com a integração de PHP + Flash, para fazer loadMovie()'s dinâmicos, etc, terá uma maior afinidade com esse tutorial.

Basicamente a consulta consiste em:
- Alterar algum valor;
- Passar esse valor como parâmetro para o PHP;
- Retornar o resultado que desejamos;

Beleza, vamos começar por onde?
Para todos terem o mesmo ponto de inicio, vamos seguir um exemplo do inicio ao fim. Nossa idéia é:

- Apresentar SubCategorias, dependendo da Categoria principal selecionada.

Simples? Sim, algumas consultas ao Banco de Dados, e está resolvido nosso problema.

Para começar, vamos a criação das Tabelas:

CREATE TABLE `categorias` (
  `codigo` int(3) NOT NULL auto_increment,
  `nome` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`codigo`)
);

CREATE TABLE `subcategoria` (
  `codigo` int(3) NOT NULL auto_increment,
  `categoria` int(3) NOT NULL default '0',
  `nome` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`codigo`)
);

Prontinho, vamos entender a estrutura:

Tabela Categoria:
- codigo: Campo AUTO_INCREMENT para armazenar o código de cada categoria.
- nome: Campo para adicionar o nome da categoria.

Tabela SubCategoria:
- codigo: Campo AUTO_INCREMENT para armazenar o código de cada subcategoria.
- categoria: Campo para referenciar à qual categoria cada categoria faz parte.
- nome: Campo para adicionar o nome da subcategoria.

Eita, já temos as tabelas, agora vamos colocar alguns valores para elas:

INSERT INTO `categorias` VALUES (1, 'Refrigerantes');
INSERT INTO `categorias` VALUES (2, 'Frutas');
INSERT INTO `categorias` VALUES (3, 'Carnes');
INSERT INTO `categorias` VALUES (4, 'Cervejas');

INSERT INTO `subcategoria` VALUES (1, 2, 'Maçã');
INSERT INTO `subcategoria` VALUES (2, 3, 'Alcatra');
INSERT INTO `subcategoria` VALUES (3, 1, 'Sprite');
INSERT INTO `subcategoria` VALUES (4, 1, 'Fanta');
INSERT INTO `subcategoria` VALUES (5, 2, 'Laranja');
INSERT INTO `subcategoria` VALUES (6, 4, 'Skol');
INSERT INTO `subcategoria` VALUES (7, 4, 'Bohemia');
INSERT INTO `subcategoria` VALUES (8, 1, 'Coca-Cola');
INSERT INTO `subcategoria` VALUES (9, 3, 'Coxão Mole');
INSERT INTO `subcategoria` VALUES (10, 2, 'Limão');
INSERT INTO `subcategoria` VALUES (11, 3, 'Picanha');
INSERT INTO `subcategoria` VALUES (12, 4, 'Brahma');

Certo, já temos algumas informações nas tabelas, vamos a parte que interessa agora.

===============-===============

Como apresentar as Categorias?
Para realizar a consulta das categorias, simplesmente, criamos nossa query selecionando os campos desejados:

SELECT * FROM categori<span style='color:green'>as ORDER BY nome ASC

Estamos selecionando todos os campos de todos os registros, ordenados pelo nome em ordem crescente (A-Z).

E como apresentar no form tudo isso?
Vamos criar nossa página então:

<select name="categoria">
	<option></option>
<?php
$consulta = mysql_query("SELECT * FROM categorias ORDER BY nome ASC");
while( $row = mysql_fetch_assoc($consulta) )
{
echo "<option value=\"{$row['codigo']}\">{$row['nome']}</option>\n";
}
?>
</select>

Pronto, já temos um select com todas as categorias e um campo em branco no inicio, mas porque esse campo em branco? Pois nossa ação de XMLHttpRequest será no evento onchange, que é executa ao alterar o valor inicial.

Como ficaria nosso onchange?

<select name="categoria" onchange="pesquisar_dados( this.value )">

Para os conhecedores de JavaScript, chamamos uma função pesquisar_dados e passamos como um parâmetro, o value do select.

Uipi! Até agora, tudo beleza, e como montar o select para SubCategorias?!
Veja e surpreenda-se pequeno Gafanhoto.

<select name="subcategoria"></select>

Estava com preguiça, e vai ficar só assim nosso select. :P

Na verdade, os valores para ele, vai depender da Categoria selecionada, então, por inicio, não atribuimos nenhum valor à ele.

function pesquisar_dados()
Ahhh bom, achei que nunca iriamos chegar aqui. Veja o que seria essa função para receber o value da categoria selecionada:

function pesquisar_dados( valor )
{
  http.open("GET", "consultar.php?id=" + valor, true);
  http.onreadystatechange = handleHttpResponse;
  http.send(null);
}

Vamos entender ela:

"Abrimos" a página consultar.php?id=X, digo "abrimos", pois na verdade, essa janela não será apresentada ao usuário, só será processada puxaremos o valor retornado. Logo após, aguardamos a resposta do processamento da página, e assim que finalizado, chamamos a nova função handleHttpResponse. Que processará nossa resposta.

function handleHttpResponse
Essa função tem a finalidade de "pegar" o resultado da página processada, e apresentar no seu defido lugar. Poderiamos jogar em um textarea, uma <div>, um <p>, ou até mesmo um alert.

function handleHttpResponse()
{
  campo_select = document.forms[0].subcategoria;
  if (http.readyState == 4) {
    campo_select.options.length = 0;
    results = http.responseText.split(",");
    for( i = 0; i < results.length; i++ )
    { 
      string = results[i].split( "|" );
      campo_select.options[i] = new Option( string[0], string[1] );
    } 
  }
}

OOOOOOO LOOOOOOCOOOOOOOO MEEEEEUUUU!!! By Fausto Silva

Calma, calma, não corram. Vamos entender:

Antes de mais nada, definimos que campo será o receptor dos novos dados. Em seguida, verificamos se o estado do retorno é igual 4 (concluído), caso seja, definimos o campo receptor como 0 de length, ou seja, eliminamos todos as opções que existiam. Logo após, explodimos a resposta retornada pela nossa execução por ",", ou seja, cada SubCategoria, será separada por ",". Após isso, para cada índice retornado, explodimos ainda por "|", mas por que isso, você se pergunta, simples, nosso select não é somente 1 valor, mas 2, uma para a propriedade value e outro para a apresentação, primeiro a apresentação e em seguida o value. E por fim, adicionamos a opção ao nosso select.

OBA! Acabamos!!! Estamos vivos!!!!!
Calma jovem Anakin, o lado negro da força está por vir. Teríamos acabado se não tivessemos tantos navegadores por ai afora, e cada um com seu método de interpretação.

Como resolver? Simples, com mais uma função extra. Essa não precisará que nada seja alterado, afinal, é somente para identificação do Navegador e Suporte ao XMLHttpRequest.

function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}
var http = getHTTPObject();

Somente uma passagem rápida por ela, definimos a nova função, e veja o detalhe, se você utilizar alguma IDE para o desenvolvimento dessas páginas, é bem provavel que identificará parte do código como um comentário, mas não é, não apague ;)

Depois de fazer toda a verificação, a função é chamada e passada seu valor à variável global http.

Agora acabou?!
Técnicamente sim, mas como criar a página para retornar os resultados? Bom, agora entra nosso amigão PHP. Como vimos, cada registro precisa ser separado por ",", e a apresentação do value deve ser separado por "|".

<?php
$con = mysql_connect("localhost", "usuario", "senha");
mysql_select_db("base_dados");

$categoria = addslashes($_GET["id"]); // pegamos o id passado pelo select
$consulta = mysql_query("SELECT * FROM subcategoria WHERE categoria = '$categoria'"); // selecionamos todas as subcategorias que pertencem à categoria selecionada
while( $row = mysql_fetch_assoc($consulta) )
{
  echo $row["nome"] . "|" . $row["codigo"] . ","; // apresentamos cada subcategoria dessa forma "NOME|CODIGO,NOME|CODIGO,NOME|CODIGO,...", exatamente da maneira que iremos tratar no JavaScript
}
?>

Belezinha pessoas? Essa seria a página consultar.php, agora vejamos como ficaria a nossa página principal completa:

<?php
$con = mysql_connect("localhost", "usuario", "senha");
mysql_select_db("base_dados");
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="javascript">
function pesquisar_dados( valor )
{
  http.open("GET", "consultar.php?id=" + valor, true);
  http.onreadystatechange = handleHttpResponse;
  http.send(null);
}

function handleHttpResponse()
{
  campo_select = document.forms[0].subcategoria;
  if (http.readyState == 4) {
    campo_select.options.length = 0;
    results = http.responseText.split(",");
    for( i = 0; i < results.length; i++ )
    { 
      string = results[i].split( "|" );
      campo_select.options[i] = new Option( string[0], string[1] );
    }
  }
}

function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}
var http = getHTTPObject();
</script>
</head>

<body>
<form name="formulario" method="post" action="">
<p><select name="categoria" onchange="pesquisar_dados( this.value )">
	<option></option>
<?php
$consulta = mysql_query("SELECT * FROM categorias ORDER BY nome ASC");
while( $row = mysql_fetch_assoc($consulta) )
{
echo "<option value=\"{$row['codigo']}\">{$row['nome']}</option>\n";
}
?>
</select></p>
<p><select name="subcategoria"></select>
</p>
</form>
</body>
</html>

E se eu não quiser um select, mas sim, um texto?
Simples, teriamos que alterar somente a função para tratar o retorno:

function handleHttpResponse()
{
  campo_text = document.forms[0].subcategoria;
  if (http.readyState == 4) {
    campo_text = http.responseText;
    
  }
}

Dessa forma, o campo <textarea> ou quaisquer outros campos, ou tags, receberiam o valor retornado pela consulta, bastando somente tratar todos os textos na consulta.

===============-===============

Dedicatória
A todos vocês e principalmente a minha mamãe pelo Dia das Mães :)
Mesmo tendo a certeza que ela não vai ler esse tutorial, mas:

Mommy, I love you! :)

Attached Files




#562557 Estrutura Para E-commerce

Posted by Balala on 31/03/2005, 20:23

É, alguém já foi presentiado com uma dessas? Preciso desenvolver um comércio eletrônico para um cliente, mas ele mesmo não sabe ao certo o que vai querer vender.

Então o maior problema está, quais propriedades cada produto deve ter. Por exemplo, de inicio terá misturado Livros, CDs, DVDs e Óleos. Ou seja, cada um apresenta uma particularidade própria para os campos, como por exemplo, Livros eu teria Autor, Título, Nº Páginas, Sinopse, já CDs, Título, Faixas, Tempo total, Artista, DVD outro caso.

O que pensei para deixar ele realizado, contratar uma mere, ergh, com o site...

Uma estrutura de dados dessa forma:

categorias
id | nome
1  | Livros
2  | CDs
3  | DVDs
4  | Óleos


Beleza, categorias nada de mais, a príncipio. Após isso teria os campos necessários para cada categoria:

campos
id | categoria | campo
1  | 1            | Autor
2  | 1            | Titulo
3  | 1            | Nº Páginas
4  | 1            | Sinópse


Beleza, dessa forma para todas as categorias, as relacionando pelo campo "categoria". Depois disso, os produtos:

produtos
id | categoria | produto | valor | ... // outros campos para cada produto
1  | 1            | Harry Potter | 32.25
2  | 2            | Jurassic Park 3 | 40.50


E assim por diante também, cada produto, relacionado à categoria pelo campo "categoria". E por último, os valores de cada campo da categoria:

valores
id | produto | campo | valor
1  | 1          | 1        | Autor do Livro
2  | 1          | 2        | Harry Potter
3  | 1          | 3        | 458
4  | 1          | 4        | Jovem bruxo....
5  | 2          | 5        | Spilberg


Não sei se compreenderam a idéia que estou tomando como base para desenvolver algo que ele mesmo não poderá me dizer se está certo ou errado, pois não sabe ao certo o que vai precisar vende no site...

Alguma idéia para casos desse porte?

Obrigado pela paciência de ler tudo isso :P

(y)


#522844 Tutorial Php - Iniciante

Posted by Balala on 19/01/2005, 13:44

Hello there, the angel from my nightmare...

Tá bom, tá bom, não foi um começo nada muito bom, mas acredite, vai piorar =) . Estamos aqui reunidos por um motivo em comum, não? Queremos aprender PHP, ou não queremos, mas temos. Tudo beleza então, é só efetuar um depósito de R$ 10,00 na conta XYZ-0 que eu lhe envio o Suco de Laranja Mastering PHP, é só beber duas vezes ao dia, que você aprende PHP em 78 horas.

É infelizmente não é um jeito fácil dessa maneira que irá realmente aprender PHP. Será um caminho árduro e cheio de muralhas pela frente, muralhas mesmo, pedras são pequenas para atrapalhar... Mas eu ficar contando historinhas ou piadinhas não vai ajudar em muita coisa, então, vamos ao que interessa.

Introdução
Caso você já tenha tido a oportunidade de ler outro tutorial, provavelmente já viu que PHP é uma linguaguem Server-Side, ou seja, que é executada no, e somente, no servidor. Diferente do JavaScript por exemplo que é uma linguaguem Client-Side, executada no cliente (internauta).

Dessa forma, há coisas fora do nosso alcance para realizar no PHP. Como por exemplo, alterar a cor de um botão ao internauta pressionar a letra "b". Isso está sendo executado aonde? No servidor ou no cliente? Já pensando em nosso fórum, faça essa pergunta para você mesmo antes de criar um tópico. Isso é ou não é relacionado à PHP?

Como vamos ver desde ponto em diante, comentários em alguns scripts, vamos ver as possiveis formas de adicionar um comentário no PHP.

<?php
// Comentário de 1 linha

# Comentário de 1 linha

/* Comentário em bloco

segue comentado até finalizar o bloco

com */
?>

O que vamos ver nesse tutorial?
Antes de prosseguir, vamos deixar claro que, estou considerando que você já está com um servidor web com o PHP rodando em sua máquina, ou com um servidor online. Configurações padrões do php.ini 4.3.0+ (register_globals = off).

Vou tentar, através desse tutorial, abranguer os primeiros passos dado ao PHP, elevando um pouco a dificuldade em cada passo que damos. Não é minha intenção passa funções relacionadas à banco de dados nesse primeiro tutorial, mas para um segundo, isso seria o foco. Então vamos parando com o lero-lero e começar a ralar ;)

"Adeus Mundo!"
Por que sempre o famoso "Olá Mundo!"? Vamos estar nos escondendo dele ao tentar aprofundar em PHP. Quanto mais você se interessa em aprender, mais festas deixará de participar, menos garotas irá conhecer e mais sóbrio irá ficar (estou em dúvida se isso é um fato bom ou ruim).

- Nossa, mas ele sempre tira tempo para outra piadinha horrível...

Táááááá booooooooom! Todas as páginas, para serem executados os códigos/instruções PHP, precisam ter sua extensão .php (.php3 está ficando para trás). Sabemos qual a extensão das páginas para serem consideradas PHP, e agora, como eu crio um código PHP? Por padrão, um código PHP é iniciado com a tag <?php e encerrado com ?>. Não vamos nos ater à outras tags, mas só para conhecimento existem as opções:

<? ?>
<% %>
<script languague="php"> </script>

Certo, vamos criar nossa página "tut01.php" e "limpe" o código fonte dela, não vamos trabalhar com html ainda, somente com a saída PHP. Vamos iniciar um bloco de código PHP e fazer uma saída para o navegador.

<?php
echo "Adeus Mundo!";
?>

Como diria meu amigo, Jack Estripador, vamos por partes, ou melhor, por linhas.
Linha 01: <?php => Iniciamos o bloco PHP;
Linha 02: echo "Adeus Mundo!"; => echo é uma função do PHP para imprimir uma saída no navegador. Escrevemos a saída entres aspas pois não estamos trabalhando com variáveis ainda. Utilizamos o ";" no final de cada linha de comando, caso contrário um erro é gerado;
Linha 03: ?> => Encerramos o bloco PHP.

Salvamos essa página e publicamos no servidor. A única saída que temos no navegador será "Adeus Mundo!" (sem as aspas). O código fonte também omite qualquer outra saída, sendo assim, o PHP somente apresentará para o usuário o que for mandado apresentar.

- Certo, mas por que o Joãzinho usa o print? Não tem diferença?

Embora muitos digam que não, tem sim. Claro, nada que seja muito utilizado em casos "normais", mas que há uma diferença, há. Tempo de execução, exatamente iguais, sem diferença nisso. Digamos que a única visivel seja, print retorna para uma variável TRUE ou FALSE. (lembrando, essa parte é somente para tirar a dúvida de algumas pessoas em relação a comparação de echo e print, não há necessidade de decorar nada daqui).

<?php
$print = print "Teste";
// A saída será Teste, mas agora apresente a variável

echo $print;
// Saída 1 ou TRUE
?>

Eba! Já sei apresentar um conteúdo no navegador
Agora vamos começar a complicar um pouco mais. Vamos ver como apresentar um mais número de saídas no mesmo bloco, e logo em seguida, começaremos a utilizar algumas variáveis.

<?php
echo "Nome:";
echo "Luciano";
?>

Mas preciso realmente preciso utilizar duas vezes echo?!?! Não é necessário, para isso, nós utilizamos a concatenação "." (em outras linguaguens é mais comum ver o símbolo "+" para concatenação, mas no PHP é o "." mesmo).

<?php
echo "Nome:" . "Luciano";
?>

Você se pergunta, qual a vantagem disso? Poderia colocar os dois textos juntos. Sim, realmente poderia, mas é uma introdução à concatenação. Agora veremos a utilização de variáveis.

O que diabos são variáveis?
São apenas blocos de memória para armazenamento de alguma informação. Texto, números, arquivos, etc... Novamente, diferente de outras linguaguens, no PHP você não é obrigado a definir o tipo de variável que deseja utilizar (int, float, bool, ...). Vamos à alguns exemplos:

<?php
$minha_variavel = "Meu texto";
?>

Vamos seguir o exemplo do nosso amigo Jack Estripador, por partes. Como podem ver, para declarar uma variável iniciamos o texto com o caracter "$", ele é que indica que o texto a seguir será uma variável. Algumas observações quanto à variáveis:

- Você não pode iniciar um nome de variável com números, ex: $1. Mas pode utilizar nas demais partes do nome, ex: $a1;
- O PHP é case-sensitive (há diferenças entre $nome, $Nome e $NOME);
- Utilize sempre variáveis com nomes indicando o seu conteúdo, para simplificar a manutenção de terceiros e até mesmo a sua.

Tenho uma variável, o que faço com ela?
Digamos que a base de todas as linguaguens de programação são variáveis, pois, se não precisa-se de conteúdos variáveis, por que programaria? Simplesmente utilizava HTML.

Vamos à um outro código:

<?php
$nome = "Luciano";
$idade = 19;
?>

Declaramos duas variáveis no exemplo acima, uma chamada $nome, com o valor "Luciano" e outra, chamada $idade, com o valor 19. Por que não foi utilizado aspas para inserir o valor 19? Simples, variáveis do tipo texto (text) precisam ser inseridas entre aspas, já as numerais (int, float, ...) você simplesmente precisa informar o número.

Beleza, agora temos duas variáveis e não fizemos nada com elas...
Calma lá! Vamos juntar tudo que vimos até agora:

<?php
$nome = "Luciano";
$idade = 19;
echo "Olá, meu nome é " . $nome . " e tenho " . $idade . " anos.";
?>

Aqueceu a mente agora? Jack neles:

$nome = "Luciano" => Simplesmente declaramos uma variável, como haviamos feito anteriormente;
$idade = 19 => Mesmo que o anterior, declaração de outra variável;
echo ...... => Complicou? Bom, temos a primeira parte "Olá, meu nome é " que é a apresentação de um texto estático para o navegador, utilizamos o "." para adicionar outro valor à apresentação, $nome aqui apresentamos o valor da variável $nome, veja que não é escrito no navegador a palavra "$nome", mas sim "Luciano", adicionamos outro bloco de texto estático, o valor da variável $idade, e por fim, " anos.".

É isso então? Boa sorte no PHP e comece a trabalhar!


...........
É, infelizmente não é só isso não, temos muuuuuuuuito mais desafios pela frente. Que tal algumas funções básicas que podemos fazer trabalhando com variáveis:

strlen(TEXTO)
<?php
$nome = "Luciano";
echo "Seu nome tem " . strlen($nome) . " letras.";
?>

A funcionalidade da função strlen é de contar o número de caracteres que temos em determinada string (texto). Utilizamos a concatenação em uma função, como podem ver, podemos concatenar textos estáticos, variáveis e funções.

substr(TEXTO, INICIO, [ANDAR])
<?php
$nome = "Luciano";
echo "A primeira letra de seu nome é " . substr($nome, 0, 1);
?>

A função substr tem por objetivo "cortar" parte de um texto para a apresentação. O primeiro parâmetro passamos o texto a ser cortado, por segundo o caracter onde deve ser dado o inicio do corte (lembrando que começa do 0, não do 1), e por final, mas não obrigatório, quantos caracteres devem ser "andados", caso não passe nenhum valor, será até o final do texto.

trim(TEXTO)
<?php
$variavel = "   OI     ";
echo trim($variavel);
?>

trim elimina os espaços em branco do inicio e do final de um texto.

ucfirst(TEXTO)
<?php
$nome = "luciano";
echo ucfirst($nome);
?>

ucfirst capitaliza (existe essa palavra?!) a primeira letra de um texto.

strtoupper(TEXTO)
<?php
$nome = "Luciano";
echo strtoupper($nome);
?>

strtoupper transforma todas as letras de um texto em maiuscula.

strtolower(TEXTO)
<?php
$nome = "Luciano";
echo strtolower($nome);
?>

strtolower é a função inversa de strtoupper. Transforma todos os caracteres em minusculo.

str_replace(PESQUISA, SUBSTITUI, TEXTO)
<?php
$texto = "isso foi xxxxxx mesmo";
echo str_replace("xxxxxx", "****", $texto);
?>

str_replace procura por uma combinação de letras e a substitui em determinado texto. Outras opções nessa função podem ser vistas com a utilização de matrizes.

Captei! Vamos para Matrizes
Digamos que o monstro para muitos programadores iniciantes. Matrizes são grupos de valores em uma única variável. No PHP temos algumas maneiras para iniciar uma matriz:

<?php
$matriz_a = array("João", "Maria");
$matriz_b[] = "João";
$matriz_b[] = "Maria";
?>

Ambas teriam o mesmo conteúdo. Na primeiro forma ($matriz_a) declaramos que a variável é do tipo array (matriz) e em seguida passamos os valores para ela. Já na segunda, colocamos cada valor separamente. Caso não seja definido um índice para a matriz, ela se auto-inicia do 0 e também se incrementa de acordo com a necessidade.

<?php
$matriz = array("Oi", "Tchau");
echo $matriz[0]; // Oi
echo $matriz[1]; // Tchau
?>

Criamos nossa matriz, e em seguida apresentamos os valores dela, como não definimos índice em nenhum dos casos, ela se iniciou no 0 e foi se incrementando.

Mas como definir um índice?
Vamos ver nas duas formas:

<?php
$matriz = array(5 => "João", "indice" => "Maria");
echo $matriz[5]; // João
echo $matriz["indice"]; // Maria
?>

<?php
$matriz[5] = "João";
$matriz["indice"] = "Maria";
echo $matriz[5];
echo $matriz["indice"];
?>

Certo, mas matriz não tem vantagem nenhum em relação às variáveis normais...
10 minutos e você mudará completamente de idéia. Vamos criar uma lista de nomes em uma variável e apresenta-las:

<?php
$nome1 = "Luciano";
$nome2 = "João";
$nome3 = "Maria";

echo $nome1;
echo $nome2;
echo $nome3;
?>

Divertido, não? Imagine fazer dessa forma para 500 nomes? Eu não queria ser programador nesses casos... Agora vejamos com matrizes:

<?php
$nomes = array("Luciano", "João", "Maria");
foreach( $nomes as $nome ) {
  echo $nome;
}
?>

NÃO!!! Não desista agora. Nosso amigo Jack vai explicar melhor tudo isso:

$nome = array(...) => Criamos nosso array, nada de novo
foreach( $nomes as $nome ) { => Opa, algo novo aí. Para quem conhece inglês já deve ter imaginação do que isso faz, foreach (para cada):

para cada( $nomes como $nome )

Ele irá passar por TODOS os valores da matriz e copiar o seu valor para a variável $nome. Interessante não? É como se executá-se-mos o código tantas vezes quanto há valores na matriz.

Utilizamos "{" e "}" para determinar o inicio e fim do nosso comando foreach. Tudo que está entre eles será repetido.

Vamos à outro exemplo com o foreach:

<?php
$nomes = array(5 => "Luciano", 10 => "João", "indice" => "Maria"); // Criamos a matriz definindo seus índices
foreach( $nomes as $indice => $valor ) {
  echo $indice . " = " . $valor;
}
?>

ixi, fedeu? Calma lá, o que temos de novo nessa parte? ( $nome as $indice => $valor ), dessa vez, ao invéz de passar somente o valor de cada índice na matriz, estamos passando o nome do índice. Lembrando, a primeir váriavel receberá o nome do índice e a segunda o seu valor.

Matrizes, basicamente é isso, sua definição e utilização. Vamos passar por algumas funções que envolvem matrizes e dar mais valor à essas pérolas da programação.

Lá vem bomba... Condicional
Qual a vantagem de ter um conteúdo dinâmico em seu site se ele não conseguir decidir qual caminho tomar? Vamos ter uma introdução às condicionais agora if else

<?php
$nome = "Luciano";

if( $nome == "Luciano" ) {
  echo "Você realmente é o Luciano";
}
?>

Como vimos anteriormente, "{" e "}" servem para definir um inicio e um fim a um comando. if estará se perguntando SE o valor da variável $nome for igual à "Luciano". Se sim, o código entre "{" e "}" é executado, caso contrário, nenhuma ação é tomada.

Outro detalhe é, para definir valores à variáveis, utilizamos "=", para comparar valores "==". E uma terceira opção seria "===", que compara também o tipo da variável, além de seu valor (utilizada para diferenciar 0 de FALSE, por exemplo).

Agora veremos para não deixar passar em branco nossa condicional, a utilização do comando else:

<?php
$idade = 19;
if( $idade >= 18 ) {
  echo "Maior de idade";
} else {
  echo "Menor de idade";
}
?>

Nossa comparação dessa vez não consulta por um valor igual, mas sim, ">=" (maior ou igual). Somente aplicada em números. Caso o valor da variável $idade não seja >= à 18, a instrução else é executada.

Com isso já é possivel fazer uma pesquisa em uma matriz, por exemplo:

<?php
$nomes = array("João", "Maria", "Carlos", "Ana", "Paulo", "Bruna");
foreach( $nomes as $nome ) {
  if( $nome == "Ana" ) {
    echo "Ana encontrada";
  }
}
?>

O que temos no script acima? Criamos uma matriz com uma lista de nomes, em seguida, varremos toda a matriz, passando cada valor para a variável $nome. Dentro do loop para cada valor na matriz, verificamos se o valor do $nome é igual à "Ana" se for, apresentamos a mensagem "Ana encontrada".

Alguns erros comuns nesses casos:

<?php
$nomes = array("João", "Maria", "Carlos", "Ana", "Paulo", "Bruna");
foreach( $nomes as $nome ) {
  if( $nome == "Ana" ) {
    echo "Ana encontrada";
  } else {
    echo "Ana não encontrada";
  }
}
?>

Não que esse esteja errado, mas provavelmente não trará a saída desejada, pois, repare bem, em cada loop do comando foreach ele executa a condicional, pegamos o primeiro caso, "João", como "João" é diferente de "Ana", ele executa o comando else, apresentando, dessa forma, várias vezes "Ana não encontrada". Para executar da maneira desejada esse script, precisamos de uma variável conhecida pelo nome de flag.

Pronto, só faltava uma bandeira mesmo no PHP...
Nada disso, flag é o nome dado à uma variável que tem apenas um valor para comparação, na maioria das vezes TRUE ou FALSE (VERDADEIRO ou FALSO). Vejamos como fica nosso exemplo dessa forma:

<?php
$nomes = array("João", "Maria", "Carlos", "Ana", "Paulo", "Bruna");
$flag = false;
foreach( $nomes as $nome ) {
  if( $nome == "Ana" ) {
    $flag = true;
  }
}
if( $flag ) {
  echo "Ana encontrada";
} else {
  echo "Ana não encontrada";
}
?>

Jack?!?!

Criamos a matriz, definimos nossa $flag como false (falso), pois "Ana" não foi encontrada dentro da matriz ainda, varremos a matriz passando o valor para a variável $nome, se $nome for igual a "Ana" alteramos nossa $flag para true (verdadeiro). Terminando completamente o loop, executamos nossa condicional, repare que não temos realmente uma comparação a ser feita, por que isso? pois na verdade toda comparação retorna TRUE ou FALSE, ex: 1 == 2 FALSE, 5 == 5 TRUE, e assim por diante. Como nossa variável já tem um valor boleano (TRUE ou FALSE), ela mesmo se encarregará de retornar a resposta para o comando if. Se $flag contér TRUE apresentamos "Ana encontrada", caso contrário, "Ana não encontrada".

Imagine agora, se estivessemos procurando por "João", era uma repetição sem sentido até o final da matriz, já que "João" é o primeiro nome, mas como consigo parar um loop?

<?php
$nomes = array("João", "Maria", "Carlos", "Ana", "Paulo", "Bruna");
$flag = false;
foreach( $nomes as $nome ) {
  if( $nome == "João" ) {
    $flag = true;
    break;
  }
}
if( $flag ) {
  echo "João encontrado";
} else {
  echo "João não encontrado";
}
?>

Nossa única diferença, o comando break, que simplesmente corta o loop no momento que for encontrado o nome que procuramos.

Outras formas de Loop
Vamos ver algumas outras formas de loop para utilizar não somente em arrays. Vamos para a primeira delas, while:

<?php
$contagem = 1;
while( $contagem <= 10 ) {
  echo $contagem;
  $contagem = $contagem + 1;
}
?>

O comando while (enquanto) executa determinada função enquanto a sua condicional for verdadeira. Jack, venha cá:

while( $contagem <= 10 ) => Enquanto contagem for menor ou igual à 10, apresentamos o valor de $contagem no navegador e alteramos o valor de $contagem para $contagem + 1, ou seja, um a mais que o seu valor anterior.

Sim, muitas vezes vocês vão conseguir fazer os chamados loops infinitos, ou seja, ele vai ficar em execução até estourar o tempo limite do PHP.

Um exemplo de loop infinito (não execute =D):

<?php
$contagem = 1;
while( $contagem <= 10 ) {
  echo $contagem;
}
?>

Veja que fazemos praticamente a mesma ação que a acima, mas esquecemos de aumentar o valor da variável $contagem, ou seja, ela sempre terá seu valor igual à 1, nunca passará de 10.

Outro comando para loop que é disponivel no PHP é o for, que, basicamente, é o mesmo que o while, mas não precisamos controlar nossa contagem, como no exemplo acima.

<?php
for( $contagem = 1; $contagem <= 10; $contagem++ ) {
  echo $contagem;
}
?>

De certa forma mais simples que o while. Sua sintaxe é a seguinta:

for( INICIALIZACAO; CONDICIONAL; INCREMENTO )

Ou seja, na primeira parte iniciamos a $contagem, depois fazemos nossa condicional verificando se $contagem é <= à 10 e por último, aumentamos o valor da variável $contagem. Repare que dessa vez, utilizamos $contagem++ para aumentar a variável.

<?php
$numero = 5;

$numero++; // $numero é aumentado em 1
$numero--; // $numero é diminuido em 1

$numero += 10; // $numero é aumentado em 10
$numero -= 10; // $numero é diminuido em 10

$numero = 5;
$a = $numero++; // $a recebe $numero (5) e então $numero é aumentado em 1

$numero = 5;
$a = ++$numero; // $numero é aumentado em 1 e então passa o novo valor (6) para $a

$numero = 5;
$a = $numero--; // $a recebe $numero (5) e então $numero é diminuido em 1

$numero = 5;
$a = --$numero; // $numero é diminuido em 1 e então passa o novo valor (4) para $a
?>

Há também outros comandos para loop como do... while / while... do Mas que teria a mesma sintexa do comando while, deixaremos eles de fora por enquanto.

Ahhhh, acabou
Exato, infelizmente acabou... Tudo precisa de um começo, um meio e um fim. Bom, estamos quase em 20% :) Estou preparando outros tutoriais envolvendo funções de maior utilidade para o desenvolvimento de sites, mas espero que esse pequeno tutorial tenha servidor como uma introdução para quem procura aprender mais sobre PHP e as maravilhas que pode fazer com ele.

Qualquer dúvida, estou inteiramente a disposição para tentar lhe ajudar. Basta "perguntar" ;)

Quanto à liberdade para apresentar esse tutorial em outros fóruns, sites de download ou qualquer outro site de intuito educacional, sinta-se livre, escrevi esse tutorial pensando em ajudar quem está iniciando em PHP, quanto maior o número de atinguidos, melhor. Peço somente, que me reconheçam como autor dele, beleza então?

Attached Files




#410774 Tutorial Oop

Posted by Balala on 22/07/2004, 14:59

Antes de começar, só queria falar q VOLTEI

Grande coisa <_<

Deixando disso, vamo pro tutorial (ta ai thiagomalarsl, kero ve le agora :P)

Antes disso, há uma apostila enviada por: H²O.
Caso desejem fazer o download dela, DOWNLOAD



Tutorial PHP - Programação Orientada à Objeto (OOP)

Porque um tutorial de OOP?
É uma forma de programação pouco vista no PHP, mas com o lançamento da versão final do PHP 5.0 tudo indica que ele passará a ser mais Orientado à Objeto. Tanto como já é na versão 5.0 como será nas próximas.

O futuro ninguém conhece, então não posso falar, PHP depois da versão 7.0 será somente OOP, como talvez ele pode não fazer tanto sucesso entre os programadores e nem existir mais na versão 5.1.

Um tutorial destinado aos Programadores PHP em geral, aos usuários do Fórum WM Online, e para o cara que não me deixou em paz até isso ficar pronto, thiagorls. Até quando estive me ausentando do Fórum, veio me cobrar isso, cara de pau, não?

Chega de babozeira e vamos ao que interessa, PHP!

================================================================================

Porque programar OO (Orientado à Objeto)?
Nem eu, nem qualquer outra pessoa no mundo pode chegar pra você e falar:
- Programe OO que é muito melhor.
Ou vice-versa. Não teve, não tem e provavelmente não terá nenhuma vantagem em relação a outra forma de programação. Tudo é uma questão de gosto e prática. Claro que, algumas vantagens uma tem em relação a outra, muitas pessoas comentam que programando OO você poderá publicar e buscar classes já prontas para fazer alguma função. Mas o mesmo aconteceria com a Programação "Normal". Comparar OO ao Método normal, é semelhante a comparar as funções echo ou print.

Portanto, não vou estar aconselhando a usar ou não usar OO, é simplesmente o seu gosto. Mas, como li em uma frase no livro PHP 4 - A bíblia.

"Não fique constrangido, caso um Programador OO diga que o script dele de 10 linhas é melhor que o seu de 5 linhas"

Realmente, programando em OO você terá um código fonte maior. Mas por outro lado, melhor compreendido (para outros programadores de OO) do que um código ao modo "normal".

O suporte a OO no PHP, como está no site oficial (php.net) é para usuários com experiências em outras linguaguens que são OO, como C#, e estão acostumados com ela. Por isso da introdução OO no PHP.

Vamos dar os parabéns para quem continuar, pois, está ciente que é uma maneira um pouco mais demorada, mas talvez possa ser mais organizada de programar. Não dúvido que muitos programadores ao lerem o texto acima, tenham para por ai. Nada de incomum, muitos irão ver OO e começar a programar nela, os demais, não veram vantagem nenhuma e deixarão de lado.

================================================================================

Introdução
Enfim, começaremos. Para qualquer programação OO, você criará tudo baseado em Classes, e as variáveis que você costumava usar, passarão a ser Objetos. Vamos à um exemplo:

<?php
class MinhaClasse { // Declaração da Classe
	var $txt1; // Declaração das Variáveis
	var $txt2;
}

$MeuObjeto = new MinhaClasse();
?>

Um exemplo sem utilização, mas que poderá nos ajudar a entender como criar uma classe. Na linha 2 (class MinhaClasse {) é onde declaramos nossa Classe, cada vez que quiser criar um objeto a partir dela, criaremos chamando pelo nome definido "MinhaClasse". Podemos criar quantas classes diferentes quiser, mas não pode ser em bloco:

<?php
class MinhaClasse {
?>
<?php
    var $txt1;
    var $txt2;
}
?>

O exemplo acima não irá funcionar. Voltando ao exemplo correto, as linhas 3 e 4 é onde declaramos nossas variáveis. Exato, para se trabalhar com classes, precisamos declarar as variáveis antes de usá-las. Mas não precisamos definir seu tipo, a não ser que queiramos uma Matriz:

<?php
class MinhaClasse {
    var $txt1 = array();
    var $txt2;
}

$MeuObjeto = new MinhaClasse();
?>

Acho que até aqui não teremos maiores problemas, vamos prosseguir.

Retornando Valores das Classes
Sei que a minha classe tem as váriaveis $txt1 e $txt2, mas como gravo e imprimo o que tem nelas? De uma maneira simples, mas não aconselhada, seria utilizar o operador "->". Vamos supor que o script acima faça parte do nosso código:

echo $MeuObjeto -> txt1;

Não, não esqueci do sinal $ antes de váriavel $txt1. Ao utilizar um objeto referenciamos as váriaveis dele somente com 1 sinal de $. Essa mesma forma poderia ser utilizada para definir valores à variavel:

$MeuObjeto -> txt1 = "Olá Brasil!";

Mas então, porque comentei antes que não era aconselhado utilizar dessa forma? Pelo simples fato de estarmos trabalhando com classes não somente para ter uma espécie de Matriz Multidimensional, mas sim para organizar nosso código. E uma maneira organizada de se fazer isso seria trabalhar com funções dentro das classes:

<?php
class MinhaClasse {
    var $txt1;
    var $txt2;

    function Retornar1() {
   	 echo $this -> txt1;
    }
}

$MeuObjeto = new MinhaClasse();
?>

Agora você se pergunta "O que diabos faz aquele $this ali?". $this é somente uma referência à classe em que se encontra a função. Poderiamos sem problemas colocar no nome da classe para retornar o valor da váriavel, mas iria atrapalhar caso estivessemos trabalhando com classes hierarquicas, ter uma classe pai e filho. Mas isso não é hora de comentar ainda, mais pra frente veremos ;)

Voltando ao nosso código, veja que, a função está dentro de nossa classe, então para executar ela seria dessa forma:

$MeuObjeto -> Retornar1();

Certo, mas já que não utilizo a forma "antiga" para ler a váriavel, como faço para armazenar um valor à ela?
O segredo está nas funções :)

<?php
class MinhaClasse {
    var $txt1;
    var $txt2;

    function Retornar1() {
   	 echo $this -> txt1;
    }

    function Gravar1($valor) {
   	 $this -> txt1 = $valor;
    }
}

$MeuObjeto = new MinhaClasse();
?>

Então ao executar a função $MeuObjeto -> Gravar1(), temos que passar um valor que será o novo valor da váriavel $txt1. Quaisquer outros tipos de funções podem ser declaradas dentro da classe, mas tenha idéia que trabalhar com OO é justamente para ter no final, um código limpo e de fácil entendimento. Talvez alguém está se perguntando, porque venho colocando váriaveis com letras maiusculas. Isso é somente seu estilo de programação, vinha fazendo com _ a um bom tempo, mas mudei o jeito por vontade própria ao iniciar em OO, acho que dessa forma fica mais fácil identificar. Mas como disse, é somente o gosto, poderia sem problema algum criar a classe minha_classe e $meu_objeto. Só cuidado com a forma MinhaClasse, pois PHP faz distinção entre váriaveis maiusculas e minusculas.

Acho que podemos encerrar nossa introdução por aqui. Vamos à alguns exemplos mais práticos.

================================================================================

Já conheço, agora, como utilizo?

Vamos continuar então Sr. Classe :D Nosso próximo passo é desenvolver algo útil com essas benditas classes. Vou tentar mostrar no exemplo a seguir, uma comparação entre Programação OO e o Método "Normal". Vamos para o desenvolvimento de um mini carrinho de compras, talvez uma Cesta ^^.

<?php
class Cesta {
  var $Desconto;
  var $Preco      = array();
  var $Quantidade = array();

  function Cesta($desconto) {
    $this -> Desconto = $desconto;
    }

  function AdicionarItem($item, $preco, $quantidade) {
    if( isset($this -> Preco[$item]) ) {
      $this -> Quantidade[$item] += $quantidade;
      } else {
        $this -> Preco[$item] = $preco;
        $this -> Quantidade[$item] = $quantidade;
        }
    }
}

$MinhaCesta = new Cesta(10);
?>

CALMA, não desista, Objetos não é complicado, sei que deve ter parecido, mas veja com calma o exemplo:

- Do inicio até a linha 5, é o que vinhamos fazendo até agora, nada de novo.
- A função Cesta() está pedindo por uma váriavel $desconto, e essa função tem o mesmo nome que nossa classe, coencidencia? Não, de mandeira alguma, veja que ao chamar nossa classe na penultima linha, passamos um valor pela classe "10". Ao criar uma nova classe, ela automaticamente executa uma função com o mesmo nome que a classe. Então ao mesmo tempo executamos essa função e declaramos a váriavel Desconto com o valor 10. Que no final de tudo, essa será a porcentagem de descontos que o usuário ganhará em cima das compras.
- Já a função AdicionarItem() tem mais explicações sobre ela mesmo do que OO. Primeiro verificamos se já existe o item na nossa matriz, se ele existir, somamos o valor ao que já existe, se não existir, definimos o Preco[$item] com o valor que foi passado e atribuimos a quantidade que foi passada.

Como isso iriamo funcionar? Para adicionar itens ao nosso carrinho, fariamos dessa forma: (O script acima já está em nosso código)

$MinhaCesta -> AdicionarItem(1, 15.75, 10);

Somente executamos a função AdicionarItem passando os valores 1 para o código do item, 15.75 como o valor do item e 10 como a quantidade.

Vamos virar o angulo de nossa atenção e ver como isso seria pela maneira tradicional. Provavelmente você teria que utilizar um banco de dados, onde cada item que seria adicionado no banco teria um código do usuário e sempre que fosse necessário puxar os dados, teriamos que fazer consultas ao banco de dados.

Mas qual a vantagem de jogar dentro de uma váriavel e na próxima página perdeu tudo? Então utilizaremos uma váriavel que não seja perdida na próxima página, podemos declarar uma váriavel de sessão como nosso objeto:

$_SESSION['MinhaCesta'] = new Cesta(10);

Resolvido o problema? Então temos um script que ficaria fácil de fazer uma manutenção, e sem utilizar recursos do servidor para conexões e consultados ao banco de dados. Vamos ver agora algumas funções que poderiamos anexar nesse nosso código:

<?php
class Cesta {
  var $Desconto;
  var $Preco      = array();
  var $Quantidade = array();

  function Cesta($desconto) {
    $this -> Desconto = $desconto;
    }

  function AdicionarItem($item, $preco, $quantidade) {
    if( isset($this -> Preco[$item]) ) {
      $this -> Quantidade[$item] += $quantidade;
      } else {
        $this -> Preco[$item] = $preco;
        $this -> Quantidade[$item] = $quantidade;
        }
    }

  function RemoverItem($item, $quantidade) {
    if ( isset( $this -> Quantidade[$item] ) ) {
      if ( $this -> Quantidade[$item] >= $quantidade ) {
        $this -> Quantidade[$item] -= $quantidade;
        } else {
          $this -> Quantidade[$item] = 0;
          }
        } else {
          return false;
          }
    }

}

session_start();

$_SESSION['MinhaCesta'] = new Cesta(10);
?>

Implementamos uma função para remover alguns itens que desejarmos. Algo como, adicionamos 50 mas tenho dinheiro para comprar somente 30, então preciso remover 20. Nossa primeiro comparação da função é ver se o item já está em nossa cesta, se não estiver, essa função retorna FALSE. A segunda comparação é ver se existe o total a ser removido no carrinho. Não teria lógica remover 70 itens se só tenho 50, e ficar com -20, isso provavelmente iria acarretar em problemas na contagem final. Se ele não tiver o total a ser removido ele define a váriavel Quantidade como 0.

Já temos nossas mãos na cesta, podemos adicionar e remover itens que desejamos, agora nos resta somente contratar nosso caixa:

<?php
class Cesta {
  var $Desconto;
  var $Preco      = array();
  var $Quantidade = array();

  function Cesta($desconto) {
    $this -> Desconto = $desconto;
    }

  function AdicionarItem($item, $preco, $quantidade) {
    if( isset($this -> Preco[$item]) ) {
      $this -> Quantidade[$item] += $quantidade;
      } else {
        $this -> Preco[$item] = $preco;
        $this -> Quantidade[$item] = $quantidade;
        }
    }

  function RemoverItem($item, $quantidade) {
    if ( isset( $this -> Quantidade[$item] ) ) {
      if ( $this -> Quantidade[$item] >= $quantidade ) {
        $this -> Quantidade[$item] -= $quantidade;
        } else {
          $this -> Quantidade[$item] = 0;
          }
        } else {
          return false;
          }
    }

  function TotalCompras() {
    $soma = 0;
    while ( list($cod, $valor) = each($this -> Quantidade) ) {
      $soma += $this -> Quantidade[$cod] * $this -> Preco[$cod];
      }
    $soma -= $soma * ($this -> Desconto / 100);
    return $soma;
    }

}

session_start();

$_SESSION['MinhaCesta'] = new Cesta(10);
?>

Alguma dúvida sobre essa função? Uma simples para terminar. Somente percorremos toda a Matriz e calculamos a Quantidade de cada item * seu Proço unitário, aplicamos a porcentagem de descontos que o usuário tem e retornamos a Soma Total.


E como funcionaria todo o nosso script?

<?php
class Cesta {
  var $Desconto;
  var $Preco      = array();
  var $Quantidade = array();

  function Cesta($desconto) {
    $this -> Desconto = $desconto;
    }

  function AdicionarItem($item, $preco, $quantidade) {
    if( isset($this -> Preco[$item]) ) {
      $this -> Quantidade[$item] += $quantidade;
      } else {
        $this -> Preco[$item] = $preco;
        $this -> Quantidade[$item] = $quantidade;
        }
    }

  function RemoverItem($item, $quantidade) {
    if ( isset( $this -> Quantidade[$item] ) ) {
      if ( $this -> Quantidade[$item] >= $quantidade ) {
        $this -> Quantidade[$item] -= $quantidade;
        } else {
          $this -> Quantidade[$item] = 0;
          }
        } else {
          return false;
          }
    }

  function TotalCompras() {
    $soma = 0;
    while ( list($cod, $valor) = each($this -> Quantidade) ) {
      $soma += $this -> Quantidade[$cod] * $this -> Preco[$cod];
      }
    $soma -= $soma * ($this -> Desconto / 100);
    return $soma;
    }

}

session_start();

$_SESSION['MinhaCesta'] = new Cesta(10);

$_SESSION['MinhaCesta'] -> AdicionarItem("AF 1520", 17.90, 15);
$_SESSION['MinhaCesta'] -> AdicionarItem("AE 1735", 21.00, 5);
$_SESSION['MinhaCesta'] -> TotalCompras();
?>

Dessa forma, se conclui o exemplo de nossa Cesta de Compras. Agora vocês se perguntam:

- Pronto, fico bunito, mas só posso fazer isso com OOP?

Como comentei no inicio, tudo pode ser feito, qualquer script que você faria da maneira "convencional" poderia ser feito Orientado à Objeto. Para se ter uma idéia de alguns outros tipos que podem ser bastante úteis é nas Manutenções gerais de um site, upload de arquivos, murais de mensagens/recados, ...

Muitos scripts podem ser criados, de asas a sua imaginação ;)

E para quem gosta de repassar seus scripts, o que ficaria mais fácil, passar esse trecho de um código:

class Cesta {
  var $Desconto;
  var $Preco      = array();
  var $Quantidade = array();

  function Cesta($desconto) {
    $this -> Desconto = $desconto;
    }

  function AdicionarItem($item, $preco, $quantidade) {
    if( isset($this -> Preco[$item]) ) {
      $this -> Quantidade[$item] += $quantidade;
      } else {
        $this -> Preco[$item] = $preco;
        $this -> Quantidade[$item] = $quantidade;
        }
    }

  function RemoverItem($item, $quantidade) {
    if ( isset( $this -> Quantidade[$item] ) ) {
      if ( $this -> Quantidade[$item] >= $quantidade ) {
        $this -> Quantidade[$item] -= $quantidade;
        } else {
          $this -> Quantidade[$item] = 0;
          }
        } else {
          return false;
          }
    }

  function TotalCompras() {
    $soma = 0;
    while ( list($cod, $valor) = each($this -> Quantidade) ) {
      $soma += $this -> Quantidade[$cod] * $this -> Preco[$cod];
      }
    $soma -= $soma * ($this -> Desconto / 100);
    return $soma;
    }

}

Ou uns 10-15 arquivos?

================================================================================

Conclusão

Sei que passei rápido demais o assunto sobre OO, mas acredite, não há muito o que se explicar. Isso é um método de programação, não uma função ou algo assim, que possa ter detalhes, exemplos ou mais coisas. Confesso que da forma que passei isso, restringue a pessoas que tenham já algum conhecimento em PHP, mas realmente, você primeiro precisa aprender PHP, para depois passar para OO, como espera criar funções e tudo mais se está apenas começando? Tudo ao seu tempo.

A intenção desse tutorial não é mudar o jeito de todos programar, pessoalmente, devo ter nem 30% dos meus trabalhos feitos OO. Como iniciei o tutorial, não há uma vantagem de um método sobre o outro, em alguns casos OO pode ser melhor e em outros a maneira convencional pode ser a melhor forma.

Com certeza, muitas dúvidas ficaram, expliquei um método de programação em 10 segundos... Espero somente desse tutorial é que, quem se interessar por OO, realmente tente desenvolver alguns mini projetos, e a qualquer dúvida, há várias pessoas aqui para lhe ajudar ;)

Mas acredite em uma coisa, saber quando, onde e porque utilizar OO é muito mais díficil que aprender a programar em OO.

Então, como diria alguém que mata 2 leões por dia com as unhas e dentes...

"Let the carnage begin" - Stormbringer

Reajustado por: bimonti

Attached Files




#134904 Tutorial - Sistema De Login

Posted by Balala on 03/07/2003, 11:04

Bem, vamos primeiro ver tudo o que será passado nesse tutorial:
- vamos criar uma página de cadastro dos usuários;
- outra página para o login;
- gravar o login e senha em um cookie;
- outra página para recuperação de senha;
- aplicar a restrição nas páginas;

Cadastro de Usuários

Primeiramente temos que criar nossa tabela no MySQL com os campos que vamo usar, aqui teremos os campo: Codigo, Nome, Login, Email e Senha, gerando o seguite código:

CREATE TABLE `tbl_membros` (
`codigo` INT( 5 ) NOT NULL AUTO_INCREMENT,
`nome` VARCHAR( 75 ) NOT NULL ,
`login` VARCHAR( 30 ) NOT NULL ,
`senha` VARCHAR( 30 ) NOT NULL ,
`email` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `codigo` ) 
);

Explicando:

CREATE TABLE `tbl_membros` - criamos a tabela com o nome tbl_membros
Tudo que vem entre os ( ) é os campos;
Código - INT (somente números) com limite para 5 caracteres, acho que até 99999 usuários está bom né? :P E o NOT NULL para que ela não fique em branco, AUTO_INCREMENT é para ela automaticamente numerar (1,2,3,4,...)
Nome - VARCHAR (Alpha númerico, letras, números e caracteres especiais) com 75 caracteres no máximo, ...


Agora que temos a tabela criada, vamo para a página de cadastro dos usuários. Vamos fazer um formulário com os seguintes campo: Nome, Login, Senha, Repetir Senha e o Email, lembrando que o usuário não digita o campo código, ele é automaticamente inserido no MySQL.


cadastrar.php
<form name="cadastrar" method="post" action="enviar_cadastro.php">
  <table width="400" border="0" cellspacing="0" cellpadding="0">
	<tr> 
	  <td width="150"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nome:</font></td>
	  <td width="250"><input name="nome" type="text" id="nome" maxlength="75"></td>
	</tr>
	<tr> 
	  <td><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Login:</font></td>
	  <td><input name="login" type="text" id="login" maxlength="30"></td>
	</tr>
	<tr> 
	  <td><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Senha:</font></td>
	  <td><input name="senha" type="password" id="senha" maxlength="30"></td>
	</tr>
	<tr> 
	  <td><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Repetir 
		Senha:</font></td>
	  <td><input name="senha2" type="password" id="senha2" maxlength="30"></td>
	</tr>
	<tr> 
	  <td><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Email:</font></td>
	  <td><input name="email" type="text" id="email" maxlength="50"></td>
	</tr>
	<tr> 
	  <td>&nbsp;</td>
	  <td>&nbsp;</td>
	</tr>
	<tr> 
	  <td colspan="2"><div align="center"> 
		  <input name="enviar" type="submit" id="enviar" value="Enviar Cadastro">
		  <input name="limpar" type="reset" id="limpar" value="Limpar Dados">
		</div></td>
	</tr>
  </table>
</form>

Um simples formulário, nada de códigos, nada de scripts, aqui, muitos programadores gostam de enviar o formulário para a mesma página, e fazer vários IF, eu prefiro enviar o formulário para outra página que irá inserir os dados no MySQL (enviar_cadastro.php). Até essa parte acredito que não tenha nenhuma dúvida no ar, então, vamos para a página que irá introduzir esses usuários no banco de dados.

Mas primeiro, iremos fazer uma página php somente com as configurações do acesso ao banco de dados, pois iremos utiliza-lo várias vezes, e caso erremos em um ponto, teremos que conferir em todas as páginas, essa parte ajudaria como um include de menus :D.

Essa página não precisa ter nenhum código html, ou seja, crie uma página nova e apague todo o código fonte, iremos somente colocar umas váriaveis php nele, aqui segue o código da página:


config.php
<?
$host  =	"mysql.dominio.com.br"; //endereço do seu servidor MySQL
$database	=	"wmonline"; //o database que conterá sua tabela, muitas vezes seu próprio login
$tabela  =	"tbl_membros"; //o nome de sua tabela
$login_db	=	"wmonline"; //login usado no MySQL
$senha_db	=	"abc"; //senha usado no MySQL
?>

Com essa nossa página de Configurações pronta, salve-a com o nome de config.php e agora vamos para a parte de inserir os usuários:


enviar_cadastro.php
<?
include "config.php"; //aqui inserimos as váriaveis da página de configuração

$db   =	mysql_connect ($host, $login_db, $senha_db); //conectamos ao mysql
$basedados	=	mysql_select_db($database); //selecionamos o database escolhido

$pesquisar = mysql_query("SELECT * FROM `$tabela` WHERE login = '$login'", $db); //conferimos se o login escolhido já não foi cadastrado
$contagem = mysql_num_rows($pesquisar); //traz o resultado da consulta acima

if ( $contagem == 1 ) {
  $errors .= "Login escolhido já cadastrado.<br>"; //se o login já existir, ele adiciona o erro
  }

if ( $login == "" ) {
  $errors .= "Você não digitou um login<br>"; //confere se o campo login não ficou vazio
  }

if ( $senha == "" ) {
  $errors .= "Você não digitou uma senha<br>"; //confere se o campo senha não ficou vazio
  }

if ( $senha != $senha2 ) {
  $errors .= "Você digitou 2 senhas diferentes.<br>"; //adiciona o erro caso o usuário digitou 2 senhas diferentes
  }
  
if ( $errors == "" ) { //checa se houve ou não erros no cadastro

  $cadastrar = mysql_query("INSERT INTO `$tabela` (nome, login, senha, email)
	VALUES ('$nome','$login','$senha','$email')", $db); //insere os campos na tabela

	if ( $cadastrar == 1 ) {
	  echo "<div align=center><font size=2 face=Verdana, Arial, Helvetica, sans-serif><br><br><br>Cadastro com sucesso.</font></div>"; //se cadastrou com sucesso o usuário aparece essa mensagem
	  } else {
	 echo "<div align=center><font size=2 face=Verdana, Arial, Helvetica, sans-serif><br><br><br>Ocorreu um erro no servidor ao tentar se cadastrar.</font></div>"; //caso houver um erro quanto as configurações aparece essa mensagem
  }
  } else {
	echo "<div align=center><font size=2 face=Verdana, Arial, Helvetica, sans-serif>Ocorreu os seguintes erros ao tentar se cadastrar:<br><br>$errors</font></div>"; //mostra os erros do usuário, caso houver
	}
?>

Esse é nosso código para cadastrar os usuários no banco de dados, parece meio complicado ao olhar assim, mas tem comentários ao lado de cada ação, o bom é você tentar entender esse código, não copia-lo e colar no seu, digamos que essa é a base dos sistemas de login.

----------------------------------------------------------------------------

Página de Login

Vamos fazer da mesma maneira do cadastro, uma página com um formulário simples, que envia para uma página os dados digitados.

login.php
<form name="login" method="post" action="confirmar_login.php">
<table width="400" border="0" cellspacing="0" cellpadding="0">
  <tr> 
	<td width="150"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Login:</font></td>
	  <td width="250"><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> 
		<input name="login" type="text" id="login">
		</font></td>
  </tr>
  <tr> 
	<td><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Senha:</font></td>
	  <td><input name="senha" type="password" id="senha"></td>
  </tr>
  <tr> 
	<td><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></td>
	<td><font size="2" face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></td>
  </tr>
  <tr> 
	<td><div align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">
		  <input name="entrar" type="submit" id="entrar" value="Entrar">
		  </font></div></td>
	<td><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><a href="senha.php">Esqueceu 
	  a senha?</a> <a href="cadastrar.php">Cadastre-se</a></font></td>
  </tr>
</table>
</form>


Agora criaremos a página que irá verificar se a senha digitada é correta ou não. Outra coisa, essa página também não deve conter códigos html, pelo fato de ser criados cookies, você deve deletar todo o conteúdo da página antes de fazer esse código

confirmar_login.php
<?
include "config.php"; //inclui o arquivo de configurações

$db   =	mysql_connect ($host, $login_db, $senha_db); //conecta ao mysql
$basedados	=	mysql_select_db($database); //conecta a base de dados

$confirmacao = mysql_query("SELECT * FROM `$tabela` WHERE login = '$login' AND senha = '$senha'", $db); //verifica se o login e a senha conferem
$contagem = mysql_num_rows($confirmacao); //traz o resultado da pesquisa acima

if ( $contagem == 1 ) {
  setcookie ("login", $login); //grava o cookie com o login
  setcookie ("senha", $senha); //grava o cookie com a senha
  echo "Usuário logado."; //se a senha digitada está correta, mostra a mensagem
  } else {
  echo "Login ou senha inválidos. <a href=java script:history.go(-1)>Clique aqui para voltar.</a>"; //se a senha está incorreta mostra essa mensagem
  }
?>


Como o cadastro, poderá parecer meio confusa essa página, mas também aconselho que não copie o código, analise e faça você mesmo, com essas página já teriamos um sistema de login, mas queremos mais, caso nossos usuário não se lembrem da senha, não quero ele me incomodando no icq :P, então faremos uma página para que envie a senha no email cadastrado. E outra vez estaremos fazendo um formulário simples antes, e será enviado para outra página.

senha.php
<form name="senha" method="post" action="enviar_senha.php">
  <table width="400" border="0" cellspacing="0" cellpadding="0">
	<tr> 
	  <td width="150"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Login:</font></td>
	  <td width="250"><input name="login" type="text" id="login"></td>
	</tr>
	<tr> 
	  <td><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Email:</font></td>
	  <td><input name="email" type="text" id="email"></td>
	</tr>
	<tr> 
	  <td>&nbsp;</td>
	  <td>&nbsp;</td>
	</tr>
	<tr> 
	  <td colspan="2"><div align="center"> 
		  <input name="enviar" type="submit" id="enviar" value="Enviar minha Senha">
		</div></td>
	</tr>
  </table>
</form>


Agora com os campos Login e Email, podemos conferir no banco de dados e enviar a senha para o email cadastrado:

enviar_senha.php
<?
include "config.php"; //inclui o arquivo de configurações

$db   =	mysql_connect ($host, $login_db, $senha_db); //conecta ao mysql
$basedados	=	mysql_select_db($database); //conecta a base de dados

$confirmacao = mysql_query("SELECT * FROM `$tabela` WHERE login = '$login' AND email = '$email'", $db); //verifica se o login e a email conferem
  while ($row = mysql_fetch_array($confirmacao)) {
	$login = $row["login"]; //adiciona a variavel $login o login do usuario
	$senha = $row["senha"]; //adiciona a variavel $senha a senha do usuario
	$email = $row["email"]; //adiciona a variavel $email o email do usuario
	}

$contagem = mysql_num_rows($confirmacao); //traz o resultado da pesquisa acima

if ( $contagem == 1 ) {
  $msg  = "Recuperação de senha" . chr(13) . chr(10);
  $msg .= "Senha enviada em " . date("d/m/Y") . ", os dados seguem abaixo: " . chr(13) . chr(10) . chr(10);
  $msg .= "Login : " . $login . chr(13) . chr(10);
  $msg .= "Email : " . $email . chr(13) . chr(10);
  $msg .= "Senha : " . $senha . chr(13) . chr(10);

  $Remetente = "endereco@provedor.com.br"; //remetente do email, coloque o email do seu site

  mail($email, "Recuperação de Senha",$msg,"From: $Remetente\n"); //campos do email na ordem, email destinho (não deve ser alterada), assunto, conteudo (não deve ser alterado), remetente (também não altere)
  
  echo "<div align=center><font size=2 face=Verdana, Arial, Helvetica, sans-serif>Sua senha foi enviada com sucesso para o email: $email.</font></div>"; //resposta se o email foi enviado com sucesso
  } else {
	echo "<div align=center><font size=2 face=Verdana, Arial, Helvetica, sans-serif>Seu login ou email está incorreto.</font></div>"; //resposta se não foi possivel enviar o email
	}
?>


Tenho que comentar novamente? Acho que sim né, pra gravar bem :P, é melhor você entender esse script ao invés de copia-lo. Temos pronto nosso sistema já, o que nos resta é? é? é? Restringir o acesso a algumas páginas, bem, vamos fazer uma página com os scripts, e mesmo assim, temos que editar as páginas que queremos que fiquem "trancadas". Também podemos fazer sem edita-las, mas ficaria um sistema bem menos seguro. Vamos agora criar a página com a restrição:


acesso.php
<?
include "config.php"; //carregamos o arquivo de configuração

$nome = $HTTP_COOKIE_VARS["login"]; //pegamos o cookie login, gravado anteriormente com o login
$pass = $HTTP_COOKIE_VARS["senha"]; //pegamos o cookie senha, gravado anteriormente com o login

$db   =	mysql_connect ($host, $login_db, $senha_db); //conectamos ao mysql
$basedados	=	mysql_select_db($database); //conectamos ao database

$confirmacao = mysql_query("SELECT * FROM `$tabela` WHERE login = '$nome' AND senha = '$pass'", $db); //verificamos se o conteudo dos cookies esta correto
$contagem = mysql_num_rows($confirmacao); //resulta da pesquisa acima

//aqui finalizamos assim essa página, a comparação iremos fazer nas páginas com acesso restrito
?>


Essa página "acesso.php" também não pode conter códigos html, agora iremos ver como colocar essa restrição de acesso nas páginas, veja um exemplo:


Temos uma página somente com o texto "OI!" centralizado, esse é o código:

teste.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Teste de Acesso</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>

<div align="center">OI!</div>

</body>
</html>

O que temos que fazer é, Adicionar um IF no começo dessa página e um ELSE no final, caso não esteja logado, ficando assim:

teste.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Teste de Acesso</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?
if ( $contagem == 1 ) {
//aqui deixe aberto, pois iremos fechar somente no final da página
  ?>
<div align="center">OI!</div>
<?
  } else {
	echo "Você não está logado."; //aqui que terminamos o IF que iniciamos na página
	}
  ?>
</body>
</html>


Caso deseje fazer um botão para Logout, crie a página logout.php, com as seguintes ações:


logout.php
<?
setcookie("login","",time()-3600);
setcookie("senha","",time()-3600);?>

E para efetuar o Logout, você somente precisa colocar um link em suas página para essa pagina

Bem, creio que acabamos (se não esqueci nenhuma parte :P), espero ter ajudado quem passava por dificuldades com esse tipo de sistema, e que com base nele pode ser aplicado bem mais coisas, como por exemplo, criptografar os cookies de senha, para ter uma melhor segurança para seus usuários (Thanks Stormbringer, ele que me respondeu sobre criptografia).

Beleza galera, quem quiser esses arquivos e mais esse tutorial, tenho em txt, está junto no zip que coloco pra download aqui.

Attached Files




IPB Skin By Virteq