Manipulação básica de um banco de dados MySQL com PHP

Em relação a manipulação de um banco de dados MySQL com PHP, precisamos entender que o PHP não é o único responsável pelas ações em relação ao seu banco de dados. Tudo que o PHP faz é enviar uma string de consulta ao banco de dados e o banco de dados que executa a consulta.

O emprego do PHP é relacionado a construção da string de consulta que até o final do tutorial chamarei de querystring. Essa construção pode ser feita de forma estática ou dinâmica, onde deve entender estático como algo que não sofre mudanças e dinâmica algo que pode mudar, ou seja, algum situação condicional onde o seu valor poder ser uma coisa ou outra dependendo de uma ação qualquer do usuário.

Vamos entender melhor isso…

Uma string de consulta estática seria algo parecido com isto:

SELECT nome FROM usuarios WHERE id = 1

Você define de forma direta e incondicional que o que deseja é ‘preto no branco‘, ou seja, deseja selecionar do banco de dados o nome dentro da tabela usuarios cujo o id de registro seja 1.
Perceba que a consulta é invariável, quando executado essa requisição, não há como mudar os valores de id, nem a tabela e nem o campo que desejamos consultar, é isso e não tem ‘bla bla bla’, mas poderia ser diferente, por exemplo, se você usar variáveis no lugar dos valores definidos na consulta, aí teríamos o que chamamos de uma construção dinâmica da querystring.

Veja abaixo um exemplo de querystring dinâmica:

SELECT nome FROM usuarios WHERE id =$id

Usando variáveis é uma das formas mais básicas de construção dinâmica de uma querystring. Você pode usar variáveis também no lugar do nome dos campos (colunas), tabelas ou mesmo utilizar condições para dinamicamente adicionar partes para sua querystring.
Veja bem… sua querystring é apenas isso – uma string – assim você pode usar qualquer técnica de manipulação de string, desde que o resultado final produza uma consulta válida em seu banco de dados.

Nos exemplos do tutorial vamos executar consultas de banco de dados usando métodos simples e básicos na construção das querystrings e claro, vamos nos deter a forma dinâmica.

Nota: Quer deixar claro que naturalmente há um milhão e uma maneiras de fazer a mesma coisa, mas a intenção é esclarecer e não complicar o entendimento, portanto vamos fazer de forma bem básica.

Criando uma tabela MySQL

Como já mencionei antes, quero novamente deixar claro que a intenção deste e da maioria dos tutoriais postados no site, é ajudar, dar uma luz,  e não a de apresentar códigos complexos, super eficientes e tals, portanto entenda que aprimorações, tratamento dos dados entre outros procedimentos mais avançados, incluindo padrões de escrita  dos códigos, você deverá aplicar por conta própria e de acordo com que avança nos teus conhecimentos, sendo assim saiba que aqui encontrará vontade de ajudar, mas focando o básico, o início… salvo quando houver um tutorial justamente focando em ensinar sobre segurança, eficiência, etc.

Continuando…

Como puderam perceber vamos utilizar MySQL como banco de dados, e para começar precisamos de um local para armazenar nossos registros, pois não adianta ter um banco de dados disponível, mas não ter um local preparado dentro deste banco de dados para armazenar os dados, este local chamamos de tabela.

Veja o código abaixo para criação da tabela e depois a explicação:

CREATE TABLE `info` (
`id` INT( 6 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nome` VARCHAR( 20 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;

A primeira missão é criar esta tabela que como podem ver no código estamos chamando de  info e nesta tabela definimos dois campos (colunas) para armazenar os dados referentes à eles.

Um campo chamamos id que armazenará um código de identificação única para o registro, ou melhor, a cada registro efetuado este assumirá o seu id único e para que isso ocorra definimos esse campo (coluna) com o tipo  int(6), ou seja, aceita uma quantidade X de registros, onde o número X não poderá ser um inteiro maior que 999.999. O campo id ainda foi definido como auto_increment ( a cada registro ele incrementa automaticamente +1 para o valor de id do novo registro e de forma crescente), poderá ver no exemplo que também definimos id como PRIMARY KEY, porém em uma outra oportunidade falarei mais sobre esses detalhes.

Além de id também vamos criar o campo nome do tipo varchar(20), ou seja, aceitará registrar nesse campo valores com até 20 caracteres e não definimo outras opções para esse campo.

Observação: Utilizei e costumo utilizar sempre em minhas aplicações com banco de dados o CHARSET utf8 e COLLATE utf8_unicode_ci e igualmente utilizo no cabeçalho de meus arquivos de saída html o charset utf8, sendo assim se você tiver alguma dificuldade com caracteres estranhos sendo gerados, faça um comentário e veremos juntos o que pode estar ocorrendo com o seu caso.

Para sua comodidade utilize o phpMyAdmin, copie o código da tabela postado mais acima, acesse o phpMyAdmin e escolha o banco de dados que deseja usar caso houver mais de um, depois clique no link SQL localizado no menu horizontal, cole e execute esta instrução acima.

Se agora você está coçando a cabeça e não sabe nada do que estou falando com esse tal de phpMyAdmin, realmente esse tutorial ainda não é pra você.

Sugestão: Busque material no Google sobre como instalar em seu servidor local o gerenciador phpMyAdmin, faça-o e depois volte.

Caso estiver utilizando servidor remoto (hospedagem), verifique com o mesmo se há o phpMyAdmin disponível para sua conta e assim sua busca pode basear-se apenas em como utilizar o phpMyAdmin, as vezes o próprio servidor de hospedagem fornece material de auxílio para o gerenciamento do phpMyAdmin, apesar que os comando básicos são bem simples. Fico devendo um tutorial básico sobre o phpMyAdmin para os próximos dias.

O PHP para manipular o MySQL

Ok, ok! Agora fique longe do Google e vamos continuar.  = )

Com os códigos a seguir iremos manipular o banco de dados MySQL, mais precisamente a tabela info, onde lidaremos com os registros armazenados nela. Veremos formas para adicionar um registro (INSERT), excluir (DELETE), organizar os resultados da consulta baseado em um campo específico (ORDER BY) de forma dinâmica.

Observação: Em relação a modificar/editar (UPDATE) os registros, veremos separadamente ao final desta sequência para assim não embolar o meio de campo… pois requer  alguns detalhes a parte.

Pra ficar simples o entendimento vamos dividir essa bateria de  códigos em duas partes:

1ª Parte – Conectando com o banco de dados MySQL e manipulando os registros
2ª Parte – Exibição dos dados e criação dinâmica das querystrings para manipula-los.

/******************************************************************
1ª Conectando com o banco de dados MySQL e manipulando os registros
******************************************************************/

// conectando com o bd

/* Logo abaixo substitua pelo seu usuário,
 pela sua senha e pelo seu nome de banco de dados */

define('BD_USER', 'USUÁRIO-DO-BD');
define('BD_PASS', 'SENHA-DO-BD');
define('BD_NAME', 'NOME-DO-BD');

$conn = mysql_connect('localhost', BD_USER, BD_PASS);
mysql_select_db(BD_NAME, $conn);

/* Agora vamos criar a parte que recebe os dados vindos de um formulário ou URL,
 formar as querystrings necessárias e manipular os registros no banco de dados */

// INSERT: adiciona dados no BD

if (isset($_POST['nome'])) // Se de fato $_POST['nome'] está definido
{

 // Fazendo um pequeno tratamento da entrada para ajudar na segurança.
 $nome = mysql_real_escape_string($_POST['nome']);

 // Nota: Procure informações sobre mysql_real_scape_string()

 // Inserindo o novo registro na tabela
 $sql_INSERT = "INSERT INTO info (nome) VALUES ('".$nome."')";
 $query = mysql_query($sql_INSERT, $conn) or die(mysql_error());

 /* Nota: Durante as fazes de desenvolvimento, sempre use mysql_error()
 desta forma facilita o controle de erros quando existem, mas ao publicar
 o conteúdo, desabilite para não expor aos usuários. */

} // final do INSERT

if (isset($_GET['nome']))
{

 // DELETE: Excluindo um registro no BD

 // pequeno cuidado com segurança
 $nome = mysql_real_escape_string($_GET['nome']);

 // excluindo um registro na tabela do bd
 $sql_DELETE = "DELETE FROM info WHERE nome = '".$nome."'";
 $query = mysql_query($sql_DELETE, $conn) or die(mysql_error());

} // final do DELETE

/* Final da 1ª parte */

/******************************************************************
2ª Parte: Exibição dos dados e criação dinâmica das querystrings para manipula-los.

             OBSERVAÇÃO: Em relação à editar o registro,
             veremos separadamente na sequência deste tutorial
******************************************************************/

// Listando e organizando os registros consultados

// ORDERBY: Ordenando a lista de resultados baseado em um campo/coluna da tabela

if (isset($_GET['orderby']))
{

 // fazendo um array com os critérios/campos permitidos para ordenar a listagem
 $permitidos = array('id','nome');

 // pequeno tratamento de segurança dos dados
 $order = mysql_real_escape_string($_GET['orderby']);

 /* É um campo válido, ordenará pelo crit´rio solicitado,
 do contrário o padrão será id */

 $order = (in_array($order, $permitidos)) ? $order : "id";

 /* Se não for escolhido nenhum critério para ordem
 da listagem, o padrão será o id */

}
else
{

 $order = "id";

} // Final da codificação da manipulação do valor à ser utilizado em ORDERBY
 // Veremos a utilização de ORDERBY a seguir, juntamente com SELECT

// SELECT: Consultando e listando os registros cadastrados no BD

$sql = "SELECT id, nome FROM info ORDER BY ".$order."";
$query = mysql_query($sql, $conn) or die(mysql_error());

// Estrutura para a exibição dos campos(colunas), e valores registrados no banco de dados

echo "<form action =\"".$_SERVER['PHP_SELF']."\" method =\"post\">

<table style=\"border:1px solid #333;\">

 <tr>
 <td style=\"background-color:#ebebeb;\"><a href = \"".$_SERVER['PHP_SELF']."?orderby=id\">id</a></td>
 <td style=\"background-color:#ebebeb;\"><a href = \"".$_SERVER['PHP_SELF']."?orderby=nome\">nome</a></td>
 <td style=\"background-color:#ebebeb;\">Excluir</td>
 </tr>";

 // loop para listar os registros resultados do SELECT que fizemos anteriormente 

 while ($array = mysql_fetch_assoc($query))
 {

 echo "<tr>
 <td style=\"background-color:#ebebeb;\">".$array[id]."</td>
 <td style=\"background-color:#ebebeb;\">".$array['nome']."</td>
 <td style=\"background-color:#ebebeb;\">
     <a href = \"".$_SERVER['PHP_SELF']."?nome=".$array['nome']."\">delete</a>
 </td>
 </tr>";

 } // final do loop while

// Caixas de texto para adicionar novo nome

echo "<tr>
 <td bgcolor = \"gray\"></td>
 <td><input type = \"text\" name = \"nome\"></td>
 <td bgcolor = \"gray\"></td>
 </tr>
 <tr>
 <td style=\"background-color:#ebebeb;\"></td>
 <td style=\"background-color:#ebebeb; text-align:center;\">
     <input type = \"submit\" name=\"inserir\" value = \"Inserir nome\">
 </td>
 <td style=\"background-color:#ebebeb;\"></td>
 </tr>

</table>
</form>";

/*
Final da 2ª Parte
*/

?>

Apesar de estar bem comentado, vamos analisar cada trecho destes códigos acima.

Observação: Qualquer marcação html ou css inline nas tags html são para mera exibição dos dados de forma mais organizada, pode fazer igual os exemplos ou usar sua criatividade caso tenha intimidade com html e css ou ainda outras ferramentas de saída.

Continuando…

A 1ª parte do código mais acima irá tratar de toda a interação com o banco de dados. Coloquei em primeiro lugar pois queremos que todas as interações sejam refletidas na listagem de dados logo em seguida  do clique no botão enviar do formulário ou pelo clique no link excluir quando a página é exibida novamente. Quanto ao formulário e link de excluir veremos na 2ª parte.

Conectando com o banco de dados MySQL

Para fazer qualquer coisa com PHP  em relação ao banco de dados a primeira coisa é estabelecer uma conexão com o banco de dados MySQL.

// conectando com o bd

/* Logo abaixo substitua pelo seu usuário,
 pela sua senha e pelo seu nome de banco de dados */

define('BD_USER', 'USUÁRIO-DO-BD');
define('BD_PASS', 'SENHA-DO-BD');
define('BD_NAME', 'NOME-DO-BD');

$conn = mysql_connect('localhost', BD_USER, BD_PASS);
mysql_select_db(BD_NAME, $conn);

Ns três primeiras linhas definimos usuário, senha e nome do banco de dados como valores das constantes BD_USER, BD_PASS, BD_NAME e serão as informações que utilizaremos para nos conectar e selecionar o banco de dados que vamos trabalhar.

A função mysql_connect() é a que nos conecta ao banco de dados. Leva três argumentos: o primeiro é o endereço do servidor MySQL que geralmente é localhost (verifique com seu host qual deve usar), o segundo é o usuário do banco de dados, e o terceiro é a senha para o banco de dados.

Normalmente, se você estiver executando o script em seu computador, ou seja, servidor local, basta colocar localhost e deve funcionar, qualquer coisa faça um comentário e veremos as possibilidades dos conflitos que ocorrer com você, se ocorrer.

Quanto ao mysql_select_db() já diz no nome, seleciona o banco de dados que deseja usar. Obviamente você selecionará o banco de dados o qual você usou para criar a tabela do início deste tutorial. Esta função requer um argumento: o nome do banco, porém ela aceita, opcionalmente, um segundo argumento, onde você pode especificar o fluxo de conexão. Eu gosto de especificar o fluxo de conexão.

A conexão com o banco dura o tempo que o script é executado. Você também pode dizer ao PHP para fechar a conexão com mysql_close($conn); se preferir, mas repito, o PHP fecha automaticamente a conexão depois que o script terminar a execução, então para ser honesto, eu não utilizo a função mysql_close ().

Continuando…

Trabalhando com INSERT do MySQL

Neste pedaço de código abaixo, vamos verificar se um nome foi enviado via formulário e se sim, vamos registra-lo no banco de dados adicionando-o na tabela info que criamos.

if (isset($_POST['nome'])) // Se de fato $_POST['nome'] está definido
{

 // Fazendo um pequeno tratamento da entrada para ajudar na segurança.
 $nome = mysql_real_escape_string($_POST['nome']);

 // Nota: Procure informações sobre mysql_real_scape_string()

 // Inserindo o novo registro na tabela
 $sql_INSERT = "INSERT INTO info (nome) VALUES ('".$nome."')";
 $query = mysql_query($sql_INSERT, $conn) or die(mysql_error());

 /* Nota: Durante as fazes de desenvolvimento, sempre use mysql_error()
 desta forma facilita o controle de erros quando existem, mas ao publicar
 o conteúdo, desabilite para não expor aos usuários. */

} // final do INSERT

Analisando o código acima percebemos que a primeira ação é uma verificação se o usuário enviou de fato um nome para poder seguir adiante dentro da condicional.

Se o nome foi enviado  nós usamos em seguida a função mysql_real_escape_string() como uma medida de segurança para evitar ataques de SQL Injection.

Dica: sugiro que leia mais sobre como evitar ataques de SQL Injection, visto que agora você está aprendendo a trabalhar com banco de dados.

A próxima coisa que fazemos é construir a nossa querystring. A string se parece como se você fosse registrar o nome diretamente em seu banco de dados como se fosse uma construção estática, exceto que o valor é atribuído através de uma variável com aspas ao redor.

Observação: Se você ainda não entendeu de onde está o formulário que envia esse nome, vai entender até o final deste tutorial, eu prometo.  = )

A última coisa que fazemos é enviar a querystring ao banco de dados e para isso utilizamos a função mysql_query(). Esta função exige apenas um argumento: a querystring. Você não precisa nem fazer separado da string por variáveis como vimos nos  códigos acima, você pode fazer diretamente assim como no exemplo abaixo:

$sql = mysql_query("INSERT INTO tabela ...

Eu particularmente gosto de manter a string separada do mysql_query porque é mais fácil de depurar se as coisas correrem mal.

Como ocorre com muitas funções relacionadas com banco de dados, mysql_query() também aceita um segundo argumento opcional para especificar o fluxo de conexão.

Tecnicamente também não é necessário você atribuir mysql_query à uma variável, podendo fazer diretamente assim:

mysql_query("INSERT INTO tabela ...

Quando o PHP executa mysql_query, se o que você solicitou teve sucesso, ele retornará um valor booleano ‘true’ (representado por ‘1’), mas se nenhum dado for devolvido, ou seja, se a consulta falhar por algum motivo, um valor booleano ‘false’ (representada por ‘0’) será retornado.

Uma vez que você geralmente sempre irá querer saber como a consulta foi (imprimir a string para saber se as variáveis estão carregando o valor que desejamos que levem ou ainda a necessidade de saber se falhou ou não), você precisará atribuir mysql_query à uma variável.

Mais uma vez eu digo, tecnicamente não precisa ter esse “$query =” bastaria ir direto ao “mysql_query(string)”, mas é um hábito meu fazer utilizando variáveis e é assim que verá nesse tutorial até o fim.

Trabalhando com DELETE do MySQL

Neste bloco de código, vamos excluir um registro da tabela.

if (isset($_GET['nome']))
{

 // DELETE: Excluindo um registro no BD

 // pequeno cuidado com segurança
 $nome = mysql_real_escape_string($_GET['nome']);

 // excluindo um registro na tabela do bd
 $sql_DELETE = "DELETE FROM info WHERE nome = '".$nome."'";
 $query = mysql_query($sql_DELETE, $conn) or die(mysql_error());

} // final do DELETE

Você verá na sequência deste tutorial que o nosso formulário de envio de nomes foi configurado para exibir um link excluir ao lado de cada nome. Bastará clicar no link e o registro será excluído. Obviamente este link deverá passar o nome através da URL para pegarmos através do método GET, exatamente como podem ver nesse bloco de código acima, então a primeira coisa que fazemos é verificar se algum valor foi enviado pela URL, se isso proceder, vamos tratar a variável recebida com o já mencionado, mysql_real_escape_string().

Nós construiremos a querystring inserindo o nome na string utilizando a variável $nome, a qual tem como valor o que foi pego na URL com GET.

Em seguida enviamos a querystring para o banco de dados executar a ação DELETE em relação ao registro correspondente ao valor da variável $nome e este será excluído permanentemente.

A partir de agora falaremos da 2ª parte do código.

Trabalhando com o ORDER BY do MySQL

Agora iremos decidir e manipular a ordem que os dados são exibidos na página baseando-se pelos campos id ou nome da tabela info.

// ORDERBY: Ordenando a lista de resultados baseado em um campo/coluna da tabela

if (isset($_GET['orderby']))
{

 // fazendo um array com os critérios/campos permitidos para ordenar a listagem
 $permitidos = array('id','nome');

 // pequeno tratamento de segurança dos dados
 $order = mysql_real_escape_string($_GET['orderby']);

 /* É um campo válido, ordenará pelo critério solicitado,
 do contrário o padrão será id */

 $order = (in_array($order, $permitidos)) ? $order : "id";

 /* Se não for escolhido nenhum critério para ordem
 da listagem, o padrão será o id */

}
else
{

 $order = "id";

} // Final da codificação da manipulação do valor à ser utilizado em ORDERBY

Ao exibir a lista de nomes cadastrados, nós podemos fazer os títulos das colunas html em formato de links. O usuário pode clicar sobre o título da coluna para reordenar a lista de acordo com esse título.
Da mesma forma que passamos pela URL o parâmetro para excluir um registro podemos passar pela URL um parâmetro que possa nos ajudar a definir a forma que queremos ordenar nossa lista, usando o método GET novamente.

A primeira coisa que fazemos é verificar se essa variável existe e se isso acontecer …
Lembra quando falamos sobre a prevenção de SQL Injection? Outro método para restringir o que está sendo enviado para o seu banco de dados, é especificar o que é permitido. Isto é chamado: ‘lista branca’.

Se num array temos um, dois, três ou seja lá quantos valores colocarmos dentro, somente estes serão permitidos, fica entendido que todo resto não é. Fazer uma ‘lista branca’ geralmente é mais seguro do que fazer uma ‘lista negra’.

O nossa array de critérios (colunas) permitidas terá os elementos id e nome. Se no parâmetro ‘orderby’ enviado na URL tiver um valor nulo ou qualquer coisa diferente de id ou nome, vamos ter que atribuir uma ordenação padrão, onde no tutorial poderá ver que defini como padrão o campo id.

Observação: Uma vez que estamos fazendo uma lista branca de colunas permitidas, usar mysql_real_escape_string() seria tecnicamente inútil neste caso. Se alguém tentar usar aspas ou qualquer outras coisas que não estivessem em nosso array de permitidos, não teriam como prosseguir com sua má intenção. Realmente não temos uma razão lógica para usar mysql_real_escape_string(), o único motivo seria o psicológico rs*, me faz sentir mais seguro.

Continuando…

Utilizamos uma condicional ternária do PHP (operador ternário) junto da função in_array() e verificamos se o valor que está sendo passado para o script é uma coluna/campo que está no array dos permitidos, melhor dizendo, dentro da lista branca e se estiver ele ordena pelo parâmetro, senão ele ordena pelo padrão definido.

Entendendo melhor o operador ternário: A condição é avaliada dentro do parênteses… se for TRUE, atribui-se o que vem logo após o sinal ‘?’ ou se for FALSE, o que vem após o sinal ‘:’ e é nessa parte que podemos definir um padrão para quando enviarem valores falsos ou nulos.

A outra declaração que pode ver dentro do ELSE é para atribuir uma coluna padrão para quando não é solicitado nenhum tipo de ordenação, ou seja, aquela ordenação dos resultados que se dá quando acessamos os dados pela primeira vez ou quando não clicamos em nenhum link de coluna ou ainda quando escolhermos usar a opção excluir ou inserir e ao retornar para página a ordenação se da de forma padrão.

Trabalhando com o SELECT do MySQL

Esta é a forma à qual nós realmente vamos obter a informação da tabela para mostrar ao usuário. Nós temos esta query depois de outras querys, porque queremos que a atualização da informação na tabela e a re-exibição dos dados alterados se de logo após que o usuário fizer as alterações e somente depois liste novamente os dados com as alterações executadas.

// SELECT: Consultando e listando os registros cadastrados no BD

$sql = "SELECT id, nome FROM info ORDER BY ".$order."";
$query = mysql_query($sql, $conn) or die(mysql_error());

Basta uma query SELECT simples para obter o nosso conteúdo da tabela, lembrando que utilizamos a variável $order para listar o conteúdo de acordo com o clique ou caso não haja clique, $order assume o valor padrão definido, mas isso já mastigamos muito lá acima.

Então executaremos esta consulta da mesma forma que viemos fazendo com as outras execuções de consulta até o momento. A principal diferença entre este e todos os outros, é que desta vez vamos salvar os resultados em uma variável, para que possamos trabalhar com eles, como exibição e manipulação dos valores obtidos.

Listando tudo do banco de dados MySQL

Agora falaremos bastante sobre a exibição da informação para o usuário, bem como fornecer ao usuário meios para alterar essa informação com um formulário e através da URL enviando parâmetros. Está é a interface do usuário, por onde todas as nossos códigos anteriores obtém os dados de que necessita para fazer o que ele tem que fazer. Vamos construir uma tabela html para tabular as informações em um formato meia-boca, mas digno. = )

// Estrutura para a exibição dos campos(colunas), e valores registrados no banco de dados

echo "<form action =\"".$_SERVER['PHP_SELF']."\" method =\"post\">

<table style=\"border:1px solid #333;\">

 <tr>
 <td style=\"background-color:#ebebeb;\"><a href = \"".$_SERVER['PHP_SELF']."?orderby=id\">id</a></td>
 <td style=\"background-color:#ebebeb;\"><a href = \"".$_SERVER['PHP_SELF']."?orderby=nome\">nome</a></td>
 <td style=\"background-color:#ebebeb;\">Excluir</td>
 </tr>";

Neste pedaço de código, começamos com a nossa marcação html de abertura do formulário. A ação tem como action o mesmo arquivo que está o formulário e utilizamos o método POST. Em seguida, abrimos a nossa tabela html, e na primeira linha, temos os nomes das colunas. Tornamos os títulos das colunas como links para o usuário clicar e ordenar os resultados, conforme descrito no ORDER BY falado anteriormente. A última coluna da tabela html é rotulado de excluir porque essa é a nossa coluna com os links que vão apagar o registro respectivo na linha, enviando pela URL os parâmetros necessários para identificar qual registro a ser excluído.

Listando tudo do banco de dados MySQL – 2º bloco

// loop para listar os registros resultados do SELECT que fizemos anteriormente 

 while ($array = mysql_fetch_assoc($query))
 {

 echo "<tr>
 <td style=\"background-color:#ebebeb;\">".$array[id]."</td>
 <td style=\"background-color:#ebebeb;\">".$array['nome']."</td>
 <td style=\"background-color:#ebebeb;\">
     <a href = \"".$_SERVER['PHP_SELF']."?nome=".$array['nome']."\">excluir</a>
 </td>
 </tr>";

 } // final do loop while

Esta é a parte do nosso script onde listamos as informações atuais em nossa tabela de banco de dados. Lembra anteriormente que falamos sobre o SELECT, naquele momento nós selecionamos os dados, mas não exibimos, portanto é o que faremos agora.

Começamos com um loop while(). Por quê? Ok, anteriormente selecionamos todas as informações da tabela de banco de dados, e foi armazenado em $query. Essa informação é chamado de uma fonte de resultado. Pense na variável $query como um chapéu de mago. O PHP oferece diversas funções para que possamos chegar dentro de um chapéu e retirar o que precisamos. O que nós retiramos depende dessas funções que usamos.

Da mesma forma que o chapéu é a nossa lista de informações, há um coelho em algum lugar dentro do chapéu e ele tem essas informações, e quando conseguimos acessar dentro do chapéu, ele nos dá o que precisamos, uma linha de cada vez. Quando ele nos entrega essa linha, ele pega a próxima linha até não ter mais linhas para mostrar.

A linha que temos em mãos é armazenado em uma matriz/array. O tipo de matriz depende de qual a função que utilizamos. Nessse caso utilizei mysql_fetch_assoc() que retorna um array associativo (falarei sobre outras funções para retornar array com os dados consulados em banco de dados MySQL, como mysql_fetch_object(), mysql_fetch_array(), mysql_result(), mas em outra ocasião).  Como eu ia dizendo utilizamos uma matriz associativa, porque as chaves do array são rotulados com o mesmo nome das colunas da tabela do nosso banco de dados, o que torna muito mais fácil para nos manter a cabeça envolvida com o código ao tentar escrevê-lo e lê-lo.

Como não sabemos quantas linhas existem em um determinado momento, nós usamos um loop while. Basicamente, o loop diz o seguinte: enquanto o coelho ainda tem linhas para nos entregar, volte ao início e pegue a próxima linha  e usa a variável $array para exibir a informação aos nossos usuários.

Dentro do loop resgatamos o id do registro para poderemos tornar manipulável a informação. Primeiramente, montamos um campo de formulário (input) do tipo texto, onde atribuímos como VALUE o que resgatamos do Banco de dados em relação ao campo nome.

Em último lugar fazemos um link excluir na última coluna da nossa tabela html. O link irá passar o nome pela URL para que ele possa ser recuperado com o método GET, conforme já mencionamos na 1ª parte do código, na seção onde falamos sobre DELETE.

Listando tudo do banco de dados MySQL – 3º Bloco

// Caixas de texto para adicionar novo nome

echo "<tr>
 <td bgcolor = \"gray\"></td>
 <td><input type = \"text\" name = \"nome\"></td>
 <td bgcolor = \"gray\"></td>
 </tr>
 <tr>
 <td style=\"background-color:#ebebeb;\"></td>
 <td style=\"background-color:#ebebeb; text-align:center;\">
     <input type = \"submit\" name=\"inserir\" value = \"Inserir nome\">
 </td>
 <td style=\"background-color:#ebebeb;\"></td>
 </tr>

</table>
</form>";

/*
Final da 2ª Parte
*/

?>

Este último pedaço de código basta adicionar uma caixa de texto (input) vazia para o usuário adicionar um novo nome, e também um botão de envio para que ele submeta o formulário. O valor do campo de texto é usado pelo bloco de código INSERT.

Chegamos ao final do tutorial, mas eu não esqueci do que prometi em relação a instrução UPDATE para modificar/editar os registros no banco de dados MySQL.

Vamos ver agora como funciona esta opção MySQL.

Trabalhando com o UPDATE do MySQL

Resolvi fazer separado esta opção pois precisaríamos utilizar outro formulário para editar os dados.

Veja bem! Na verdade não temos nenhuma novidade, é basicamente o que já vimos anteriormente com SELECT e DELETE, entenda que montaremos a interface para modificar/atualizar os registros da mesma forma que montamos a interface para excluir, porém as duas únicas diferenças é que ao invés de apresentar o link excluir ao lado de cada linha, apresentará um botão de editar e também enviaremos pelo formulário o id respectivo ao registro que será editado, e em relação a querystringa ser montada para manipular os dados enviados via método POST será com a instrução UPDATE e suas características.

Acompanhe o código abaixo, praticamente é uma reposição do código inicial deste tutorial, com leves modificações que citei nessa seção, UPDATE.
Verifique como ficou as modificações e logo em seguida veja uma breve explicação.

Observação: Nessa reposição de código não utilizei as linhas referentes à conexão ao banco de dados, mas entenda a necessidade da mesma. ;)

// UPDATE: edita/modifica dados no BD

// Se de fato $_POST['nome'] e $_POST[id] estão definidos

if (isset($_POST['nome']) && isset($_POST[id]))
{

    // Fazendo um pequeno tratamento da entrada para ajudar na segurança.
    $nome = mysql_real_escape_string($_POST['nome']);
    $id = (int)$_POST[id]; // tornamos o valor de $id um inteiro - proteção :)

    // Nota: Procure informações sobre mysql_real_scape_string()

    // ATUALIZANDO o registro na tabela
    $sql_UPDATE = "UPDATE info SET nome = '".$nome."' WHERE id = ".$id."";
    $query = mysql_query($sql_UPDATE, $conn) or die(mysql_error());

    /*
       Esta instrução acima basicamente diz isso:
       ATUALIZE a tabela info DEFINA o valor de nome para igual ao valor da variável $nome
       ONDE id tenha o valor igual ao da variável $id

       Simples! não é mesmo? =)
    */

    /* Nota: Durante as fazes de desenvolvimento, sempre use mysql_error()
    desta forma facilita o controle de erros quando existem, mas ao publicar
    o conteúdo, desabilite para não expor aos usuários. */

} // final do UPDATE

// vamos manter a opção de 'excluir' nessa interface de atualização

if (isset($_GET['nome']))
{

    // DELETE: Excluindo um registro no BD

    // pequeno cuidado com segurança
    $nome = mysql_real_escape_string($_GET['nome']);

    // excluindo um registro na tabela do bd
    $sql_DELETE = "DELETE FROM info WHERE nome = '".$nome."'";
    $query = mysql_query($sql_DELETE, $conn) or die(mysql_error());

} // final do DELETE

// Listando e organizando os registros consultados

if (isset($_GET['orderby']))
{

    // fazendo um array com os critérios/campos permitidos para ordenar a listagem
    $permitidos = array('id','nome');

    // pequeno tratamento de segurança dos dados
    $order = mysql_real_escape_string($_GET['orderby']);

    /* É um campo válido, ordenará pelo crit´rio solicitado,
     do contrário o padrão será id */

    $order = (in_array($order, $permitidos)) ? $order : "id";

    /* Se não for escolhido nenhum critério para ordem
     da listagem, o padrão será o id */

}
else
{

    $order = "id";

} // Final da codificação da manipulação do valor à ser utilizado em ORDERBY
  // Veremos a utilização de ORDERBY a seguir, juntamente com SELECT

// SELECT: Consultando e listando os registros cadastrados no BD

$sql = "SELECT id, nome FROM info ORDER BY ".$order."";
$query = mysql_query($sql, $conn) or die(mysql_error());

// Estrutura para a exibição dos campos(colunas), e valores registrados no banco de dados

echo "<table style=\"border:1px solid #333;\">

    <tr>
        <td style=\"background-color:#ebebeb;\"><a href = \"".$_SERVER['PHP_SELF']."?orderby=id\">id</a></td>
        <td style=\"background-color:#ebebeb;\"><a href = \"".$_SERVER['PHP_SELF']."?orderby=nome\">nome</a></td>
	<td style=\"background-color:#ebebeb;\">Editar</td>
        <td style=\"background-color:#ebebeb;\">Excluir</td>
    </tr>";

    // loop para listar os registros resultados do SELECT que fizemos anteriormente 

    while ($array = mysql_fetch_assoc($query))
    {

        echo "<tr>
                  <td style=\"background-color:#ebebeb;\">".$array[id]."</td>
                  <td style=\"background-color:#ebebeb;\">".$array['nome']."</td>
                  <td style=\"\">
                      <form action =\"".$_SERVER['PHP_SELF']."\" method =\"post\">
                          <input type=\"text\" name=\"nome\" value=\"".$array['nome']."\" />
                          <input type=\"hidden\" name=\"id\" value=\"".$array[id]."\" />
                          <input type=\"submit\" value=\"Editar\" />
                      </form>
                  </td>
                  <td style=\"background-color:#ebebeb;\">
                      <a href = \"".$_SERVER['PHP_SELF']."?nome=".$array['nome']."\">delete</a>
                  </td>
             </tr>";

    } // final do loop while

echo "<tr>
          <td bgcolor = \"gray\"></td>
          <td bgcolor = \"gray\"></td>
          <td bgcolor = \"gray\"></td>
          <td bgcolor = \"gray\"></td>
     </tr>

</table>";

?>

A única explicação que posso dar é que tenho certeza que você é inteligente o bastante para ter sacado que não vimos muita coisa diferente e as únicas mudanças são bem intuítivas de se compreender. Utilizando os ensinamentos passados anteriormente e lendo os  alguns novos comentários no código não terá dificuldades com a instrução UPDATE.

O ideal é refazer tudo, acompanhando o tutorial com calma e atenção, mas para os mais preguiçosos :P segue os códigos dos exemplos acima para download.

Download dos códigos dos exemplos do tutorial de Manipulação básica de banco de dados Mysql com PHP

Espero que você tenha ganho um melhor entendimento sobre como mexer com o seu banco de dados através do PHP. Cabe à você praticar.

Por favor, qualquer dúvida faça um comentário que eu tento ajudar.

Até o próximo!

Fonte: http://www.phpfreaks.com

Tópicos relacionandos

Publicado por

Razor

Conhecedor das artes gráficas, amante de design web, amigo íntimo do desenvolvimento web, com a pretensão de aprender e ajudar à quem busca conhecimento, me faço presente. =)

30 comentários sobre “Manipulação básica de um banco de dados MySQL com PHP”

  1. Cara eu sou louco por esse cogidos rsrs
    entendo de css e html.. mais a parte desses codigos.. eu~não entendo muito bem..
    não quero só copiar e colar e sim entender o que estou fazendo
    o que você acha de fazer um tudo detalhado.. por exemplo
    echo algo simples mais ngm sabe o que é…
    um tudo explicando os nomes..

  2. Cara poderia colocar o arquivo para download como fez nos outros tutoriais.
    Porque eu não consegui :s fica tudo comentado.
    Mas ta otimo parabéns!
    se puder disponibilizar para download os codigos, fico grato!

    1. Olá @Gabriel, acabei de adicionar no final do tutorial, perto dos links de exemplos mais um link para o download dos códigos dos exemplos do tutorial de manipulação básica do banco de dados MySQL com PHP.
      Bons estudos!

  3. Roberto,

    Preciso fazer uma pagina com banco de dados onde ele pegue 2 variáveis e cruze as informações para vir o resultado. Por exemplo: Cidade 1 x Cidade 2 para dar mostrar o resultado ( São Paulo para Recife = 6 dias).

    Como posso fazer?

    1. Igor, não sei bem o que pretende, mas pelo pouco que captei, me parece que a melhor forma de fazer isso é ter os valores predefinidos.

      | cruzamento| dias |
      |São Paulo – Recife | 6 dias|
      etc…

      … fazer todas as combinações possíveis e os seus respectivos ‘dias’

      Depois a consulta é simples… basta o user escolher a combinação de cidade que ele quiser e o script consulta o banco de dados

      Não vejo forma mais simples de cruzar as cidades para resultar a quantidade de dias (não sei se á para entrega ou viagem)
      E se esses valores são fixos como mencionei no meu exemplo lá em cima, o melhor é registrar no bd o cruzamento das cidades e os dias que cada cruzamento terá como valor mesmo, depois exibir a opção de cruza de cidades ao usuário, pegar as duas variáveis enviadas pelo form e concatenar.

      Exemplo:

      $var = $_POST['cidade1']. "-" .$_POST['cidade2'];

      Obs.: Faça a concatenação coforme fique igual p padrão que vc adotar no BD no campo do cruzamento

      Agora manda um "SELECT dias FROM tabela WHERE cruzamento = '".$var."'"

      Espero ter ajudado.

  4. Maravilhoso seu código Roberto, preciso de uma ajuda eu usei seu código para facilitar a busca em um sistema que minha ãe usa em um pequeno comercio, porém eu nao consigo fazer o select buscar cadastro entre duas data, você poderia me ajudar a fazer com que esse código funcione com busca entre duas datas ?

    Rene

    1. Olá @Rene, para buscar períodos entre uma data e outra vc pode usar o BETWEEN na cláusula WHERE

      Exemplo: SELECT * FROM tabela WHERE data BETWEEN 2011-11-11 AND 2011-11-23

      Lembrando que a data usei no exemplo no tipo DATE, mas pode ser DATETIME onde além da data busca um período mais preciso, contando horas e minutos e até segundos
      Ainda há outros formatos de datas…

      Bons estudos

      1. Olá Roberto, então eu havia usado exatamente essa SQL que você sugere, porém o que acontece, quando eu atualizo um registro de uma coluno por exemplo ele volta apenas com o nome das colunas sem mostra os registros….

        Outra coisa que não entendi, se eu colocar uma váriavel recebendo a data ,,,assim por exemplo…$date = ‘2011-11-23’ , ele retorna mostrando os dados normal com a coluna atualizada.

        entendeu?

  5. Nossa Roberto Lunelli, eu estava vendo foi eu que errei mesmo, eu esqueci de colocar a variável, ou sejá para cada pagina tinha uma variável diferente, e ai deixei duas paginas com a mesma variável, ai uma das paginas busca coisa que não existia, fiquei quase uma semana tentando achar esse erro tosco…=]
    Mais valeu Pela atenção e a reposta no email…
    Valeu Abraços…

  6. Bom dia roberto, entao fiz o que vc recomendou mas não funciona nem a pau……olha o link onde fiz
    http://200.144.201.24/workspace/busca/buscar.php

    olha o código

    $order = “id”;

    } // Final da codificação da manipulação do valor à ser utilizado em ORDERBY
    // Veremos a utilização de ORDERBY a seguir, juntamente com SELECT

    // SELECT: Consultando e listando os registros cadastrados no BD

    $dia= explode(‘/’,$_POST[‘inicio’]);
    $inicio = “$dia[2]-$dia[1]-$dia[0]”;
    //$inicio = “2011-02-07”;
    $dia= explode(‘/’,$_POST[‘fim’]);
    $fim = “$dia[2]-$dia[1]-$dia[0]”;

    $query =”Select * from apagar where DATA between $fim and $inicio order by “.$order.” “;
    //$query = “SELECT * FROM apagar WHERE DATA LIKE ‘$inicio%’ ORDER BY “.$order.” “;
    //SELECT * FROM tabela WHERE data BETWEEN 2011-11-11 AND 2011-11-23
    //$sql = “SELECT * FROM apagar WHERE DATA BETWEEN $fim AND $inicio “;
    //$query = mysql_query($sql, $conn) or die(mysql_error());

    // Estrutura para a exibição dos campos(colunas), e valores registrados no banco de dados

    echo ”

    id
    PAGO
    FORNECEDOR
    DATA
    DEBITO
    FORMA
    Alterar os Dados
    Excluir
    “;

    // loop para listar os registros resultados do SELECT que fizemos anteriormente

    while ($array = mysql_fetch_array($query))
    {

  7. Olha eu aki novamente, eu seu que não tem nada haver, com esse tutorial mais como que eu consigo fazer um campo de busca igual ctrl+f(o usuário digita e vai criando uma marca em cima da palavra contida na pagina)minha duvida é seu eu usar apenas o “select” vai fazer o resultado esperado, estou olhando em varios sites e como vc foi o unico que respondeu quando perguntei resolvi voltar e como dizem “o bom filho sempre a casa torna”, se puder me ajudar irei agradecer muito..
    ate mais falou

  8. Caro amigo eu fiz um projeto e nao consigo excluir os dados do banco !
    Eu ja fiz igual ao seu e tbm nao exclui pq ? sabe me dizer eu clico no botao excluir ele me diz excuido com sucesso mas vou ver e ele nao exclui nada ! o meu ta assim ! <?php

    mysql_connect('localhost','root','');
    mysql_select_db('Avaliacao');

    $nome = $_GET['nome'];

    $sql = "DELETE FROM Agenda WHERE nome = '$nome'";

    if (mysql_query($sql))
    {

    echo 'Registro excluido com sucesso!’;
    }
    else
    {
    echo ‘Erro’;
    }
    ?>

  9. Tenho a seguinte situação

    tenho um bd (Tbl_A) com meus produtos que disponibilizo
    e criei um bd (Tbl_D) como lista de desejo.
    Como manipular os dois bd e incluir no bd (Tbl_A) os produtos da tabela lista de desejo que não possuo?
    alguém pode me socorrer.

  10. Amigo, excelente explicação!
    Tem algum tutorial ou mesmo alguma informação sobre :
    Caso eu queria que a tabela “info” receba os dados, porém somente apareça o ultimo dado inserido e eu tenha botoes no formulário para ir ao “próximo”; “anterior”;”Ultimo”, Como seria feito?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *