Arquivo do mês de Novembro, 2009

Inserir ou actualizar registo em uma petição em MySQL

Domingo, 29 de Novembro, 2009

Por vezes temos a necessidade de inserir um determinado registo e caso este já exista na base de dados queremos actualizá-lo.

Neste caso o mais comum é fazer duas petições à base de dados. Fazemos uma consulta para ver se já existe esse registo e dependendo da resposta da base de dados actualizamos ou inserimos a informação desejada.

<?php

$db = mysqli_init();
if(mysqli_real_connect($db, '127.0.0.1', 'root', '1234', 'demos'))
{
  // Consula para verificar se já existe registo na base de dados //
  $query = "SELECT COUNT(id) AS valor FROM demos WHERE id=2 LIMIT 1;";
  if(mysqli_real_query($db, $query))
  {
    $result = mysqli_store_result($db);
    $data = mysqli_fetch_array($result, MYSQLI_ASSOC);
    mysqli_free_result($result);

    if($data['valor'] > 0)
    {
      // Como existe registo, se actualiza os valores //
      $query = "UPDATE demos SET value='value' WHERE id=2 LIMIT 1;";
      if(mysqli_real_query($db, $query))
      { echo "Actualizado..."; }
      else
      { echo "Erro ao actualizar registo."; }
    }
    else
    {
      // Como não existe registo, se adiciona os valores //
      $query = "INSERT INTO demos (id, name, value, obs) VALUES ('2', 'name', 'value', 'obs');";
      if(mysqli_real_query($db, $query))
      { echo "Adicionado..."; }
      else
      { echo "Erro ao inserir registo."; }
    }
  }
  else { echo 'Erro na petição.'; };
}
else { echo 'Erro na conexão.'; };

// Total: 2 petições á base de dados //
mysqli_close($db);

?>

Gastamos 0.000035s em duas petições.

Mas será mesmo necessário tanto código e fazer realmente duas petições à base de dados?
Não se pode fazer o mesmo de uma forma mais simples?
(mais…)