LabMM4 (T17 - 12/13)
-
Upload
carlos-santos -
Category
Education
-
view
831 -
download
3
description
Transcript of LabMM4 (T17 - 12/13)
PHP + MySQL: diferentes métodos de acesso ao MySQL + master-detail
Carlos SantosLabMM 4 - NTC - DeCA - UAAula 17, 02-05-2013
Diferentes métodos de acesso ao MySQL
Em PHP existem pelo 3 métodos principais de acesso ao MySQL:
• PHP’s MySQL Extension: é o método “histórico” e só permite acesso procedimental. Já não é atualizado e vai deixar de ser suportado em futuras versões do PHP (v5.5);
• PHP’s mysqli Extension: é uma versão para substituir a versão “histórica” e disponibiliza versões procedimental e orientada a objetos. Tem uma melhor performance e mais métodos;
• PDO (PHP Data Objects): é uma camada de abstração para bases de dados com suporte para MySQL e muitos outros SGBDR. Só tem versão orientada a objetos. Em teoria, permite mudar de SGBDR sem ser necessário alterar o código...
http://www.php.net/manual/en/mysqli.overview.php
Diferenças entre as APIs
http://www.php.net/manual/en/mysqlinfo.api.choosing.php
Diferenças entre as APIs
Visualizar dados de várias tabelas
Quando queremos visualizar dados que estão distribuídos por duas tabelas ligadas entre si, podemos:
• criar uma query baseado num JOIN que permita obter todos os dados;• criar vários recordsets de acordo com a informação necessária a mostrar
na página
A solução adequada depende da situação a que se aplica!
Base de dados para exemplos seguintes
Listar os mariachis
$query = "SELECT idMariachi, nome FROM Mariachi";$rsMari = mysql_query($query , $connection);
while ($row_rsMari = mysql_fetch_assoc($rsMari)){ echo $row_rsMari[“nome"];}
Listar os mariachis com a respetiva família
$query = "SELECT Mariachi.idMariachi, Mariachi.nome, Familia.nomeFamilia FROM Mariachi INNER JOIN Familia ON Mariachi.Familia_idFamilia = Familia.idFamilia";$rsMari = mysql_query($query , $connection);
while ($row_rsMari = mysql_fetch_assoc($rsMari)){ echo $row_rsMari[“nome"].” - “. $row_rsMari[“nomeFamilia”].”<br/>”;}
Listar os mariachis com família (not so good)
$query = "SELECT idMariachi, nome, Familia_idFamilia FROM Mariachi";$rsMari = mysql_query($query , $connection);
while ($row_rsMari = mysql_fetch_assoc($rsMari)){ $qFami = "SELECT nomeFamilia FROM Familia WHERE idFamilia = ".$row_rsMari[“Familia_idFamilia”]; $rsFami = mysql_query($qFami , $connection);
$row_rsFami = mysql_fetch_assoc($rsFami);
echo $row_rsMari[“nome"].” - “. $row_rsFami[“nomeFamilia].”<br/>”;}
Observações
Uma página pode ter muitos recordsets
Os valores obtidos num recordset podem ser utilizados para filtrar resultados a obter noutro recordset
Soluções com múltiplos acessos há BD são, normalmente, mais lentas
No entanto, existem circunstâncias em que a quantidade de informação resultante de um INNER JOIN pode justificar a opção por múltiplos queries!
master - detail
Nesta estrutuura de informação temos:
• uma página master que lista vários tópicos de um modo genérico;• uma página detail que permite ver os detalhes do tópico escolhido na
página master
Que informação é necessário transferir entre as páginas?
masteritem1item2item3
detaildetalhes do item
escolhido na página master
voltar
querystring: id_item.../page.php?a=5
Exemplo: master-detail
master: listar todas as famílias
detail: listar os mariachis dessa família
Exemplo: master > familias.php
$qFami = "SELECT * FROM Familia";$rsFami = mysql_query($qFami , $connection);
while ($row_rsFami = mysql_fetch_assoc($rsFami)){ $line = ‘<p><a href=”mariachisFamilia.php?id=’. $row_rsFami[“idFamilia”]. ’”>’. $row_rsFami[“nomeFamilia"]. ‘</a></p>’;
echo $line;}
os URLs na página ficam com o formato: “mariachisFamilia.php?id=3”
Exemplo: detail > mariachisFamilia.php
$idValue = intval($_GET['id']);$qMari = "SELECT * FROM Mariachi WHERE Familia_idFamilia = ".$idValue;$rsMari = mysql_query($qMari , $connection);
while ($row_rsMari = mysql_fetch_assoc($rsMari)){ $line = ‘<p>$row_rsMari[“nome”]</p>’;
echo $line;}
Como mostrar nesta página o nome da família?
• um recordset baseado numa query com join ou dois recordsets?
Exemplo: master-detail (parte 2)
master: listar todas as famílias
detail: listar os mariachis dessa família e incluir o número de relacionamentos com chicas
Exemplo: master-detail (parte 2)
Soluções a discutir:
• um query único baseado num INNER JOIN entre Mariachis e Mariachi_has_chica com operação de COUNT e filtragem pelo Mariachi?
• um query para o nome do Mariachi e um query para contar o número de registos do Mariachi em Mariachi_has_Chica?
Exemplo: master-detail (parte 2)
Problema com query único, típico destas situações:
• se um Mariachi não tiver uma ocorrência em Mariachi_has_Chica o resultado será um recordset vazio! Porquê?
• logo, não será possível mostrar os dados da informação pessoal do Mariachi
Neste cenário, a solução a adotar deve ser a segunda!
... ou ainda melhor... uma solução com OUTER JOIN
• TPC -> implementar esta solução :)
Exemplo: master-detail (parte 2)
Por vezes é necessário ter partes do código que só são executadas se um determinado recordset está ou não vazio. Essas zonas são designadas por zonas condicionais.
Por exemplo:
• se o mariachi nunca teve relacionamentos devemos apresentar uma mensagem adequada: “este mariachi não é um bom exemplo :(”
• nos outros casos mostrar o número de relacionamentos
como implementar este tipo de condição?
• if ($rsName) ... // se existirem resultados ...