logo

Paleta - Deixe colorido🎨

Palette — Construtor visual de páginas. Não precisa ser designer.

Demonstração ao vivo Baixar Palette

Scroll

Aulas PHP - aula 3.2 - Trabalhando com Banco de Dados MySQL. Inserção de dados INSERT INTO. Seleção de dados SELECT

08/12/2019, by Ivan

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:

 PhpMyAdmin

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.

PhpMyAdmin mid column

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:

PhpMyAdmin 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:

PhpMyAdmin table

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.

PhpMyAdmin drop table

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:

PhpMyAdmin Browse

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.