Manipulando dados do MySQL com o PHP

MySQLEste talvez seja o tópico mais importante (e longo) do blog… Aqui aprenderemos a inserir dados, alterar dados e deletar dados do MySQL.

É, sem dúvida, a tarefa mais executada em uma aplicação de médio/grande porte e você vai precisar dominar cada um desses passos da mesma forma que você domina o seu idioma nativo. Por isso, preste muita atenção.

Irei explicar de forma mais abrangente como ficam as operações que fazem a manipulação desses dados… Em outro tópico explicarei como fazer para pegar e manipular dados vindos de formulários HTML. Meu intuito é que você entenda como usar cada uma dessas operações da melhor forma possível pro seu sistema… por isso darei mais de um exemplo pra cada uma.

Pularei a parte que explica como fazer uma conexão ao banco de dados MySQL por que já fiz isso nesse tópico. Farei a conexão com o servidor usando include no arquivo conexao.php que – apenas – faz a conexão o MySQL.

Usarei como exemplo os dados dessa notícia, publicada no site do Jornal do Brasil em 16/03/2009 as 23:26.

Tabela de exemplo

Usaremos a tabela ‘noticias’ nos exemplo desse tópico, ela é composta por uma tabela simples de quatro colunas: id, titulo, texto e cadastro. O campo id é numérico (inteiro), do tipo INT e possui incremento automático, e contem o índice de cada notícia na tabela, o campo titulo é alfa-numérico, do tipo VARCHAR, e pode ter até 255 caracteres, o campo texto, do tipo LONGTEXT, aceita qualquer valor existente em um texto e pode ter muitos (eu disse muitos) caracteres, o suficiente para algumas longas dezenas de páginas a4 se necessário… e por último, mas não menos importante, temos o campo cadastro que é do tipo DATETIME e guarda a data e hora de cadastro da notícia no sistema.

Nota: não use espaços ou acentos nos nomes nas tabelas e bancos MySQL.

O código para a criação dessa tabela é o seguinte:

CREATE TABLE IF NOT EXISTS `noticias` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`titulo` varchar(255) NOT NULL,
`texto` longtext NOT NULL,
`cadastro` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `titulo` (`titulo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Inserindo dados

Para inserir dados no MySQL você precisa montar uma consulta SQL (também chamada de query) usando o comando INSERT do MySQL, vejamos o exemplo de como inserir uma notícia na nossa tabela de notícias:

<?php
// Inclui o arquivo que faz a conexão ao MySQL
include("conexao.php");

// Definição das variáveis para montar a query
$titulo = 'Vandalismo mata 10 mil árvores por ano no Rio';
$texto = '<p>Não fosse privilegiada pela natureza, com a vasta extensão da Mata Atlântica, a paisagem do Rio seria desértica.</p>';
$cadastro = date('Y-m-d H:i:s'); // Formato de data padrão do MySQL
// ~~~~~~~~~~~~~~~~~~~~~~~~~~

// Manipulamos as variáveis para evitar problemas com aspas e outros caracteres protegidos do MySQL
$titulo = mysql_escape_string($titulo);
$texto = mysql_escape_string($texto);

// Montamos a consulta SQL
$query = "INSERT INTO `noticias` (`titulo`, `texto`, `cadastro`) VALUES ('".$titulo."', '".$texto."', '".$cadastro."')";

// Executa a query
$inserir = mysql_query($query);

if ($inserir) {
echo "Notícia inserida com sucesso!";
} else {
echo "Não foi possível inserir a notícia, tente novamente.";
// Exibe dados sobre o erro:
echo "<br />Dados sobre o erro:" . mysql_error();
}
?>

A função mysql_query() é responsável por executar uma consulta no servidor MySQL e, no caso do comando INSERT, ela retorna true ou false informando se o registro foi ou não inserido.

A sintaxe padrão do INSERT no MySQL é mais ou menos a seguinte:

INSERT INTO %tabela% (%colunas%) VALUES (%valores%)

Com essa sintaxe, você define em quais colunas você está inserindo valores… No nosso exemplo não incluímos a coluna ID na lista pois queremos que o MySQL use o seu valor padrão.

Nota: Pra cada coluna listada em %colunas% deve existir um valor, na mesma posição, listado em %valores%.

Você também tem uma segunda opção de sintaxe para o INSERT:

INSERT INTO %tabela% VALUES (%valores%)

Se você preferir por esse formato vai precisar definir os valores de TODAS as colunas da tabela, ficando dessa forma:

// Montamos a consulta SQL
$query = "INSERT INTO `noticias` VALUES (NULL, '".$titulo."', '".$texto."', '".$cadastro."')";

A desvantagem desse formato (diferente do primeiro) é que você precisa dizer o valor de cada uma das colunas da tabela ordenadamente para o PHP. Mas eu particularmente prefiro esse segundo formato de INSERT, ainda mais quando temos mais de 10 colunas em uma tabela fica muito ruim escrever o nome de todas elas e depois os valores de cada uma.

Usamos NULL (repare a falta de aspas) no valor da coluna ID por que queremos que o MySQL use o seu incremento automático para gerar o ID do próximo registro da tabela de forma natural. Exemplo: se o ID da última notícia cadastrada é 5 e inserirmos uma nova notícia usando NULL, ela terá 6 como ID. Convenciona-se que toda tabela MySQL deva ter uma coluna ID com auto incremento.

Mas fica a seu critério qual formato de INSERT usar.

Deletando dados

Se você quiser deletar dados armazenados no MySQL você pode usar o comando DELETE dentro da consulta SQL. A sua sintaxe é bem simples e a deleção se baseia em uma condição, vejamos dois exemplos:

<?php
// Inclui o arquivo que faz a conexão ao MySQL
include("conexao.php");

// Montamos a consulta SQL para deletar a(s) notícia(s) com ID maior ou igual a três
$query = "DELETE FROM `noticias` WHERE (`id` >= 3)";

// Executa a query
$deletar = mysql_query($query);

if ($deletar) {
echo "As notícias foram deletadas com sucesso!";
} else {
echo "Não foi possível deletar as notícia, tente novamente.";
// Exibe dados sobre o erro:
echo "<br />Dados sobre o erro:" . mysql_error();
}
?>

Nesse exemplo condicionamos a deleção apenas dos registros que tiverem o valor da coluna `id` maior ou igual a três.

<?php
// Inclui o arquivo que faz a conexão ao MySQL
include("conexao.php");

// Montamos a consulta SQL para deletar notícias que não sejam desse ano
$query = "DELETE FROM `noticias` WHERE (`cadastro` < '2009-01-01 00:00:00') OR (`cadastro` > '2009-12-31 23:23:59')";

// Executa a query
$deletar = mysql_query($query);

if ($deletar) {
echo "As notícias de outros anos foram deletadas com sucesso!";
} else {
echo "Não foi possível deletar as notícia, tente novamente.";
// Exibe dados sobre o erro:
echo "<br />Dados sobre o erro:" . mysql_error();
}
?>

Nesse exemplo usamos duas condições ao mesmo tempo e buscamos registros em função da sua data de cadastro no sistema.

Podemos resumir a sintaxe da query de deleção da seguinte forma:

DELETE FROM %tabela% WHERE %condições%

Atenção: Suponhamos que você tenha quatro notícias com IDs iguais a 1, 2, 3 e 4 e deleta a notícia que tenha id igual a 4. Quando você adicionar um novo registro a tabela, usando o incremento automático, o ID dele vai ser 5 e não 4. Sendo assim os IDs vão ficar da seguinte forma: 1, 2, 3 e 5.

Atualizando dados em registros

Você já tem a sua tabela cheia de notícias e sabe inserir e deletar as notícias… Mas você repara que uma delas tem aquele erro boçal de ortografia no titulo da notícia. O que você faz? Você pode dar uma de português e deletar a notícia e cadastrar outra notícia com o formato correto… OU você pode simplesmente editar o titulo da notícia! :-D

Ai você descobre que existe o UPDATE do MySQL, que serve exatamente para isso! Vamos ao exemplo:

<?php
// Inclui o arquivo que faz a conexão ao MySQL
include("conexao.php");

// Id da notícia a ser editada
$id = 3;

// Novo título da notícia
$titulo = 'Vandalismo mata 10 mil árvores por ano no Rio de Janeiro';
$cadastro = date('Y-m-d H:i:s'); // Formato de data padrão do MySQL

// Manipulamos as variáveis para evitar problemas com aspas e outros caracteres protegidos do MySQL
$titulo = mysql_escape_string($titulo);

// Montamos a consulta SQL para deletar a(s) notícia(s) com ID maior ou igual a três
$query = "UPDATE `noticias` SET `titulo` = '".$titulo."', `cadastro` = '".$cadastro."' WHERE (`id` = ".$id.")";

// Executa a query
$atualiza = mysql_query($query);

if ($atualiza) {
echo "A notícia foi atualizada com sucesso!";
} else {
echo "Não foi possível atualizar as notícia, tente novamente.";
// Exibe dados sobre o erro:
echo "<br />Dados sobre o erro:" . mysql_error();
}
?>

Repare que no exemplo, além de atualizar o titulo da notícia, atualizamos também a sua “data de cadastro” para ela ser considerada uma notícia que foi alterada recentemente. Você pode usar o UPDATE em quantas colunas do registro você preferir e também pode brincar com a condição depois do WHERE da forma que achar melhor.

A sintaxe normal do UPDATE é a seguinte:

UPDATE %tabela% SET %alteraçoes% WHERE %condições%

O formato das alterações é esse: `coluna` = <valor>, `coluna` = <valor>, `coluna` = <valor>

Eu também iria falar sobre como buscar dados no MySQL mas acho que, de tão grande que é, esse assunto merece um post só dele… Então, até a próxima! :)

10 thoughts on “Manipulando dados do MySQL com o PHP

  1. Guilherme Cherem

    Nunca use esse tipo de query pois está sujeito a SQL INJECT. Recomendo logo começarem a utilizar a classe PDO e a aprender a programação orientada a objeto.

  2. Jeferson

    Boa tarde Sr. Thiago Belem.
    Saudações de um brasileiro radicado em Portugal há muitos anos!

    Tenho acompanhado no anonimato a muito tempo os seus artigos e permita-me parabenizá-lo pela objectividade dos mesmos e pela sua prestação de serviço público ao partilhar informações valiosas e conhecimento adquirido ao público em geral! Continue o bom trabalho.

    Bom, a primeira vez que escrevo é para solicitar ajuda dos seus avançados conhecimentos no assunto e passo a explicar:

    Utilizo wordpress a muitos anos para o desenvolvimento dos meus projectos e dos meus clientes, mas, a uns tempos decidi desenvolver o meu próprio sistema e que esse atendesse as minhas necessidades e que fosse simples o suficiente para geri-lo, seguro o suficiente para comercializá-lo, leve o suficiente para ter desempenho, e versátil o suficiente para que possa ser atrativo.
    Partindo desses objectivos, afinal consegui chegar a reta final do sistema (php + mysql) que consiste em:

    Sistema de criação de sites (site builder)
    Características:
    1 – backoffice muito atractivo (parte estéctica) e funcional onde o administrador pode gerir as configurações do sistema e pode gerir recebimentos e todos os utilizadores. Esse mesmo BackOffice é comum a todos os utilizadores onde cada qual, mediante inserção de username e password, pode acessar a sua área pessoal e gerir as suas informações e conteúdos.
    2 – 50 modelos de layouts (sites HTML) onde o utilizador regista-se, escolhe o seu subdomínio, escolhe o layout e digita os´conteúdos das páginas. (tipo wix)

    Até aí está tudo a 100% e funcional, exaustivamente testado a todos os pontos.

    Meu problema:
    Por um lapso meu, ou mesmo por falta de conhecimento, nos testes do sistema sempre tive dois utilizadores de testes registados no sistema: 1 utilizador que é o administrador e outro utilizador denominado cliente.
    O administrador com acesso a gestão do BackOffice e o utilizador cliente com o seu acesso a área pessoal para edição das suas páginas do seu site.

    Ora, a minha surpresa é que fui criar outro utilizador de teste, Acessei o sistema, registei-me como um cliente normal faria para criar o seu site e depois de registando acessei o BackOffice normalmente com as credenciais desse utilizador e comecei a editar as páginas desse site. Até aí tudo perfeito….
    Para meu espanto (pois pensava que estava tudo ok), quando fui visualizar esse site para ver como estava a correr as alterações, ao abrir o subdomínio criado está tudo correcto, mas em outro computador ao acessar o site criado do primeiro utilizador de teste, aquilo que eu vejo são exactamente os mesmos conteúdos do último utilizador criado, ou seja, se forem criados 10 sites, todos os 10 sites ao acessar os seus respectivos endereços todos apresentam o mesmo conteúdo do último site criado.
    Detalhe:
    * Na base de dados está tudo ok, cada um com o seu respectivo conteúdo.
    * No BackOffice está tudo ok, cada um acessa correctamente a sua respectiva área e informações e não se misturam.

    Já tentei de tudo aquilo que conheço (que não é grande coisa), fiz pesquisas, alterei htaccess, tentei variáveis pelo htaccess, tentei várias formas de conexão a base de dados e não consigo resolver.

    Tenho certeza que é algo espantosamente simples, mas falta-me conhecimento para tal, por isso solicito se possível a sua ajuda.
    Posso informar os links e dados de acesso, se estiver disposto a auxiliar e tiver disponibilidade.

    Atentamente.
    Jeferson.

  3. Victor Macedo

    Fera eu não sei como, mas tipo eu fiz tudo certinho so que esta dando o erro de Query was empty… e não estava alterando quando fiz um teste so com numeros funcionou, alterou, porque qndo tempo alterar letras ele não altera no banco mas numeros sim?

  4. Frenits

    será que isso funciona:?

    INSERT INTO visitas (
    `idvisitas` ,
    `iddmeu` ,
    `iddamigo` ,
    `ddatehora` ,
    `ip`
    )
    VALUES (
    NULL , ’7′, ’90′, ’2011-03-22 08:22:39′, ’1′
    )
    WHERE ip !=’1′);

    como eu façouma condição no insert?

    1. Thiago Belem Post author

      Não existe condição no insert… Ou você insere o registro ou não insere.. Não há motivo para “condicionar” uma inserção.. Reveja sua lógica. :)

  5. Allyson Dias

    Me ajuda aí Thiago!! Meu problema é o seguinte: Quando vou mandar aparece este erro:

    - Parse error: syntax error, unexpected ‘=’ in /home/vhosts/tinamite.ueuo.com/php/enviar_charada.php on line 11

    Meu código php é assim:

    -

    Meu banco de dados está organizado assim:

    id, pergunta, resposta, envio (datetime) e autor.

    Meu html:

    -
    Pergunta

    Resposta

    Seu nome

    Eu só quero inserir a pergunta, a resposta, o nome que quem enviou e a data que foi enviado!

  6. Claudio

    Muito bom o artigo! Se alguém não entender é porque se lá…

    É o seguinte; eu precisava tirar uma dúvida contigo. Como devo proceder para enviar/excluir mais de um registro de uma vez só com array?

    Desde já agradeço se puder me ajudar!

      1. DinavanMadeira

        Qual o comando para inserir dados em uma tabela sendo que na mesma instrução eu faço uma consulta, na qual se existir tal registro não realizo a inserção desse dado. Você saberia me responder? Não me recordo sei que é só uma instrução que liga o insert into select …

Comments are closed.