PHP + MySQL: insert, update e delete
Carlos Santos
LabMM 4 - NTC - DeCA - UA
Aula PHP+MySQL 04, 10-05-2012
inserção complexa

Como inserir um novo CD na seguinte BD?
Formulário

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 selecionar logo vários estilos
Formulário

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

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 no
       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!

        • mysql_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 = mysql_query($query , $connection);
//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 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 = mysql_query($query , $connection);
Inserções em múltiplas tabelas

No formulário para adicionar um CD pretende-se 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”

PHP MySQL Aula 04

  • 1.
    PHP + MySQL:insert, update e delete Carlos Santos LabMM 4 - NTC - DeCA - UA Aula PHP+MySQL 04, 10-05-2012
  • 2.
    inserção complexa Como inserirum novo CD na seguinte BD?
  • 3.
    Formulário Possível estrutura parao 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 selecionar logo vários estilos
  • 4.
    Formulário Possível estrutura parao 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 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 no 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! • mysql_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 • 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 = mysql_query($query , $connection); //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 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 = mysql_query($query , $connection);
  • 13.
    Inserções em múltiplastabelas No formulário para adicionar um CD pretende-se 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”