PHP + MySQL: Introdução
Carlos Santos
LabMM 4 - NTC - DeCA - UA
Aula 16, 30-04-2013
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,...
novidade do ano letivo anterior...
... sem rede de segurança :)
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
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
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');
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!
2. escolher a BD
mysql_select_db(dbname);
Incluir em “connection.php”
<?php
$hostname = “localhost";
$username = “nome_utilizador";
$password = “password_utilizador";
$dbname = “nome_basededados”;
$connection = mysql_connect($hostname, $username, $password)
or trigger_error(mysql_error(), E_USER_ERROR);
mysql_select_db($dbname);
?>
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);
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
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”
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"];
}
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];
}
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.
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!
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);
?>
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);
?>

LabMM4 (T16 - 12/13) - PHP + MySQL

  • 1.
    PHP + MySQL:Introdução Carlos Santos LabMM 4 - NTC - DeCA - UA Aula 16, 30-04-2013
  • 2.
    objetivos do módulo Criarsí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 anoletivo anterior... ... sem rede de segurança :)
  • 4.
    etapas 1. estabelecer ligaçãocom 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çãoao 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çãoao 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çãoao 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!
  • 8.
    2. escolher aBD mysql_select_db(dbname); Incluir em “connection.php” <?php $hostname = “localhost"; $username = “nome_utilizador"; $password = “password_utilizador"; $dbname = “nome_basededados”; $connection = mysql_connect($hostname, $username, $password) or trigger_error(mysql_error(), E_USER_ERROR); mysql_select_db($dbname); ?>
  • 9.
    3. extrair dadosda 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 dadospara 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 dadospara 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 dadospara 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çãoao 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); ?>