|
|
Se esta página lhe ajudar, considere fazer uma doação |
Este tutorial considera que você já tem prévio conhecimento de HTML, PHP e MySQL. Caso não tenha, dê uma olhada nos papiros: HTML básico, Formulários HTML, Tutorial PHP e Tutorial MySQL.
Como chamar um script PHP a partir de um formulário HTML
Para chamar um script PHP a partir de um arquivo HTML você deve configurar a opção action da tag form como sendo o nome do script PHP a ser chamado.
Por exemplo, digamos que você tem um arquivo chamado "pesquisa.html" o qual exibe um formulário onde o usuário digita algumas opções de pesquisa e depois clica num botão para procurar. Quando o usuário clicar neste botão, você quer que o script "resultado .php" seja chamado.
Para conseguir isto, seu código do arquivo "pesquisa.html" deve ter um trecho semelhante a:
..... <form action="resultado.php" method="post"> ..... ..... ..... <input type="submit" value="Procurar"> </form> ..... |
Assim, quando o usuário clicar no botão "Procurar" o script "resultado.php" será chamado.
Capturando as variáveis de formulário enviadas
Para capturar as variáveis enviadas pelo arquivo chamador use a sintaxe:
$HTTP_POST_VARS['variavel']; |
Assim, se o formulário do nosso arquivo "pesquisa.html" tiver uma caixa de texto como,
..... <form action="resultado.php" method="post"> ..... <input name="termodapesquisa" type="text"><br><br> ..... <input type="submit" value="Procurar"> </form> ..... |
,você poderá usar a variável "termodapesquisa" no arquivo "resultado.php" referindo-se a ela como:
<?php $HTTP_POST_VARS['termodapesquisa']; ?> |
Caso queira usar um nome menor para esta variável, você pode atribuir seu valor a outra variável com um nome mais prático:
$termo = $HTTP_POST_VARS['termodapesquisa']; |
Tratando os dados digitados pelo usuário
É uma boa prática tratar os dados digitados pelo usuário antes de acessar o banco de dados MySQL com estes dados.
Primeiro você deve verificar se realmente os dados necessários foram digitados. Para isto você poderia usar algo do tipo:
<?php
$tipo = $HTTP_POST_VARS['tipodapesquisa'];
$termo = $HTTP_POST_VARS['termodapesquisa'];
if(!$tipo || !$termo){
echo "<p><font color=red>Você não entrou com os dados necessários.
Volte a página anterior e tente novamente</font></p>";
exit;
}
?>
|
Depois é interessante suprimir os espaços em branco colocados no início ou no final de strings digitadas em caixas de texto. Para isto use a função trim():
$termo = trim($termo); |
Esta função retira os espaços em branco do início e do final de uma string. Seu protótipo é:
string trim ( string str [, string charlist] ) |
Nota: O parâmetro opcional charlist foi adicionado no PHP 4.1.0
Esta função retorna uma string com os espaços retirados do ínicio e do final de str. Sem o segundo parâmetro, trim() irá retirar os seguintes caracteres:
- " " (ASCII 32 (0x20)), um espaço normal;
- "\t" (ASCII 9 (0x09)), uma tabulação;
- "\n" (ASCII 10 (0x0A)), uma linha nova (line feed);
- "\r" (ASCII 13 (0x0D)), um retono de carro;
- "\0" (ASCII 0 (0x00)), o byte NULL;
- "\x0B" (ASCII 11 (0x0B)), uma tabulação vertical.
Você também pode especificar quais caracteres você quer retirar, através do parâmetro charlist. Simplesmente liste todos os caracteres que você quer retirar. Com .. você pode especificar um intervalo de caracteres, como por exemplo:
$textolimpo = trim($texto,"\0x00..\0x1F") |
Da mesma maneira que usamos trim(), é uma boa prática usar addslashes() nos dados digitados pelo usuário antes de enviar os dados para o MySQL. Esta função adiciona o caracter de barra invertida antes dos caracteres que precisam ser escapados (aspas simples, aspas duplas, barra invertida e o caractere NULL). Exemplo:
$tipo = addslashes($tipo); $termo = addslashes($termo); |
Agora que tratamos os dados digitados pelo usuário estamos prontos para acessar o banco de dados MySQL
Conectando-se ao servidor MySQL
Para conectar-se ao banco de dados MySQL usamos a função mysql_pconnect(), cujo protótipo é:
resource mysql_pconnect ([string server[,string username[,string password[,int client_flags]]]]) |
mysql_pconnect() abre uma conexão persistente com um servidor MySQL. Em caso de sucesso, ela retorna um identificador de link persistente, caso contrário ela retorna FALSE.
Os seguintes padrões são assumidos para os parametros opcionais que estiverem faltando: server = 'localhost:3306', username = nome do usuário que for dono do processo PHP e password = password vazio. O parametro client_flags pode ser uma combinação das constantes MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE ou MYSQL_CLIENT_INTERACTIVE.
O parametro server pode também incluir um numero de porta. Ex: "hostname:port" ou um caminho para um socket ex: ":/path/to/socket" para o localhost.
Nota: O suporte a ":port" foi adicionado em 3.0B4; e o suporte a ":/path/to/socket" foi adicionado em 3.0.10.
mysql_pconnect() trabalha muito parecido com mysql_connect() com duas maiores diferenças.
- Primeira,ao conectar, a função primeiro irá tentar encontrar um conexão persistente que já esteja aberta com o mesmo servidor, nome de usuário e senha. Se uma é encontrada, um identificador para ela será retornada ao invés de abrir uma nova conexão.
- Segundo, a conexão com o servidor SQL não será fechada quando termina a execução do script. Ao invés, a conexão continuará aberta para uso futuro(mysql_close() não irá fechar conexões abertas por mysql_pconnect()).
O parametro opcional client_flags tornou-se disponivel no PHP 4.3.0.
Este tipo de conexão é portanto chamada 'persistente'.
Nota: Note que este tipo de conexão funciona somente se você esta usando o PHP como módulo.
Atenção: Usar conexões persistentes pode requerer alguns ajustes na sua configuração do Apache e MySQL para assegurar que você não ultrapasse o limite de conexões permitidos pelo MySQL.
Exemplo do uso de mysql_pconnect():
@$db = mysql_pconnect(localhost,'papirosadmin','admin'); |
É sempre bom verificar se a conexão foi aberta com sucesso:
if(!$db){
echo "Erro: Não foi feita a conexão com o banco de dados.
Tente novamente.";
}
|
Selecionando um banco de dados
Para selecionar um banco de dados, após termos aberto uma conexão com o servidor MySQL, usamos a função mysql_select_db(), cujo protótipo é:
bool mysql_select_db ( string database_name [, resource link_identifier] ) |
Ela retorna TRUE em caso de sucesso ou FALSE em caso de falha.
mysql_select_db() define o banco de dados ativo no servidor que é associado ao identificador de conexão(link_identifier) especificado. Se nenhum identificador de conexão for especificado, a última conexão aberta é assumida. Se nenhuma conexão está aberta, a função irá tentar abrir uma conexão como se mysql_connect() fosse chamada sem argumentos e usá-la.
Todas as próximas chamadas a mysql_query() serão feitas no banco de dados aberto.
Exemplo do uso de mysql_select_db():
mysql_select_db('papiros');
|
Executando uma consulta
Para executar uma consulta ao banco de dados aberto, usamos a função mysql_query(). Seu protótipo é:
resource mysql_query ( string query [, resource link_identifier] ) |
mysql_query() envia uma query para o banco de dados ativo no servidor da conexão informada em link_identifier. Se o parâmetro link_identifier não é especificado, a última conexão aberta é usada. Se nenhuma conexão está aberta, a função tenta estabelecer uma conexão com mysql_connect() sendo chamada sem argumentos. O resultado é guardado em buffer.
Nota: A string da query não deve terminar com ponto e virgula(;).
Somente para os comandos SELECT, SHOW, EXPLAIN ou DESCRIBE mysql_query() retorna um identificador de recurso ou FALSE se a query não foi executada corretamente. Para outros tipos de comandos SQL, mysql_query() retorna TRUE em caso de sucesso ou FALSE em caso de erro. Um valor não FALSE indica que a query foi legal e pode ser executada pelo servidor. Não indica nada sobre o número de linhas afetadas ou retornadas. É perfeitamente possível para uma query ser bem sucedida, mas não afetar ou retornar linhas.
mysql_query() também irá falhar e retornar FALSE se o usuário não tiver permissão para acessar a tabela(s) referida(s) pela query.
Assumindo que a query seja bem sucedida, você pode chamar mysql_num_rows() para achar quantas linhas foram retornadas por um comando SELECT ou mysql_affected_rows() para verificar quantas linhas foram afetadas por um comando DELETE, INSERT, REPLACE, ou UPDATE.
Somente para os comandos SELECT,SHOW,DESCRIBE ou EXPLAIN, mysql_query() retorna um novo identificador de resultado que você pode passar para mysql_fetch_array() e outras funções que lidam com resultados de consultas.
Exemplo do uso de mysql_query():
$query = 'SELECT * FROM livros WHERE '.$tipo.' LIKE "%'.$termo.'%"'; $consulta = mysql_query($query); |
Processando os dados da consulta
Após executar uma consulta com sucesso, você terá que preparar os dados para serem exibidos. Este processamento consiste basicamente de verificar o número de linhas retornado pela consulta e, com ajuda de um laço for e algumas funções PHP para manipulação de resultados de consultas, exibir o resultado.
Para verificar o número de linhas retornado pela consulta usamos mysql_num_rows(), no caso de uma consulta SELECT:
int mysql_num_rows ( resource result ) |
ou mysql_affected_rows(), no caso de consultas INSERT, UPDATE ou DELETE:
int mysql_affected_rows ( [resource link_identifier] ) |
Observe que para mysql_num_rows() temos que passar o resultado de mysql_query() como argumento, mas para mysql_affected_rows() não precisamos passar nenhum argumento, pois se o identificador de link não é especificado, o ultimo link aberto por mysql_connect() é utilizado.
Com relação a mysql_affected_rows() ainda temos duas observações:
- Se a última query foi um DELETE sem a cláusula WHERE, todos os registros foram apagados da tabela, mas esta função retornará zero.
- Quando usando UPDATE, o MySQL não atualizará as colunas onde o novo valor é o mesmo que o valor anterior. Isto cria a possibilidade de que o valor retornado por mysql_affected_rows() não seja atualmente igual ao número de linhas encontradas, e sim igual ao número de linhas que literalmente foram afetadas pela query.
Exemplo do uso de mysql_num_rows():
$query = 'SELECT * FROM livros WHERE '.$tipo.' LIKE "%'.$termo.'%"'; $consulta = mysql_query($query); $linhas = mysql_num_rows($consulta); |
Quanto as funções que tratam resultados de consulta temos:
mysql_fetch_array() mysql_fetch_row() mysql_fetch_object() mysql_result() |
mysql_fecth_array() pega cada linha do resultado da consulta e a formata como um array associativo, sendo cada nome de campo do registro uma chave do array e o valor do campo sendo o valor do array. Assim, poderemos referenciar os campos retornados pela consulta com algo semelhante a
array['campo'] |
para exibir o valor do campo. Exemplo:
for($n = 0; $n < $linhas; $n++){
$registro = mysql_fetch_array($consulta);
echo '<p>'.($n+1).'.';
echo 'Título :'.htmlspecialchars(stripslashes($registro['titulo'])).'<br>';
echo 'Autor :'.stripslashes($registro['autor']).''<br>';
echo 'ISBN :'.stripslashes($registro['isbn']).''<br>';
echo 'Preço :'.stripslashes($registro['preco']).''<br>';
}
|
Neste exemplo $registro é nosso array associativo que recebeu a linha da consulta. Observe o laço for para iterar sobre as linhas da consulta e veja que usamos o resultado de mysql_num_rows(). Observe também o uso das funções htmlspecialchars() e stripslashes().
stripslashes() retira as barras invertidas da string (lembra que ao inserir strings no banco de dados usamos addslashes() para adicionar as barras invertidas ???) e htmlspecialchars() converte alguns caracteres especiais na formatação HTML correta, como o "e" comercial, os sinais de maior que, menor que, etc. Isto normalmente é necessário para exibição destes caracteres em páginas web.
mysql_fetch_row() pega o resultado da consulta e retorna a linha como uma matriz numérica. Exemplo:
for($n = 0; $n < $linhas; $n++){
$registro = mysql_fetch_row($consulta);
echo '<p>'.($n+1).'.';
echo 'Título :'.htmlspecialchars(stripslashes($registro[2])).'<br>';
echo 'Autor :'.stripslashes($registro[1]).''<br>';
echo 'ISBN :'.stripslashes($registro[0]).''<br>';
echo 'Preço :'.stripslashes($registro[3]).''<br>';
}
|
Observe que os índices do array depedem de como os campos estão organizados no banco de dados, por isso não estão sendo exibidos sequencialmente (isbn é o primeiro campo por isso tem índice zero, autor é o segundo campo por isso tem índice um, e assim por diante).
mysql_fetch_object() retorna a linha como um objeto. Nosso exemplo ficaria assim:
for($n = 0; $n < $linhas; $n++){
$registro = mysql_fetch_object($consulta);
echo '<p>'.($n+1).'.';
echo 'Título :'.htmlspecialchars(stripslashes($registro->titulo).'<br>';
echo 'Autor :'.stripslashes($registro->autor).''<br>';
echo 'ISBN :'.stripslashes($registro->isbn).''<br>';
echo 'Preço :'.stripslashes($registro->preco).''<br>';
}
|
Você deve ter observado que estas três funções são muito semelhantes. Você pode usar qualquer uma delas para processar a linha retornada pela consulta pois sua performance é praticamente igual.
Todas elas retornam FALSE quando não houverem mais linhas.
mysql_result() utiliza outra abordagem. Ela retorna um campo por vez. Seu protótipo é:
mixed mysql_result ( resource result, int row [, mixed field] ) |
O argumento field(campo) pode ser o índice do campo, o nome do campo, ou tabela.campo. Se o nome da coluna usa apelido ('select foo as bar from...'), use o apelido ao invés do nome da coluna.
Esta função é muito mais lenta que as três descritas anteriormente, assim deve ser evitada.
Exemplo:
for($n = 0; $n < $linhas; $n++){
$registro = mysql_fetch_result($consulta);
echo '<p>'.($n+1).'.';
echo 'Título :'.htmlspecialchars(stripslashes($registro,$n,'titulo').'<br>';
echo 'Autor :'.stripslashes($registro,$n,'autor').''<br>';
echo 'ISBN :'.stripslashes($registro,$n,'isbn').''<br>';
echo 'Preço :'.stripslashes($registro,$n,'preco').''<br>';
}
|
Exemplos: pesquisa.html e resultado.php
Abaixo temos os códigos de dois arquivos exemplo. pesquisa.html é o formulário para pesquisa na tabela livros do banco de dados papiros e resultado.php é o script chamado pelo formulário. Este script faz a consulta no banco de dados e exibe o resultado. Nestes dois exemplos você pode ver tudo que foi explicado nas seções anteriores.
pesquisa.html
<html> <head><title>Papiros - Pesquisa</title></head> <body bgcolor="Silver" > <h1>Papiros - Pesquisa</h1> <form action="resultado.php" method="post"> Escolha o tipo da pesquisa: <select name="tipodapesquisa"> <option value="autor">Autor</option> <option value="titulo">Título</option> <option value="isbn">ISBN</option> </select> <br><br> Digite o termo a ser procurado: <input name="termodapesquisa" type="text"><br><br> <input type="submit" value="Procurar"> </form> </body> </html> |
resultado.php
<html>
<head><TITLE>Papiros - Resultado</TITLE></head>
<body>
<h1>Papiros - Resultado</h1>
<?php
$tipo = $HTTP_POST_VARS['tipodapesquisa'];
$termo = $HTTP_POST_VARS['termodapesquisa'];
if(!$tipo || !$termo){
echo "<p><font color=red>Você não entrou com os dados necessários.
Volte a página anterior e tente novamente</font</p>";
exit;
}
$termo = trim($termo);
$tipo = addslashes($tipo);
$termo = addslashes($termo);
@$db = mysql_pconnect(localhost,'papirosadmin','admin');
if(!$db){
echo "Erro: Não foi feita a conexão com o banco de dados.
Tente novamente.";
}
mysql_select_db('papiros');
$query = 'SELECT * FROM livros WHERE '.$tipo.' LIKE "%'.$termo.'%"';
$consulta = mysql_query($query);
$linhas = mysql_num_rows($consulta);
echo '<p>Número de livros encontrado: '.$linhas.'</p>';
for($n = 0; $n < $linhas; $n++){
$registro = mysql_fetch_array($consulta);
echo '<p>'.($n+1).'.';
echo 'Título :'.htmlspecialchars(stripslashes($registro['titulo'])).'<br>';
echo 'Autor :'.stripslashes($registro['autor']).'<br>';
echo 'ISBN :'.stripslashes($registro['isbn']).'<br>';
echo 'Preço :'.stripslashes($registro['preco']).'<br>';
}
?>
</body>
</html>
|
Inserindo dados
Para inserir dados no banco, basta configurar a consulta como uma INSERT. O resto é igual a consultar o banco de dados. Não esqueça que ao inserir strings você deve usar addslahes() para adicionar a barra invertida quando for o caso.
Abaixo temos o código de dois arquivos: entrada.html que é o formulário para entrada de novo livro em nosso banco de dados papiros e cadastra.php que é o script PHP que insere o novo registro no banco de dados.
entrada.html
<html> <head><title>Papiros - Cadastro de novo livro</title></head> <body bgcolor="Silver" > <h1>Papiros - Cadastro de novo livro</h1> <form action="cadastra.php" method="post"> ISBN: <input name="isbn" type="text"><br><br> Autor: <input name="autor" type="text"><br><br> Título: <input name="titulo" type="text"><br><br> Preço: <input name="preco" type="text"><br><br> <input type="submit" value=" Ok "> <input type="reset" value=" Limpar "> </form> </body> </html> |
cadastra.php
<html>
<head><title>Papiros - Inserindo novo livro</title></head>
<body>
<h1>Papiros - Inserindo novo livro</h1>
<?php
$isbn = $HTTP_POST_VARS['isbn'];
$autor = $HTTP_POST_VARS['autor'];
$titulo = $HTTP_POST_VARS['titulo'];
$preco = $HTTP_POST_VARS['preco'];
$isbn = trim($isbn);
$autor = trim($autor);
$titulo = trim($titulo);
$preco = trim($preco);
if(!$isbn || !$autor || !$titulo || !$preco){
echo "<p><font color=red>Você não entrou com os dados necessários.
Volte a página anterior e tente novamente</font</p>";
exit;
}
$isbn = addslashes($isbn);
$autor = addslashes($autor);
$titulo = addslashes($titulo);
if(!is_numeric($preco)){
echo "<p><font color=red>O preço deve ser um valor númerico. Ex: 43.67.
Volte a página anterior e tente novamente</font></p>";
exit;
}
@$db = mysql_pconnect(localhost,'papirosadmin','admin');
if(!$db){
echo "Erro: Não foi feita a conexão com o banco de dados.
Tente novamente.";
}
mysql_select_db('papiros');
$query = 'INSERT INTO livros VALUES
("'.$isbn.'","'.$autor.'","'.$titulo.'","'.$preco.'")';
$consulta = mysql_query($query);
if($consulta){
echo "Livro inserido com sucesso.";
exit;
}
else{
echo "Erro ao inserir livro.";
exit;
}
|
A única observação aqui é o uso da função is_numeric(). Ela checa se a variável é um número ou uma string numérica. Neste caso ela está sendo usada para verificar se o usuário digitou o preço corretamente.
|
|
Se esta página lhe ajudou, considere fazer uma doação |