Este documento apresenta os conceitos fundamentais para criar sites dinâmicos com PHP e MySQL, incluindo como estabelecer conexão com o banco de dados, extrair e mostrar dados através de queries, e fechar a conexão. O objetivo é permitir visualização, navegação e gestão da informação armazenada no banco de dados.
1. PHP + MySQL: Introdução
Carlos Santos
LabMM 4 - NTC - DeCA - UA
Aula 16, 30-04-2013
2. objetivos do módulo
Criar sítios Web dinâmicos com informação armazenada em bases de
dados
• parte 1: visualização e navegação de informação armazenada em BD
• visualizar dados de uma tabela
• visualizar dados de várias tabelas ligadas entre si
• visualizar detalhes de informação específica
• parte 2: gestão da informação em BD
• inserir novos dados
• atualizar dados
• apagar dados
• parte 3: outras tecnologias interessantes para projetos finais
• Encriptação, SVN, MVC, Ajax, APIs, JSON,...
3. novidade do ano letivo anterior...
... sem rede de segurança :)
4. etapas
1. estabelecer ligação com o MySQL
2. escolher a BD
3. extrair dados da BD através de uma query -> recordset
4. preparar dados para trabalhar no PHP -> fetch
5. mostrar dados
6. fechar ligação ao MySQL
5. 1. estabelecer ligação ao MySQL
mysql_connect()
• abre uma ligação não persistente ao servidor
• existe apenas no âmbito da página/script que a usa
• deve ser terminada pela função mysql_close()
mysql_pconnect()
• abre uma ligação persistente ao servidor
depois de aberta, esta será mantida para todas as páginas
gestão destas ligações persistentes é feita através da configuração de
parâmetros no próprio servidor MySQL
• wait_timeout
• max_connect_errors
6. 1. estabelecer ligação ao MySQL
$connection = mysql_connect(hostname, username, password);
Boas práticas
• criar uma pasta “connections”
• criar um ficheiro “connection.php” com:
<?php
$hostname = “localhost";
$username = “nome_utilizador";
$password = “password_utilizador";
$connection = mysql_connect($hostname, $username, $password);
?>
• incluir o ficheiro em todas as páginas que precisem de interagir com a BD
require_once('connections/connection.php');
7. 1. estabelecer ligação ao MySQL
E se a ligação der erro?
$connection = mysql_connect(hostname, username, password)
or trigger_error(mysql_error(), E_USER_ERROR);
• trigger_error() - dispara uma configuração de erro cujo comportamento
pode ser controlado com set_error_handler()
• mysql_error() - texto do último erro gerado pela última função do MySQL
• E_USER_ERROR - “User-generated error message”
$connection = mysql_connect(hostname, username, password)
|| die(‘Erro na ligação à base de dados’);
• este método só deve ser utilizado para debug em desenvolvimento porque
não permite um controlo dos erros enviados para o utilizador!
9. 3. extrair dados da BD a partir de uma query
$query = "SELECT colunas FROM tabela";
$rsName = mysql_query($query , $connection);
• $query só pode conter uma query e sem “;” no final. Não há suporte para
múltiplos queries numa única chamada!
• $rsName é uma variável do tipo “resource” que contem todos os valores
resultantes da execução do query na respectiva base de dados
• retorna FALSE se existiu um erro na execução do query
Para saber o número total de registos do resultado
• $totalrows_rsName = mysql_num_rows($rsName);
Para libertar espaço de memória ocupado (pouco utilizado)
• mysql_free_result($rsName);
10. Um recordset é uma estrutura de dados sem índices
• o acesso é realizado ao elemento apontado pelo ponteiro
• os métodos de fetch fazem avançar o ponteiro para a próxima “linha”
3. recordset
11. 4. preparar dados para trabalhar no PHP -> fetch
Para utilizar a informação do recordset é necessário preparar (ir buscar)
os dados através de um processo designado por fetch
O fetch dos resultados é realizado linha a linha!
Vários métodos disponíveis dependendo do modo como se prefere tratar
os dados nos passos seguintes:
• mysql_fetch_assoc(recorset) - “Fetch a result row as an associative
array”
• mysql_fetch_row(recordset) - “Get a result row as an enumerated array”
• mysql_fetch_array(recordset) - “Fetch a result row as an associative
array, a numeric array, or both”
12. 4. preparar dados para trabalhar no PHP -> fetch
$row_rsName = mysql_fetch_assoc($rsName);
echo $row_rsName[“chave1"];
echo $row_rsName[“chaveN"];
• $row_rsName é um array associativo
• o acesso aos valores é realizado através das chaves do array
• as chaves são iguais aos nomes dos campos retornados pela query
• retorna FALSE se já não existirem dados para fetch
Para listar todos os resultados
while ($row_rsName = mysql_fetch_assoc($rsName)){
echo $row_rsName[“campo1"];
echo $row_rsName[“campoN"];
}
13. 4. preparar dados para trabalhar no PHP -> fetch
$row_rsName = mysql_fetch_row($rsName);
echo $row_rsName[0];
echo $row_rsName[N];
• $row_rsName é um array enumerado
• o acesso aos valores é realizado através dos índices
• retorna FALSE se já não existirem dados para fetch
Para listar todos os resultados
while ($row_rsName = mysql_fetch_row($rsName)){
echo $row_rsName[0];
echo $row_rsName[N];
}
14. 5. mostrar dados
Já foi exemplificados nos slides do ponto 4 :)
É necessário aplicar os conhecimentos adquiridos no módulo anterior.
Trata-se de utilizar o PHP para tratar os dados dos arrays e mostrar a
informação na página.
15. 6. fechar ligação ao MySQL
mysql_close($connection);
Boas práticas
• o PHP fecha a ligação automaticamente quando o script é terminado
• no entanto, é considerada uma boa prática incluir o método para fechar a
ligação
• a não utilização deste método é crítica quando existem scripts muito
pesados, com longos tempos de processamento, que deixam as ligações
“penduradas” durante muito tempo
• um servidor de MySQL tem recursos limitados e não aguenta um número
infinito de ligações em simultâneo!
16. No final...
// Ficheiro “connections/connection.php”
<?php
// Define variáveis
$hostname = “localhost";
$username = “nome_utilizador";
$password = “password_utilizador";
$dbname = “nome_basededados”;
// Estabelece ligação ao MySQL
$connection = mysql_connect($hostname, $username,
$password) or trigger_error(mysql_error(), E_USER_ERROR);
// Estabelece ligação à BD
mysql_select_db($dbname);
mysql_set_charset(‘utf8’, $connection);
?>
17. No final...
<?php
// Ligação à BD
require_once('connections/connection.php');
// Extrair dados da BD
$query = "SELECT colunas FROM tabela";
$rsName = mysql_query($query , $connection);
// Mostrar dados
while ($row_rsName = mysql_fetch_assoc($rsName)){
echo $row_rsName[“campo1"];
echo $row_rsName[“campoN"];
}
// Fechar ligação à BD
mysql_close($connection);
?>