PHP + MySQL: insert, update e delete
Carlos Santos
LabMM 4 - NTC - DeCA - UA
Aula 21, 15-05-2013
Inserção complexa
Como inserir um novo CD na seguinte BD?
Formulário de inserção
Possível estrutura para o formulário:
• campo de texto: título CD
• drop down menu: editora
• drop down menu: interprete
• drop down menu: classificação
E os estilos a associar ao CD?
• relação de muitos para muitos
• na introdução o utilizador pode querer introduzir vários estilos
Formulário de inserção
Possível estrutura para o formulário:
• campo de texto: título CD
• drop down menu: editora
• drop down menu: interprete
• drop down menu: classificação
• check boxes: estilos
Formulário de inserção (HTML)
drop down menus (select ... option)
• value = valor da chave primária (id) do elemento
• label text = descrição do elemento
check boxes
• <input type=”checkbox” name=”campo[ ]” value=”idvalue1” />label1
<input type=”checkbox” name=”campo[ ]” value=”idvalue2” />label2
• nos resultados do post:
• $_POST[“campo”] é um array com todos os valores selecionados nas
checkboxes do formulário
• mais info: http://www.html-form-guide.com/php-form/php-form-
checkbox.html
Na inserção em PHP
Para cada instrução só é possível inserir um registo e numa única tabela!
• Inserir novo registo na tabela “cd”
• “titulo”, “editora_id”, “interprete_id” e “classificacao_id”
• obter chave primária do novo CD e guardar!
• mysqli->insert_id; // chamar logo a seguir ao insert
• Para cada estilo escolhido:
• inserir um novo registo na tabela “cd_estilo”
• utilizar sempre o id do CD introduzido anteriormente e o id de cada
uma das checkboxes selecionadas pelo utilizador no formulário
Remover registos
A remoção de um registo não pode violar as regras de integridade
referencial da BD
• se adequado, substituir a remoção pela colocação do registo num estado
inativo (através dum campo booleano na tabela)
• é necessário adequar todas as queries para terem em conta o estado dos
registos (para os mostrar ou não…)
Remover registos
Remoção de registos com a passagem de parâmetro/valor na Query
String
• id do registo a remover (apagar_familia.php?id=3)
• confirmar previamente a remoção por JS (client-side) -> “Quer mesmo
apagar a família X?”
Para uma maior segurança na remoção de registos da BD
• verificar sempre se o utilizador possui as necessárias permissões -> perfis
utilizadores
• não expor na Query String o parâmetro/valor que possibilita a edição ->
variáveis sessão ($_SESSION[“parametro”] = valor)
• qual a diferença entre uma variável “normal” e uma variável de sessão?
Remover registos
apagar_familia.php?id=3
• verificar a passagem do parâmetro/valor na Query String
• validar se é possível apagar (existe alguma chave estrangeira que tenha
uma referência a este valor?)
• apagar o registo
• dar feedback ao utilizador sobre o sucesso (ou não) da remoção!!
$idFam = $_GET["id"];
//Validações!
$query = "DELETE FROM Familia WHERE idFamilia =".$idFam;
$rsFami = mysqli->query($query);
//Feedback final
Editar registos
Edição de registos com a passagem de parâmetro/valor na Query String
• id do registo a editar (editar_familia.php?id=5)
• o id é obtido através do URL que se constrói na interface de escolha para
edição
Para uma maior segurança na edição de registos da BD
• Verificar sempre se o utilizador possui as necessárias permissões -> perfis
utilizadores
• Não expor na Query String o parâmetro/valor que possibilita a edição ->
variáveis sessão
Editar registos
O que é que tem de mudar entre um formulário para adicionar um registo
e um formulário para editar um registo?
• num formulário para adicionar
• não há um campo para a chave primária porque esse valor não existe e
não é escolhido pelo utilizador (auto incremento)
• por defeito, os campos devem estar vazios
• num formulário para editar
• o valor da chave primária é essencial para atualizar o registo correto na
BD!
• pode optar-se por ter um campo do tipo hidden no formulário para
armazenar o valor da chave primária
• os campos devem aparecer pré-preenchidos com os valores atuais do
registo
Formulário
Passos para construir um formulário de edição:
• construir um recordset com os valores do registo em edição
• adicionar todos os elementos como no formulário de inserção (drop down
menus)
• inicializar todos os campos com os valores do registo em edição
• adicionar um hidden field com o valor da chave primária do registo
$query = "UPDATE tabela
SET campo1 = "valor1", campo2 = valor2
WHERE chavePrimária = valorChavePrimária;;
$rsUpdate = mysqli->query($query);
Inserções em múltiplas tabelas
No formulário para adicionar um CD queremos permitir escolher um
interprete já existente ou adicionar um novo
• no formulário:
manter o drop down para escolher um interprete
adicionar um campo de texto para indicar um novo interprete
• no script de inserção
verificar se foi introduzido algo no campo do novo interprete
se foi -> verificar se esse interprete já existe na BD
se existir -> usar o ID (PK) do interprete já existente
se não existir -> inserir novo interprete na tabela “interprete”
obter o ID (PK) dessa inserção
se não foi -> utilizar a opção selecionada no dropdown menu
inserir o novo CD na tabela “cd”

LabMM4 (T21 - 12/13) - insert, delete e update

  • 1.
    PHP + MySQL:insert, update e delete Carlos Santos LabMM 4 - NTC - DeCA - UA Aula 21, 15-05-2013
  • 2.
    Inserção complexa Como inserirum novo CD na seguinte BD?
  • 3.
    Formulário de inserção Possívelestrutura para o formulário: • campo de texto: título CD • drop down menu: editora • drop down menu: interprete • drop down menu: classificação E os estilos a associar ao CD? • relação de muitos para muitos • na introdução o utilizador pode querer introduzir vários estilos
  • 4.
    Formulário de inserção Possívelestrutura para o formulário: • campo de texto: título CD • drop down menu: editora • drop down menu: interprete • drop down menu: classificação • check boxes: estilos
  • 5.
    Formulário de inserção(HTML) drop down menus (select ... option) • value = valor da chave primária (id) do elemento • label text = descrição do elemento check boxes • <input type=”checkbox” name=”campo[ ]” value=”idvalue1” />label1 <input type=”checkbox” name=”campo[ ]” value=”idvalue2” />label2 • nos resultados do post: • $_POST[“campo”] é um array com todos os valores selecionados nas checkboxes do formulário • mais info: http://www.html-form-guide.com/php-form/php-form- checkbox.html
  • 6.
    Na inserção emPHP Para cada instrução só é possível inserir um registo e numa única tabela! • Inserir novo registo na tabela “cd” • “titulo”, “editora_id”, “interprete_id” e “classificacao_id” • obter chave primária do novo CD e guardar! • mysqli->insert_id; // chamar logo a seguir ao insert • Para cada estilo escolhido: • inserir um novo registo na tabela “cd_estilo” • utilizar sempre o id do CD introduzido anteriormente e o id de cada uma das checkboxes selecionadas pelo utilizador no formulário
  • 7.
    Remover registos A remoçãode um registo não pode violar as regras de integridade referencial da BD • se adequado, substituir a remoção pela colocação do registo num estado inativo (através dum campo booleano na tabela) • é necessário adequar todas as queries para terem em conta o estado dos registos (para os mostrar ou não…)
  • 8.
    Remover registos Remoção deregistos com a passagem de parâmetro/valor na Query String • id do registo a remover (apagar_familia.php?id=3) • confirmar previamente a remoção por JS (client-side) -> “Quer mesmo apagar a família X?” Para uma maior segurança na remoção de registos da BD • verificar sempre se o utilizador possui as necessárias permissões -> perfis utilizadores • não expor na Query String o parâmetro/valor que possibilita a edição -> variáveis sessão ($_SESSION[“parametro”] = valor) • qual a diferença entre uma variável “normal” e uma variável de sessão?
  • 9.
    Remover registos apagar_familia.php?id=3 • verificara passagem do parâmetro/valor na Query String • validar se é possível apagar (existe alguma chave estrangeira que tenha uma referência a este valor?) • apagar o registo • dar feedback ao utilizador sobre o sucesso (ou não) da remoção!! $idFam = $_GET["id"]; //Validações! $query = "DELETE FROM Familia WHERE idFamilia =".$idFam; $rsFami = mysqli->query($query); //Feedback final
  • 10.
    Editar registos Edição deregistos com a passagem de parâmetro/valor na Query String • id do registo a editar (editar_familia.php?id=5) • o id é obtido através do URL que se constrói na interface de escolha para edição Para uma maior segurança na edição de registos da BD • Verificar sempre se o utilizador possui as necessárias permissões -> perfis utilizadores • Não expor na Query String o parâmetro/valor que possibilita a edição -> variáveis sessão
  • 11.
    Editar registos O queé que tem de mudar entre um formulário para adicionar um registo e um formulário para editar um registo? • num formulário para adicionar • não há um campo para a chave primária porque esse valor não existe e não é escolhido pelo utilizador (auto incremento) • por defeito, os campos devem estar vazios • num formulário para editar • o valor da chave primária é essencial para atualizar o registo correto na BD! • pode optar-se por ter um campo do tipo hidden no formulário para armazenar o valor da chave primária • os campos devem aparecer pré-preenchidos com os valores atuais do registo
  • 12.
    Formulário Passos para construirum formulário de edição: • construir um recordset com os valores do registo em edição • adicionar todos os elementos como no formulário de inserção (drop down menus) • inicializar todos os campos com os valores do registo em edição • adicionar um hidden field com o valor da chave primária do registo $query = "UPDATE tabela SET campo1 = "valor1", campo2 = valor2 WHERE chavePrimária = valorChavePrimária;; $rsUpdate = mysqli->query($query);
  • 13.
    Inserções em múltiplastabelas No formulário para adicionar um CD queremos permitir escolher um interprete já existente ou adicionar um novo • no formulário: manter o drop down para escolher um interprete adicionar um campo de texto para indicar um novo interprete • no script de inserção verificar se foi introduzido algo no campo do novo interprete se foi -> verificar se esse interprete já existe na BD se existir -> usar o ID (PK) do interprete já existente se não existir -> inserir novo interprete na tabela “interprete” obter o ID (PK) dessa inserção se não foi -> utilizar a opção selecionada no dropdown menu inserir o novo CD na tabela “cd”