Aulas PHP - aula 3.2 - Trabalhando com Banco de Dados MySQL. Inserção de dados INSERT INTO. Seleção de dados SELECT
Na aula anterior criamos uma tabela para nosso site. Nesta aula melhoraremos nossa tabela e começaremos a trabalhar com o banco de dados: inserir dados nele e obter esses dados da tabela. Acho que nada muito complexo é esperado, então vamos começar.
Para começar, proponho melhorar nossa tabela messages. Agora ela tem campos para dados, mas precisamos de mais um campo para numeração de registros. Se você abrir o banco de dados do Drupal, verá que na tabela node existe um campo nid, pelo qual numeramos nossos nós. Também precisamos fazer o mesmo com nossa tabela messages.
Vamos acessar o phpMyAdmin (http://localhost/tools/phpmyadmin para Denver) e editar nossa tabela. Adicionaremos mais uma coluna no início da tabela, como mostrado na figura:

Vamos chamar a coluna mid (message id), tipo de dados INT (inteiro) com comprimento de 11 caracteres. Também marcaremos a caixa ao lado de AUTO_INCREMENT, o que significa numeração automática nesta coluna. E ainda definiremos o valor do índice como primary, o que significa que esta é a chave primária de nossa tabela.

Se você se lembra, criamos um método separado para a classe simpleCMS para criar a tabela. Acho que agora precisamos mudar a forma como este método funciona para que ele também adicione o campo mid. Vá para a tabela messages e clique em export:

Chegamos à página de exportação da tabela. A exportação é feita na forma de consultas SQL para criar e editar tabelas. Se modificarmos uma tabela no phpmyadmin, podemos depois copiar a consulta SQL para sua criação, o que é muito conveniente.
Na página de exportação, deixe tudo como padrão e clique em OK. O PhpMyAdmin fornecerá uma consulta sql diretamente no navegador ou como um arquivo. Ambas as opções nos servem. Precisamos copiar este código:

Observe as aspas invertidas usadas lá, aquelas usadas no phpMyAdmin. Em PHP podemos usar aspas simples. Copie o texto para nosso método buildDB():
public function buildDB(){
$sql = "CREATE TABLE IF NOT EXISTS 'messages' (
'mid' int(11) NOT NULL AUTO_INCREMENT,
'title' varchar(150) DEFAULT NULL,
'bodytext' text,
'created' varchar(100) DEFAULT NULL,
PRIMARY KEY ('mid')
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
return mysql_query($sql);
}
Agora vamos verificar como isso funcionará. Vamos deletar a tabela messages.

Confirme a exclusão. Agora quando executarmos o index.php em nosso site, o método buildDB() será executado e nossa tabela deve ser recriada.
public function buildDB(){
$sql = "CREATE TABLE Messages
(
mid int NOT NULL AUTO_INCREMENT,
PRIMARY KEY(mid),
title varchar(15),
bodytext text,
created int(11)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
$result = mysql_query($sql);
print_r($result);
}
Agora executamos o index.php e a tabela Messages aparece como estava antes.
Consultas de inserção INSERT INTO
O banco de dados foi criado, tudo está pronto para implementar nossos métodos de escrita e exibição de mensagens usando o banco de dados. Vamos começar com a escrita no banco de dados. Abra o método write(), vamos alterá-lo.
A inserção em tabelas é realizada usando o operador INSERT INTO, da seguinte forma:
public function write($p) { // método para escrever mensagem
$sql = 'INSERT INTO Messages (title, bodytext, created) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ')';
return mysql_query($sql);
}
Agora vamos entender como exatamente os valores são inseridos. Como disse antes, a consulta de inserção SQL começa com o operador INSERT INTO, depois vem o nome da tabela Messages. Após o nome da tabela, especificamos em quais colunas inserir os valores. Note que não escrevemos mid porque seu valor será definido automaticamente pelo MySQL, pois definimos a numeração automática (incremento de um) para cada novo registro. Depois vem o operador VALUES (valores) após o qual escrevemos os valores para cada coluna da tabela. A ordem das colunas e a ordem dos valores devem coincidir, assim como o número de valores e colunas.
Se precisarmos inserir uma expressão de string nos valores, usamos aspas. Você precisa garantir que essas aspas sejam diferentes das aspas que envolvem toda a consulta SQL. E não se confunda ao inserir uma variável em uma consulta SQL: envolvemos a parte textual da consulta sql em aspas simples, então devemos envolver a string retornada pela variável em aspas duplas, por exemplo aqui:
"'. $p["title"] . '"
a ordem seguinte das aspas: dupla, simples, ponto, variável, ponto, simples, dupla.
Acho que um exemplo é suficiente por enquanto, haverá mais exemplos depois, então não se desespere se eu explicar mal e você não entender imediatamente. Vamos melhor criar alguns registros na tabela agora, para isso substitua o código do método write() pelo que dei acima.
Consultas de seleção SELECT
Criamos vários registros, visualizamos através do phpmyadmin:

Agora podemos exibir esses registros usando o método display_public(), que também alteraremos. Para fazer a seleção da tabela, usaremos o operador SELECT, vamos começar com uma seleção simples:
public function display_public() { // método para exibir mensagens
$content = '';
$sql = 'SELECT * FROM Messages'; //consulta de seleção
$result = mysql_query($sql); // salvamos o resultado da execução da consulta de seleção em uma variável
while($row = mysql_fetch_array($result)){ // a variável de consulta de seleção deve ser processada pela função especial mysql_fetch_array()
print '<div class="post">'; // div envolvendo o registro
print '<span class="time">#' . $row['mid'] . ' de ' . date('d-m-Y', $row['created']) . '</span><h2>' . $row['title'] . '</h2>'; // exibimos hora e título
print '<p>' . $row['bodytext'] . '</p>'; // exibimos o texto da mensagem
print '</div>'; // fim da div envolvente
}
$content .= '<p><a href="/index.php?admin=1">Adicionar mensagem</a></p>';
return $content;
}
Já substituí completamente a implementação do método display_public(), agora todos os registros são exibidos no banco de dados. Vamos entender este exemplo agora. A consulta de seleção começa com o operador SELECT, depois vem o símbolo * (asterisco), o que significa que queremos selecionar todos os campos de cada linha da tabela. Se tivéssemos escrito assim:
$sql = 'SELECT mid,title FROM Messages'; //consulta de seleção
$result = mysql_query($sql);
Isso significaria que selecionaremos apenas mid e title de cada linha, e não precisamos de bodytext e created.
Depois de * vem o operador FROM, que indica de qual tabela vamos selecionar.
O resultado da execução da função mysql_query() para uma consulta de seleção deve ser armazenado em uma variável (em nosso caso a variável $result), porque mais tarde essa variável precisará ser processada pela função mysql_fetch_array().
Imagine que fizemos uma consulta de seleção e obtemos 3 registros, então a função mysql_fetch_array() permite criar sequencialmente um array após cada chamada. Ou seja, na primeira chamada, obtemos um array da primeira linha, na segunda chamada, um array da segunda linha e assim por diante. Quando as linhas terminarem, a função mysql_fetch_array() retorna não um array, mas o valor false. Portanto, neste caso, você pode usar um loop while (enquanto a condição for atendida, realizamos as ações). Ele permite executar as mesmas ações para todos os registros da tabela. Assim iteramos cada registro enquanto a condição é atendida.
Acho que isso pode ser difícil de entender na primeira vez, mas com o tempo você se adapta a escrever consultas SQL. Não há tantos operadores, então você os memoriza rapidamente.
Consultas de seleção, ordenação ORDER BY
Você também pode definir a ordem de seleção usando o operador ORDER BY, por padrão a ordem é definida em ordem crescente, por exemplo:
$sql = 'SELECT * FROM Messages ORDER BY mid';
Assim classificaremos a consulta de seleção em ordem crescente por mid. Você também pode classificar em ordem decrescente, para isso precisa usar outro operador adicional DESC.
$sql = 'SELECT * FROM Messages ORDER BY mid DESC';
Como você pode ver, tudo é muito simples, se usarmos DESC para ordem decrescente, então para ordem crescente precisamos usar ASC:
$sql = 'SELECT * FROM Messages ORDER BY mid ASC';
Embora a classificação em ordem crescente seja usada por padrão.
Consultas de seleção, condições WHERE
Além de classificação, você pode filtrar consultas de seleção definindo condições de seleção usando o operador WHERE:
$sql = 'SELECT * FROM Messages WHERE mid<3 ORDER BY mid DESC';
Desta forma exibimos os dois primeiros registros (com mid=1 e mid=2), se é claro que esses registros existem na tabela. Você também pode usar os operadores AND (e) e OR (ou) para conectar várias condições. Se definirmos AND, ambas as condições devem ser atendidas, se definirmos OR, é suficiente que apenas uma das condições seja atendida.
$limit_time = time() - 3600; // tempo uma hora atrás
$sql = 'SELECT * FROM Messages WHERE mid<3 AND created>' . $limit_time . ' ORDER BY mid DESC'; //consulta de seleção
Desta forma adicionamos uma condição adicional de que o registro foi criado não antes de uma hora atrás. Acho que por enquanto é suficiente para consultas de seleção, então vamos prosseguir para a próxima aula.