Felipe Tonello » PHP http://felipetonello.com/blog Compartilhe, ajude e cresça Thu, 07 Jul 2011 04:13:08 +0000 en hourly 1 http://wordpress.org/?v=3.2.1 Plugin Category Show(WordPress) atualizado 0.2 http://felipetonello.com/blog/2007/11/05/plugin-category-showwordpress-atualizado-02/ http://felipetonello.com/blog/2007/11/05/plugin-category-showwordpress-atualizado-02/#comments Mon, 05 Nov 2007 05:19:58 +0000 Felipe Tonello http://felipetonello.com/blog/2007/11/05/plugin-category-showwordpress-atualizado-02/ Houve mudanças no banco de dados na versão nova do WP, 2.3.x.

Então lancei a versão 0.2 que está funcionando no wordpress 2.3.x inclusive com a nova função para tags nos posts.

Você pode baixar aqui

wp_catshow0.2.tar.gz
wp_catshow0.2.zip

O Category Show exibe em formato de lista(<ul><li>) seus posts relacionados a categoria ou tag desejada.
Bastante útil para quem quer exibir seus tutoriais, artigos ou simplesmente seus posts de certa categoria.

Modo de uso

É mais fácil ainda usar.
No post seu, onde você quer listar sua(s) categorias é só usar essa sintaxe:
%.%wpcs-CATEGORIA%.%
só que sem o ponto(.) entre os %%. Coloquei se não ele lista as coisas hehe

O nome da categoria não pode ter acentos ou caracteres chatos. Caso sua categoria seja: “Olá tudo bom?“. Use assim:
%.%wpcs-ola tudo bom%.%
lembrando: sem o ponto entre os %%

Versão para WP 2.2.x:

wp_catshow.php.tar.gz
wp_catshow.php.zip

]]>
http://felipetonello.com/blog/2007/11/05/plugin-category-showwordpress-atualizado-02/feed/ 7
Engatinhando com AJAX e PHP. Parte 3 http://felipetonello.com/blog/2007/10/01/engatinhando-com-ajax-e-php-parte-3/ http://felipetonello.com/blog/2007/10/01/engatinhando-com-ajax-e-php-parte-3/#comments Mon, 01 Oct 2007 06:42:39 +0000 Felipe Tonello http://felipetonello.com/blog/2007/10/01/engatinhando-com-ajax-e-php-parte-3/ Depois de um bom tempo estou aqui novamente!

Eu recomendo todos que não viram as partes um e dois do tutorial, que as veja.
Engatinhando com AJAX e PHP. Parte 1
Engatinhando com AJAX e PHP. Parte 2

Nessa 3ª parte, vamos ver como usar Requisição POST.

Vamos para o que interessa!

Criando nosso formulário

Vamos criar um formulário normal.
index.htm

<script src="../Ajax.js" type="text/javascript"></script>
<script src="postAjax.js" type="text/javascript"></script>
<form action="postAjax.php" onsubmit="enviaReq(); return false">
 
Entre com suas informações
 
Seu nome:
<input name="nome" type="text" />
	Sua Cidade:
<input name="cidade" type="text" />
<input value="OKA!" type="submit" />
</form>

Aqui estamos linkando nossa biblioteca para criar nosso objeto XMLHttp. Caso você não esteja entendendo essa parte, recomendo você ler os dois primeiros artigos.

A unica coisa que é novidade, é o onSubmit alí. Quer dizer que quando o formulário for submetido, vai ser rodado uma função javascript ao invez de enviar diretamente o formulário. Depois é dado um return false para ter certeza que a página não dê refresh.

Requisição POST

A requisição post precisa ser enviada no formato, pelo cabeçalho http:
nome1=valor1&nome2=valor2&...&nomeN=valorN

para isso vamos criar a função que gere esse formato para nós.
Vamos chama-la de criaReqStr()

function criaReqStr(oForm){
	var aPostStr = new Array();
 
	for(var i = 0; i &lt; oForm.elements.length; i++){
		var sValor = encodeURIComponent(oForm.elements[i].name);
		sValor += "=";
		sValor += encodeURIComponent(oForm.elements[i].value);
		aPostStr.push(sValor);
	}
	return aPostStr.join("&");
}

Essa função está assumindo que lhe será informada o objeto do formulário, como argumento. Um array(aPostStr) é criado para guardar cada par de nome-valor. Depois, conforme o numero de elementos do formulário, é concatenado o par nome-valor à variável aPostStr. No final do loop, é retornado a informação dos pares nome-valor corretamente.

Você pode se perguntar: Porque usar esse join() no final sendo que eu posso concatenar tudo direto?
Realmente, seria o mais lógico. Mas cada concatenação, em web-browsers, é muito pesada para o processo, então quanto menos você concatenar melhor.

Fazendo a requisição

Para isso, vamos criar a função enviaReq(), que é bem parecida com a função para a requisição GET.

function enviaReq(){
	var oForm = document.forms[0];
	var sBody = criaReqStr(oForm);
 
	var oXMLHttp = criaXMLHttp();
	oXMLHttp.open("post", oForm.action, true);
	oXMLHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 
	oXMLHttp.onreadystatechange = function (){
		if(oXMLHttp.readyState == 4)
			exibeResult(oXMLHttp.responseText);
		else
			exibeResult("Ocorreu um erro: " + oXMLHttp.statusText);
	};
	oXMLHttp.send(sBody);
}

Primeiramente ela seta a referencia do form numa variável(oForm). Depois recebe a string dos pares nome-valor pela função criaReqStr(), lembram?
Em seguida é instanciado o objeto xmlhttp pela função criaXMLHttp().
Depois que está o "tchan" do negócio, no método open() o primeiro parâmetro é "post", qual requisição queremos fazer. O segundo parâmetro é a página que iremos enviar a requisição, que no caso é o atributo action do formulário. O terceiro parâmetro é true em caso de querer que a requisição seja assíncrona.
Depois é setado um cabeçalho de que a informação está codificada(urlencode). Importante, porque a maioria das linguagens server-side verifica essa codificação para o parsing da informação

Depois é só exibir o resultado no nosso div#divStatus pela função exibeResult():

function exibeResult(sTxt){
	var divStatus = document.getElementById("divStatus");
	divStatus.innerHTML = sTxt;
}

Simples não?

Agora vamos para a parte mais fácil: O server-side.

Criando nosso arquivo PHP

Ele é super simples, muito igual ao no caso da requisição feita pelo método GET.
postAjax.php

<?php
header('Content-Type: text/plain');
 
$sNome = $_POST['nome'];
$sCidade = $_POST['cidade'];
 
$sStatus = '';
 
/* Exemplo com Banco de Dados MySQL */
mysql_connect('seu.servidor', 'usuario', 'senha');
mysql_select_db('tabela.do.bd');
 
if (mysql_query("INSERT INTO tabela VALUES ('$sNome', '$sCidade')"))
	$sStatus = 'Informação inserida corretamente do banco de dados.';
else
	$sStatus = 'Erro ao inserir informações no banco de dados';
 
echo $sStatus;
?>

Você percebeu que mudamos o cabeçalho do arquivo para texto normal, usando a função header(). Depois só recebemos as variáveis pelo array global $_POST[].
Inserimos no banco de dados, e em caso de sucesso exibe a mensagem de sucesso. Em caso de erro(banco de dados com problema), exibe a mensagem de erro.

Baixando o tutorial

Para maior proveito do tutorial, baixe o tutorial agora:
post-ajax-php.zip
post-ajax-php.tar.gz

Nessa parte 3 fui bem mais direto ao ponto, agora que todo mundo já sabe o básico de AJAX com PHP né? hehehe

Mas é isso aí. Nas próximas versões do tutorial, vamos ver como fazer um validador de formulário conversando com banco de dados.

]]>
http://felipetonello.com/blog/2007/10/01/engatinhando-com-ajax-e-php-parte-3/feed/ 40
Evento: Frameworks de Desenvolvimento com PHP http://felipetonello.com/blog/2007/06/22/evento-frameworks-de-desenvolvimento-com-php/ http://felipetonello.com/blog/2007/06/22/evento-frameworks-de-desenvolvimento-com-php/#comments Fri, 22 Jun 2007 14:37:35 +0000 Felipe Tonello http://felipetonello.com/blog/2007/06/22/evento-frameworks-de-desenvolvimento-com-php/ Galera, tudo beleza?

Desculpe-me pelo tempo sem postar, é que esse ano estou muito ocupado no cursinho e está meio dificil. Mas voltar a postar, não com tanta intensidade.

Frameworks de Desenvolvimento com PHPMas então, eu fui convidado a participar de um workshop sobre frameworks de php que vai ter em São Paulo(Capital). Estou muito feliz em poder participar desse evento! :)

Esse evento vai contar com participação de 3 palestrantes: Jhony M. Maseto vai falar sobre Symfony, Elton L. Minetto sobre CakePHP e eu sobrei com o Zend.

Mais informações sobre o evento: Site oficial e PHPBrasil.com.

Conto com a presença de vocês!

]]>
http://felipetonello.com/blog/2007/06/22/evento-frameworks-de-desenvolvimento-com-php/feed/ 9
Zend Framework para um PHP mais poderoso http://felipetonello.com/blog/2007/02/28/zend-framework-para-um-php-mais-poderoso/ http://felipetonello.com/blog/2007/02/28/zend-framework-para-um-php-mais-poderoso/#comments Wed, 28 Feb 2007 18:23:52 +0000 Felipe Tonello http://felipetonello.com/blog/2007/02/28/zend-framework-para-um-php-mais-poderoso/ Esse tutorial tem como objetivo mostrar para as pessoas que nunca viram nada sobre o ZF(Zend Framework) e estão querendo saber como ele funciona.

Quem já ouviu falar do Zend Framework? Resumidamente a Zend é uma empresa responsável pela manutenção e desenvolvimento do PHP.
A engine de orientação a objetos do php5 foi totalmente reescrita pelo pessoal da Zend.

Mas o que seria um framework?

O framework é um conjunto de classes com objetivo de reutilização de um design, provendo um guia para uma solução de arquitetura em um domínio específico de software. (Wikipedia)
Pode-se dizer que ele seria um conjunto de bibliotecas específicas.

Falando nossa lingua, o framework é um conjuntão de bibliotecas que ajuda em nosso trabalho do dia a dia, e nos trabalhos mais complicados também.

Esse artigo utiliza a versão 0.8 do framework. (dia 28/02/07)
[atualizado]
Versão atual: 1.0.2 (01/09/07)
[/atualizado]

Entendendo o Zend Framework

O Zend Framework segue o padrão MVC - Model View Controller. É um padrão de arquitetura onde separa o GUI, templates, etc(View) da lógica(Model) e do controle(Controller).
Então nele você pode usar a mesma lógica e/ou controle em diversas interfaçes com o usuário.

Usando o Zend Framework

Agora vamos arrumar a estrutura de diretórios necessária para o correto funcionamento do ZF.

diretórios

PS: a pasta ZF-tutorial fica dentro do DocumentRoot, que é onde fica suas páginas no servidor(padrão do apache: htdocs/ ou /var/www/).

No caso a pasta controllers, models e views estão dentro da pasta app(application, nome sugestivo). publico é onde vai suas outras coisas normais como imagens e css, js e assim por diante. E lib é a pasta onde vai ficar o ZF.

Entre na pasta onde você descompactou o arquivo tarball(.tar.gz), depois entre na pasta library e copie a pasta zend para a sua pasta lib(na ZF-tutorial) do seu sistema. Talvez você precise mudar(ou copiar) como root, aqui no exemplo vou usar sem o root.

cd ~/ZendFramework-1.0.1/library
cp -Rfv Zend/ documentRoot_do_apache/ZF-tutorial/lib/

Aí depois no diretório lib irá ter lib/Zend, certo?

lib/Zend

Configurando o Apache

Primeira coisa que temos a fazer é abilitar o módulo rewrite do apache.
Edite o arquivo de configuração do apache, httpd.conf.
Descomente(tirando o #) a linha onde está escrito:

LoadModule rewrite_module modules/mod_rewrite.so
AddModule mod_rewrite.c

Defina o AccessFileName (pode ser no final do arquivo):

AccessFileName .htaccess

Setar a opção AllowOverride como All.

Trocar as linhas abaixo:

#&lt;Directory /&gt;
# Options Indexes FollowSymLinks
# AllowOverride None
#&lt;/Directory&gt;

por:

&lt;directory&gt;
Options FollowSymLinks Includes
AllowOverride All
&lt;/directory&gt;

Criando o Bootstrapping

O controller do ZF, Zend_Controller, é feito para suportar websites com urls limpas.
Então, todas as requisições precisam ser feitas diretamente em um arquivo index.php, essa prática é conhecida como bootstrapping.
E para isso precisamos criar alguns arquivos .htaccess.

ZF-tutorial/.htaccess

RewriteEngine on
RewriteRule .* index.php
php_flag magic_quotes_gpc off
php_flag register_globals off

Essa RewriteRule quer dizer que para qualquer coisa escrita ele(apache) irá redirecionar para o index.php(que fica dentro do ZF-tutorial, calma que ainda vamos cria-lo). :)
Alí também setamos algumas configurações do PHP.ini. Essas configurações provavelmente já estão setadas como padrão, mas é bom ter certeza né. Elas só vão funcionar se estiver habilitado o mod_php no httpd.conf do apache.

Agora vamos setar nosso .htaccess na pasta público. Lá estará os arquivos JavaScript, CSS, imagens e assim por diante. Então vamos habilitar tudo por lá.

ZF-tutorial/publico/.htaccess

RewriteEngine off

Agora na pasta app e no lib não queremos que nenhum intruso acesse, porque lá estão nossos arquivos preciosos. :P
ZF-tutorial/app/.htaccess

deny from all

ZF-tutorial/lib/.htaccess

deny from all

Esse esquema de bootstrapping é recomendação dos desenvolvedores do ZF, ok? Motivo de segurança, sabe como é né.

Criando o nosso index.php(bootstrap file)

Agora vamos criar nossa index.php na pasta ZF-tutorial.
ZF-tutorial/index.php

<?php
error_reporting(E_ALL|E_STRICT); // para mostrar os erros, apenas nos testes(precisa estar setado no PHP.ini)
 
// Seta o timezone pra são paulo (&gt;=PHP 5.1)
setlocale (LC_ALL, 'pt_BR');
date_default_timezone_set('America/Sao_Paulo');
 
/* Seta include path para o funcionamento correto do framework ***OBRIGATÓRIO*** */
set_include_path('.'.PATH_SEPARATOR.'./lib'
.PATH_SEPARATOR.'./app/models/' //facilitar depois ao loadar as nossos modelos
.PATH_SEPARATOR.get_include_path());
 
/* Necessário para loadar qualquer outra classe do framework ***OBRIGATÓRIO*** */
include "Zend/Loader.php";
 
//loada o controller front
Zend_Loader::loadClass('Zend_Controller_Front');
 
/*
 Essa classe se encontra em Zend/Controller/Front.php
 Pode ser loadado diretamente pelo nome se preferir
 
 Para começar nós precisamos loadar primeiro o front controller
 Ele faz um controle automático para detectar a base URL e fazer o redirecionamento correto
 */
$controlador = Zend_Controller_Front::getInstance();
$controlador->throwExceptions(true); // mostrar excessões(apenas para testes)
$controlador->setControllerDirectory('./app/controllers'); // seta diretório com nossos controllers
 
//Roda o sistema
$controlador->dispatch();
 
//sem fechar a tag php

Note que agente não fecha a tag php para nos previnir de erros usando o header(), no caso de espaços em branco adicionais depois do ?>.

Agora na pasta controllers vamos criar um IndexController.php. Esse controller vai entrar em ação sempre que o index for chamado.
Para entender como funciona, precisamos saber como o Zend_Controller_Front trabalha.
O ZF usa um sistema de Controllers(Controladores) e Actions(Ações). E isso é setado diretamente na url(lembra do bootstrapping?). Como?
Usando o nosso exemplo, no formato http://localhost/ZF-tutorial/index/teste o index é o Controller e o teste é o Action. Outro exemplo, http://localhost/ZF-tutorial/foo/bar o foo é o Controller e o bar é o Action.
E quando você não coloca nada? Exemplo, http://localhost/ZF-tutorial/ o Zend_Controller_Front considera como index o Controller e index a Action.
O que vem depois é parâmetro, mas isso é assunto pra depois :P

Vamos fazer nosso IndexController então
ZF-tutorial/app/controllers/IndexController.php

<?php
class IndexController extends Zend_Controller_Action
{
  public function indexAction()
  {
    $this->view->titulo = 'Primeiro Tutorial de Zend Framework';
    $this->view->detalhe = 'Olá Mundo!';
  }
}

Atenção: Sempre o controller deve levar esse padrão NomeController.php e a classe com o mesmo nome do arquivo. A primeira letra sempre em maiúsculo e o resto minúsculo.
Já os Actions também deve levar esse padrão nomeAction(), sempre minúsculo.

Mas se você for rodar o sistema agora, vai perceber que vai dar uma excpetion gigantesca aí, certo?
Ela está falando que nós não temos o viewer para o index action do index controller.

Para criar, precisamos acessar a pasta scripts que está no ZF-tutorial/views/. Lá vamos criar uma pasta para cada Controller nosso, no nosso caso iremos criar uma pasta chamada index(por causa do IndexController). Todos os templates para o IndexController devem estar nessa pasta. O mais legal é que o nome do template leva o nome da action.
Calma, vou explicar: Por padrão cada action você pode ter um template ou não, mas se a action for tem um template para ela, então o template deve levar o mesmo nome da action. Por exemplo index.phtml(extenção do template) é o viewer do indexAction(), sacaram?

Na prática agora:

cd documentRoot_do_apache/ZF-tutorial/app/views/scripts
mkdir index

Agora nós temos que criar o index.phtml
ZF-tutorial/app/views/scripts/index/index.phtml

&lt;html&gt;
&lt;head&gt;
  &lt;title&gt;&lt;?php echo $this-&gt;escape($this-&gt;titulo); ?&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;?php echo $this-&gt;escape($this-&gt;detalhe); ?&gt;
&lt;/body&gt;
&lt;/html&gt;

é recomendável que usemos o escape para escapar tags html.

Agora vamos testar nossa aplicação.
Acesse o http://localhost/ZF-tutorial e depois tente http://localhost/ZF-tutorial/index/index
Você vai perceber que deu no mesmo.

Tarefinha, de leve

Agora deixo uma tarefa para vocês: Criar um zfAction(), no IndexController, com seu respectivo viewer. Após criado, acessem http://localhost/ZF-tutorial/index/zf e vejam o que aconte!

Conclusões

Apesar desse tutorial mostrar de maneira simples como funciona o Zend Framework, podemos perceber como o Zend Frameowork é facil de usar e ao mesmo tempo é poderoso.
Para um maior aprendizado, irei postar um novo tutorial com muito mais recursos do ZF.

Por enquanto eu recomendo um tutorial muito bom(desenvolvedor do ZF), eu me baseei no tutorial dele, e tabmém usem bastante o manual.

Acesse a página de tutoriais do Zend Framework

Cya later!!

]]>
http://felipetonello.com/blog/2007/02/28/zend-framework-para-um-php-mais-poderoso/feed/ 52
Engatinhando com AJAX e PHP. Parte 2 http://felipetonello.com/blog/2007/01/20/engatinhando-com-ajax-e-php-parte-2/ http://felipetonello.com/blog/2007/01/20/engatinhando-com-ajax-e-php-parte-2/#comments Sat, 20 Jan 2007 16:29:16 +0000 Felipe Tonello http://felipetonello.com/blog/2007/01/20/engatinhando-com-ajax-e-php-parte-2/ Nesse tutorial vamos fazer nosso primeiro exemplo de AJAX + PHP.
Vamos usar primeiramente o XMLHttp GET Request.

Quem não viu ainda, a parte 1 do tutorial você encontra aqui mesmo.

[update 03/10/07]
Parte 1 do tutorial AJAX + PHP
Parte 3 do tutorial AJAX + PHP
[/update]

Bora lá!!

Criando o Objeto XMLHttp

Vamos mexer um pouco no JavaScript para criar a requisição.

function criaXMLHttp() {
 if (typeof XMLHttpRequest != "undefined")
 	return new XMLHttpRequest();
 else if (window.ActiveXObject){
 	var versoes = ["MSXML2.XMLHttp.5.0",
 	"MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0",
 	"MSXML2.XMLHttp", "Microsoft.XMLHttp"
 	];
 }
 for (var i = 0; i &lt; versoes.length; i++){
 	try{
 		return new ActiveXObject(versoes[i]);
 	}catch (e) {}
 }
 throw new Error("Seu browser nao suporta AJAX");
}

Primeiro ela testa se o browser suporta o XMLHttpRequest e cria se o suportar.. se não ele cria um array com várias versões do XMLHttp para browsers mais antigos(IE). E fica em um loop até conseguir criar um objeto, se não criar nenhum ele retorna a mensagem de erro.
Resumindo: a função testa as possibilidades do browser de criar o objeto XMLHttp. Se for o IE 6.0 ele cria o MSXML2.XMLHttp.5.0 e assim por diante.

Usando o XMLHttp

O objeto XMLHttp tem um método que a mais imporante, a open(). Ela tem 3 parâmetros que precisamos saber:

  • Tipo da requisição: sintrg que indique o tipo: get ou post
  • URL: string com a url que você quer fazer a requisição
  • Async: boolean que indica se o modo da requisição seja feito assincronamente(não sei escrever essa palavra :( )

O ultimo parâmetro é o mais importante.. ele que vai dizer se a sua requisição é AJAX mesmo ou não. Se ele for true, a requisição é feita em tempo real. Já se você colocar false, a requisição é feita e o resto da página só é loadada quando a requisição retornar algo ou terminar.
Exemplo:

var XMLHttp = criaXMLHttp();
XMLHttp.open("get", "info.txt", true);

Outro evento importante no XMLHttp é o onreadystatechange. O XMLHttp tem uma propriedade chamada readyState que muda conforme a requisição é recebida. Existem 5 estados para o readyState:

  • 0(Não Iniciado): O Objeto foi criado mas o método open() não foi chamado ainda.
  • 1(Carregando): O método open() foi chamado mas a requisição não foi enviada ainda.
  • 2(Carregado): A requisição foi enviada.
  • 3(Incompleto): Uma parte da resposta do servidor foi recebida.
  • 4(Completo): Todos as informações foram recebidas e a conexão foi fechada com sucesso.

Toda vez que a propriedade do readyState for mudada, o evento onreadystatechange é disparado. Por causa das diferentes implementações dos browsers, a propriedade do readyState não funciona corretamente em todos os browsers. O unico modo para cross-browser é usando o valor 0, 1 e 4 para o readyState. Mas na maioria dos casos você usará apenas o estado 4 mesmo.
Depois de tudo isso temos que realmente enviar a requisição com o método send(). Quando utilizamos a requisição por GET nós não precisamos passar nenhum parâmetro no send(). Depois quando vermos com POST aí iremos usar mais profundamente. :)
Exemplo:

var XMLHttp = criaXMLHttp();
XMLHttp.open("get", "info.txt", true);
XMLHttp.onreadystatechange = function () {
 if (XMLHttp.readyState == 4)
 	alert("EEE primeiro teste com AJAX!! :)");
};
XMLHttp.send();

Tá bom, mas e agora? Enviei tudo, recebi e pronto. Cadê minha informação?
Ta certo, agora é bem simples, existe uma propriedade no XMLHttp que ele tem o retorno do http request, o responseText(no nosso caso, poderia ser responseXML). Lembram da primeira parte do tutorial? Então, agora vamos usar ela.
Primeiro vamos testar se a informação retornada veio com sucesso (200). Para testarmos o status do retorno existe a propriedade status do XMLHttp. Tudo muito simples não? Então olha o exemplo:

if (XMLHttp.status == 200)
	alert("O retorno foi: " + XMLHttp.responseText);
else
	alert("O retorno foi: " + XMLHttp.statusText);

Beleza. Até aí vimos exemplo bem bobos, apenas para intendermos como funciona as coisas.
Agora sim vamos ver como fica uma aplicação com AJAX e PHP.

Já temos a função que retorna o Objeto XMLHttp, então vamos fazer a partir dela.
Agora vamos para o código HTML.
Criamos duas divs. Uma vai exibir o resultado e outra vai ser o campo onde você coloca o id para fazer a pesquisa.

<div id="resultado"></div>
 
<div id="lerid">
Id: <input name="id" id="id" type="text" />
<input value="OKA!!" onclick="lerId()" type="button" />
</div>

Agora, na função lerId() temos que pegar o valor do campo id e enviar ele na requisição usando GET e depois disso, recebemos o valor e exibimos na div resultado.
Fica assim:

function lerId() {
	var id = document.getElementById("id").value;
	var divInfo = document.getElementById("resultado");
	var XMLHttp = criaXMLHttp();
	XMLHttp.open("get", "lerId.php?id=" + id, true);
	XMLHttp.onreadystatechange = function () {
		if (XMLHttp.readyState == 4)
			if (XMLHttp.status == 200){
				divInfo.innerHTML = XMLHttp.responseText;
			} else {
				divInfo.innerHTML = "Um erro ocorreu" + XMLHttp.statusText;
			}
	};
	XMLHttp.send(null);
}

Como já vimos como funciona a requisição XMLHttp não vamos ter muita dificuldade de entender essa. A unica diferença com o exemplo é que nós passamos um parâmetro para a página pegaId.php e exibir o resultado no div resultado.

Agora vamos criar a página pegaId.php que irá ler o id enviado pela requisição Http e retornar o status.
lerId.php:

<?php
// mudamos o tipo de arquivo.. ao invez de php irá retornar um texto normal
header("Content-Type: text/plain");
// recebe o id que veio pelo parametro usando o método GET
$id = $_GET["id"];
$resultado = "";
// isso agora é um exemplo, você tem que aplicar a conexão e a consulta sql à sua necessidade
$BDUsuario = "seu usuario ou root";
$BDSenha = "senha do usuario";
$BDServidor = "localhost normalmente ou o servidor de banco de dados";
$BancoDeDados = "nome do seu banco de dados";
mysql_connect($BDServidor, $BDUsuario, $BDSenha);
mysql_select_db($BancoDeDados);
$sql = mysql_query("SELECT * FROM tabela WHERE id = " . $id);
if ($resultado = $mysql_fetch_array($sql))
	$resultado = "ID Encontrado
	\n
	Nome: " . $resultado['nome'];
echo $resultado;
?>

Agora o seu primeiro programa com AJAX está escrito.. bem simples não?
Ele só recebe o id que veio por GET, procura no banco de dados, e exibe o nome da pessoa referente ao id(exemplo apenas)..
A unica coisa que pode ficar meio no ar é a questão do header e do echo no final. O header serve para fazer com que o retorno do arquivo fique em formato texto e não em outro tipo(como html, php). Pois nós usamos o XMLHttp.responseText. Se você colocar alguma tag html, na pagina principal, onde o script é rodado, irá funcionar o html, pois a página é html. Agora se você rodar o lerId.php ele irá exibir como se fosse um texto normal.
O echo serve apenas para exibir o resultado. Todo o resultado que você quer que seja exibido no cliente você tem que exibir em seu script php, pois o XMLHttp.responseText pega justamente o que a página php(server-side) exibe, no caso um texto.

Terminamos por hoje nossa aula de AJAX com PHP parte 2.

Na proxima aula vamos ver como funciona a requisição pelo método POST.

Dúvidas podem comentar.

Abraços

]]>
http://felipetonello.com/blog/2007/01/20/engatinhando-com-ajax-e-php-parte-2/feed/ 40
Engatinhando com AJAX e PHP. Parte 1 http://felipetonello.com/blog/2006/11/14/engatinhando-com-ajax-e-php-parte-1/ http://felipetonello.com/blog/2006/11/14/engatinhando-com-ajax-e-php-parte-1/#comments Tue, 14 Nov 2006 19:30:22 +0000 Felipe Tonello http://felipetonello.com/blog/2006/11/14/engatinhando-com-ajax-e-php-parte-1/ Esse é meu primeiro tutorial sobre AJAX e espero que não seja o único. :)

[update 03/10/07]
Parte 2 do tutorial AJAX + PHP
Parte 3 do tutorial AJAX + PHP
[/update]

Como esse tutorial é bem básico, para quem está começando com AJAX, eu vou esplicar explicar coisas bem básicas. Desde como funciona o protocolo HTTP e um exemplo de AJAX.

Para que você possa usufruir ao máximo do tutorial, você necessita de conhecimentos de HTML, JavaScript e PHP.

Vamos ver aqui então: Como funciona um HTTP request, um HTTP response, técnicas utilizadas e como comunicar o cliente com o servidor.

HTTP Resquests

O formato de um HTTP request é assim:
<requeste-line>
<headers>
<blank line>
[<request-body>]

A primeira linha(<requeste-line>) necessita da indicação do tipo do request, diretório de acesso eda versão do HTTP. Já no <headers> indica informações adicionais para o server. Depois a <blank line>, é seguida do <request-body> que é opcional.

Não vou ficar explicando muito aqui, pois não é o foco do nosso tutorial. Agora vou mostrar um exemplo prático de como o browser envia o HTTP request:
GET /?cod=1 HTTP/1.1
Host: www.felipetonello.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy)
Connection: Keep-Alive

Explicando resumidamente: Na primeira linha vimos que usamos o tipo GET seguido da / quer dizer que irá acessar ao diretório root do server com o parametro cod=1 e em seguida da versão do HTTP. Depois os cabeçalhos que são auto-explicativo.
Quem usa PHP a um tempo conhece bem esses headers.

Então vimos como o browser se comunica com os servidores por meio do HTTP(Hypertext Transfer Protocol).

HTTP Responses

Agora vamos ver como o servidor responde, quando recebe um request, por meio do HTTP.
<status-line>
<headers>
<blank line>
[<response-body>]

O formato é bem parecido, apenas muda a primeira e ultima linha. Na primeira linha ele retorna a versão do HTTP e o status da resposta. Já na ultima ele retorna o corpo da resposta. Exemplo:
HTTP/1.1 200 OK
Date: Sat, 11 Nov 2006 23:59:59 GMT
Content-Type: text/html;charset=UTF-8
Content-Length: 122


<html>
<head>
<title>Felipe Tonello</title>
</head>
<body>
<!-- Aqui vem o corpo -->
</body>
</hmtl>

Na primeira linha temos a versão do HTTP em seguida do status(200). Os cabeçalhos e depois a resposta que no caso foi como um text/html.
Os status mais comuns são:

  • 200 (OK): arquivo encontrado com sucesso.
  • 304 (NOT MODIFIED): O arquivo não foi modificado desde o ultimo request. Isso é mais utilizado em browsers com mecanismos de cache.
  • 401 (UNAUTHORIZED): Cliente não tem autorização para acessar o arquivo. Normalmente isso irá fazer com que o browser pergunte por usuário e senha para logar no servidor.
  • 403 (FORBIDDEN): O Cliente falhou na autorização. Normalmente acontece quando você falha na autorização depois de um erro 401.
  • 404 (NOT FOUND): Quando o arquivo não existe na localização informada.

Nesse tutorial vocês entenderam como funciona o protocolo HTTP para se comunidar entre servidor e cliente.
Para não ficar muito grande vou separar em 2 partes. Na proxima parte vamos ver um exemplo de comunicação cliente-servidor usando AJAX.

Até mais. :)

]]>
http://felipetonello.com/blog/2006/11/14/engatinhando-com-ajax-e-php-parte-1/feed/ 22
Instalando LAMPP(Linux + Apache + MySQL + PHP + Perl). Mais facil impossivel! http://felipetonello.com/blog/2006/08/11/instalando-lampplinux-apache-mysql-php-perl-mais-facil-impossivel/ http://felipetonello.com/blog/2006/08/11/instalando-lampplinux-apache-mysql-php-perl-mais-facil-impossivel/#comments Fri, 11 Aug 2006 02:41:46 +0000 Felipe Tonello http://felipetonello.com/blog/2006/08/11/instalando-lampplinux-apache-mysql-php-perl-mais-facil-impossivel/ Alguns programadores sabendo da "dificuldade" para instalar o lampp (compilar mysql, php etc..) criaram um XAMPP.

Resumindo ele é um programa q instala tudo que falei no tópico, Apache, MySQL, PHP e Perl, fora as bibliotecas mais usadas e etc...

Vamos lá..

Primeiro baixe a ultima versão do download do xampp(no caso 1.6.4):
http://www.apachefriends.org/download.php?xampp-linux-1.6.4.tar.gz


depois abra o terminal e digite:

sudo tar xvfz xampp-linux-1.6.4.tar.gz -C /opt
só utilize este comando para instlar, não use nenhum outro descompactador nada...
e se você ja tiver instalado xampp outra vez, ele sobre escreve...
ele vai instalar tudo na pasta /opt/lampp


Agora é só startar :)
terminal denovo:
$ sudo /opt/lampp/lampp start

se aparecer
Starting XAMPP 1.6.4...
LAMPP: Starting Apache...
LAMPP: Starting MySQL...
LAMPP started.

estará tudo certo, caso contrario vá ao Linux FAQ
Abra seu web-browser e digite http://localhost na barra de endereços...

Existem alguns quesitos de segurança que você pode arrumar como:
1. O administrador MySQL (root) não contém senhas.
2. O MySQL pode ser acessado via network normal.
3. ProFTPD usa a senha "lampp" para o usuário "nobody".
4. PhpMyAdmin é acessivel via network.
5. Examples são acessiveis via network.
6. MySQL e o Apache estão rodando sob o mesmo usuário (nobody).

para mudar a segurança digite o comando:
$ sudo /opt/lampp/lampp security
e siga os passos.

PHP 4 ou PHP 5?

Por causa das grandes mudanças que temos na versão 5 do PHP, a partir da versão 1.4.7 podemos mudar: PHP 5.x e PHP 4.x. Se você tiver uma aplicação PHP que só funciona na versão 4, você pode fazer isso.

Mudando para a versõa 4:
$ sudo /opt/lampp/lampp php4

Mudando para a versõa 5:
$ sudo /opt/lampp/lampp php5

Vendo a versão:
sudo /opt/lampp/lampp phpstatus

Parametros Avançados:

start Starta o XAMPP.
stop Para o XAMPP.
restart Para e starta o XAMPP.
startapache Starta apenas o Apache.
startssl Starta o suporte SSL para o apache. Esse comando é permanente, exemplo: se você restartar o XAMPP esse parâmetro continua.
startmysql Starta só o MySQL.
startftp Starta o ProFTPD server. Via FTP você consegue dar upload para seu server (usuário "nobody", senha "lampp"). Esse comando é permanente, exemplo: se você restartar o XAMPP esse parâmetro continua.
stopapache Para o Apache.
stopssl Para o suporte SSL do apache. Esse comando é permanente, exemplo: se você restartar o XAMPP esse parâmetro continua.
stopmysql Para o MySQL.
stopftp Para o ProFTPD. Esse comando é permanente, exemplo: se você restartar o XAMPP esse parâmetro continua.
security Starta um programa de segurança.

exemplo:
$ sudo /opt/lampp/lampp startssl

você pode acessar o Apache servidor via o SSL: https://localhost

Pastas/Arquivos importantes:

/opt/lampp/bin/ pasta raiz do XAMPP. /opt/lampp/bin/mysql chama o MySQL monitor.
/opt/lampp/htdocs/ DocumentRoot do apache. Pasta onde vai as páginas, sites, etc.
/opt/lampp/etc/httpd.conf arquivo de configuração do apache.
/opt/lampp/etc/my.conf Arquivo de configuração do MySQL.
/opt/lampp/etc/php.ini Arquivo de configuração do PHP.
/opt/lampp/etc/proftpd.conf Arquivo de configuração do ProFTPD. (desde 0.9.5)
/opt/lampp/phpmyadmin/config.inc.php Arquivo de configuração do PHPMyAdmin.

Parando o XAMPP:

$ sudo /opt/lampp/lampp stop

irá ver algo do tipo:
Stopping LAMPP 1.6.4...
LAMPP: Stopping Apache...
LAMPP: Stopping MySQL...
LAMPP stopped.

O XAMPP Parou.

Desinstalando:

Apenas o comando:
$ sudo rm -Rf /opt/lampp

o XAMPP foi desinstalado completamente.

Viu como é facil??

Muitos devem estar pensando que não querem usar o XAMPP por que gostam de configurar manualmente, etc... eu concordo com isso... mas podemos facilmente configurar tudo pelo XAMPP..

Eu recomendo usar o XAMPP para quem ja é usuario experiente e sabe instalar manualmente e quem está com pressa, hehe. Pois é aconcelhavel instalar manualmente para aprender como funciona tudo certinho, etc..

Lembrando que o XAMPP tem versão para windows, Solaris e MacOS..

para mais informações visite o site:
http://www.apachefriends.org/en/index.html

]]>
http://felipetonello.com/blog/2006/08/11/instalando-lampplinux-apache-mysql-php-perl-mais-facil-impossivel/feed/ 76
PHP: Entendendo o PHP5 http://felipetonello.com/blog/2006/05/15/php-entendendo-o-php5/ http://felipetonello.com/blog/2006/05/15/php-entendendo-o-php5/#comments Mon, 15 May 2006 18:05:12 +0000 Felipe Tonello http://felipetonello.com/blog/2006/05/15/php-entendendo-o-php5/ Mesmo o PHP5 sendo lançado a um bom tempo já, e também ja sabemos que irá lançar o PHP6, muitas pessoas não sabem realmente a principal diferença entre o PHP5 e o PHP4(ou anteriores). Com esse artigo eu irei mostrar as principais mudanças.

A principal mudança do PHP5 é a Orientação a Objetos. No PHP5 os engenheiros do Zend reescreveram toda o modulo de orientação a objetos para melhor performance e mais poder também na linguagem.

Aqui vou mostrar a como usar essas novas funções e como aplica-las(vou ser bem objetivo, sem balblalb).

Uma classe no PHP funciona assim:

<?php
class ClasseExemplo
{
    // declaração da variável
    public $var = 'Olá Mundo';
    // declaração do método
    public function exibeVar()
    {
        echo $this->var;
    }
}
$classe = new ClasseExemplo();
$classe->exibeVar();
?>

Essa é uma classe exemplo onde que podemos notar algumas regras:

  • Declação de varivel da classe(que poderá usar em vários metodos da mesma classe)
  • Declaração do método
  • Declarar a prioridade de acesso do método e da variável
  • Para chamar a classe você usa sintaxe $variavel = new NomeClasse();

Caso alguém já trabalhou com C++ ou Java, irá notar grande similaridade. Caso não, vamos as explicações:
Toda variável que será usada em diversos métodos(global) tem que ser declarada na classe e não no método. O método na verdade é mesma coisa que a função, mas por questão de nomenclatura a função dentro de uma classe se chama método.

Toda variável global ou método tem que ter uma prioridade(visibilidade). O que é isto?
Essa prioridade é quem vai mostrar para a classe se outra classe, ou se outros métodos ou se fora da classe você poderá chamar ela. Isso vale tanto pra métodos ou variáveis. Mas como assim?

Vou mostrar os tipos de prioridades que temos e assim os exemplos para vocês entenderem melhor. A visibilidade se aplica tanto para métodos quanto para variáveis.

Visibilidade e Classes Filhas

Existem 3 tipos: Public(publico), Protected(protegida), Private(privada).

Public - Publico. Você pode acessa-la dentro e fora da classe. Mais comum entre os métodos
Protected - Você pode acessa-la somente na Classe ou em suas classes filhas. Não tao comum.
Private - Você pode acessar somente dentro da classe. Mais comum nas variáveis.

Exemplo:

<?php
class MinhaClasse
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';
 
    // método public (nao precisa por public, mas é recomendável)
    function oi()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}
 
$obj = new MinhaClasse();
echo $obj->public; // Funciona
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->oi(); // Exibe Public, Protected e Private
 
 
class MinhaClasse2 extends MinhaClasse
{
    // Pode-se declarar o public e o protected métodomas não o private
    protected $protected = 'Protected2';
    public function oi()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}
 
$obj2 = new MinhaClasse2();
echo $obj2->public; // Funciona
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->oi(); // Exibe Public, Protected2, não Private
?>

Nesse exemplo está mais claro de entender como funciona a visibilidade do PHP. Mas pode ter certeza que nunca é tão complicado, sempre é bem simples, as variáveis normalmente são private e os métodos public.

E notamos também alí a classe filha(parente, estendida). Ela é uma classe que pertence a classe mãe, no caso a MinhaClasse, e os métodos protected funcionam nela também.

Static

Existe um modo também de acessar algum método/variável de uma classe sem precisar instância-la. É declarando o método ou variável como static(estática) ou se for uma constante também.

Exemplo:

<?php
class Foo
{
   public static $eu_static = 'foo';
 
   public function valorStatic() 
   {
      return self::$eu_static;
   }
}
 
print Foo::$eu_static; // foo
 
$obj = new Foo();
$obj->valorStatic(); // foo
?>

Construtor e Destrutor

O método construtor é rodado quando a classe é instânciada. Ele serve para caso você queira que, por padrão quando instânciar a classe, ela faça algo já automático. Se em sua classe não contenha o método construtor o PHP irá procurar pelo nome de um método igual ao nome da classe, como é feito em Java por exemplo.

Sintaxe: void __construct ([void])

Exemplo:

<?php
class BaseClass 
{
    public function __construct() 
    {
        print "Chamou o construtor\n";
    }
}
$obj = new BaseClass();
?>

O método construtor também pode conter parâmetros. Esses parâmetros são passados quando você constrói a classe(instância ela).

<?php
class BaseClass 
{
    public function __construct($eu) 
    {
        print "Chamou o construtor e meu nome é ".$eu."\n";
    }
}
$obj = new BaseClass("Felipe");
?>

E o destrutivo faz exatamente o contrario. Ele é rodado quando a classe é fechada ou quando todos as referencias de um objeto particular for removido.

<?php
class ClasseSuicida 
{
    private nome;
 
    public function __construct()
    {
        print "Construindo\n";
        $this->nome = "ClasseSuicida";
    }
 
    public function __destruct() 
    {
        print "Destruindo " . $this->nome . "\n";
    }
}
 
$obj = new ClasseSuicida();
?>

Aê galera... Eu aqui comentei algo sobre a orientação a objeto. É claro que abrange muito mais coisas mas aqui eu citei o básico e o que vocês tem que aprender para começar a mexer com isso.

Comentem aê e postem dúvidas! Abraços

]]>
http://felipetonello.com/blog/2006/05/15/php-entendendo-o-php5/feed/ 32
Escreva com fotos http://felipetonello.com/blog/2006/02/16/escreva-com-fotos/ http://felipetonello.com/blog/2006/02/16/escreva-com-fotos/#comments Thu, 16 Feb 2006 04:50:25 +0000 Felipe Tonello http://felipetonello.com/blog/2006/02/16/escreva-com-fotos/ Esse site usa as fotos do sistema do flickr e cria palavras com fotos automáticas pelo flickr mesmo... Bem legal.. :D

FNOLA alphabet ELIPE 015 TOIMG_0410aeDSC00056Lo

]]>
http://felipetonello.com/blog/2006/02/16/escreva-com-fotos/feed/ 2
Bonito de se ver! (edição especial) http://felipetonello.com/blog/2006/02/11/bonito-de-se-ver-edicao-especial/ http://felipetonello.com/blog/2006/02/11/bonito-de-se-ver-edicao-especial/#comments Sat, 11 Feb 2006 14:07:19 +0000 Felipe Tonello http://felipetonello.com/blog/2006/02/11/bonito-de-se-ver-edicao-especial/ Nem é um plágio né?! mas tudo bem rsrs
Essa é uma edição especial pois estou publicando um site que demorei um bucado para fazer e finalmente está pronto.

Depois de árduas lutas contra o IE consegui fazer com que o layout ficasse correto em todos os browser hehehe seguidos os padrões de web, o mais importante.

Esse foi o meu primeiro trabalho grande mesmo com respeito a layouts e padrões de web e aprendi muito e pretendo fazer mais sites adiante e melhorar cada vez mais.

Contei com uma boa ajuda do Douglas que me auxiliou no código server-side com PHP.

TribotecTeam.com

Vou aproveitar esse post que estou fazendo e já explicar pra que serve esse site.

Para começar a com uma breve explicação do que é FIRST:

FIRST é uma competição de robótica internacional que é realizada principalmente nos USA (FIRST ROBOTIC COMETITION). O brasil tem 5 times que participa nessa competição e um desses é o qual eu faço parte, o tribotec team(#1382). Esse site é o site oficial da nossa equipe onde temos notícias relacionada a FIRST e ao time, etc.. falando sobre a cometição,etc..

Espero que vocês gostem do site: www.tribotecteam.com

]]>
http://felipetonello.com/blog/2006/02/11/bonito-de-se-ver-edicao-especial/feed/ 2