W3docs

Guia Completo para Atualizar Dados em um Banco de Dados MySQL com PHP

Atualizar dados em um banco de dados é uma operação essencial. Este artigo fornece um guia passo a passo com PHP e MySQL de forma segura.

Atualizar dados é uma das quatro operações fundamentais de banco de dados (junto com inserir, selecionar e excluir registros). Qualquer aplicação que permite aos usuários editar um perfil, marcar uma tarefa como concluída ou alterar um preço depende dessa operação. Este capítulo mostra como executar uma consulta UPDATE em PHP com segurança — usando prepared statements — e como verificar exatamente quantas linhas foram alteradas.

Este capítulo pressupõe que você já possui uma conexão com o banco de dados funcionando. Os exemplos utilizam mysqli; uma versão equivalente com PDO está incluída ao final.

Entendendo a Sintaxe do PHP MySQL UPDATE

A instrução UPDATE altera os valores de linhas existentes. Sua estrutura é a mesma quer você a execute no console do MySQL ou a partir do PHP:

UPDATE table_name
SET column1 = value1, column2 = value2
WHERE some_column = some_value;
  • table_name — a tabela cujas linhas você deseja alterar.
  • SET — as colunas a modificar e seus novos valores. As colunas não listadas permanecem intactas.
  • WHERE — quais linhas alterar. Essa cláusula é fundamental. Se você a omitir, todas as linhas da tabela serão atualizadas.

O erro de UPDATE mais comum — e mais prejudicial — é esquecer a cláusula WHERE. UPDATE users SET active = 0 desativa todos os usuários da tabela, não apenas um. Sempre verifique a condição WHERE antes de executar uma atualização em dados reais.

Atualizando Dados com um Prepared Statement

Nunca construa uma consulta UPDATE concatenando entradas do usuário diretamente na string SQL — isso o expõe a injeção de SQL. Em vez disso, use um prepared statement: escreva a consulta com marcadores ?, depois vincule os valores separadamente para que o banco de dados os trate estritamente como dados.

<?php
// Reuse your connection — in practice: require 'db_connect.php';
$conn = mysqli_connect("localhost", "username", "password", "database_name");

if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql  = "UPDATE users SET email = ?, age = ? WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);

$email = "[email protected]";
$age   = 31;
$id    = 1;

// Type string: s = string, i = integer, d = double, b = blob.
// One letter per placeholder, in order.
mysqli_stmt_bind_param($stmt, "sii", $email, $age, $id);

if (mysqli_stmt_execute($stmt)) {
    echo "Record updated successfully";
} else {
    echo "Error updating record: " . mysqli_stmt_error($stmt);
}

mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

Como funciona, passo a passo:

  1. mysqli_prepare() envia o modelo da consulta (com marcadores ?) ao MySQL.
  2. mysqli_stmt_bind_param() vincula suas variáveis PHP a esses marcadores. O primeiro argumento, "sii", declara o tipo de cada valor na ordem: uma string, depois dois inteiros. O número e a ordem das letras devem corresponder exatamente aos marcadores.
  3. mysqli_stmt_execute() executa a consulta, retornando true em caso de sucesso e false em caso de falha.

Verificando Quantas Linhas Foram Alteradas

O retorno true de mysqli_stmt_execute() significa apenas que a consulta foi executada sem erros — isso não significa que alguma linha foi realmente alterada. Se a condição WHERE não corresponder a nenhuma linha (ou se os novos valores forem idênticos aos anteriores), zero linhas serão afetadas. Use mysqli_stmt_affected_rows() para descobrir:

<?php
$conn = mysqli_connect("localhost", "username", "password", "database_name");

$sql  = "UPDATE users SET age = ? WHERE id = ?";
$stmt = mysqli_prepare($conn, $sql);

$age = 40;
$id  = 1;
mysqli_stmt_bind_param($stmt, "ii", $age, $id);
mysqli_stmt_execute($stmt);

$rows = mysqli_stmt_affected_rows($stmt);
if ($rows > 0) {
    echo "Updated {$rows} row(s).";
} else {
    echo "No row matched, or the value was already up to date.";
}

mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

Essa distinção importa em aplicações reais: um botão "Salvar" que reporta sucesso mesmo quando nenhum registro foi encontrado pode ocultar bugs dos seus usuários.

Atualizando Dados com PDO

O PDO é a alternativa mais portável ao mysqli — o mesmo código funciona com MySQL, PostgreSQL, SQLite e outros, e marcadores nomeados tornam consultas mais longas mais fáceis de ler:

<?php
$pdo = new PDO(
    "mysql:host=localhost;dbname=database_name;charset=utf8mb4",
    "username",
    "password",
    [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);

$stmt = $pdo->prepare(
    "UPDATE users SET email = :email, age = :age WHERE id = :id"
);

$stmt->execute([
    ':email' => '[email protected]',
    ':age'   => 31,
    ':id'    => 1,
]);

echo "Updated " . $stmt->rowCount() . " row(s).";
?>

Com PDO::ERRMODE_EXCEPTION definido, uma consulta com falha lança uma exceção que você pode capturar, em vez de falhar silenciosamente. rowCount() é o equivalente PDO de mysqli_stmt_affected_rows().

Boas Práticas

  • Sempre inclua uma cláusula WHERE, a menos que você realmente queira atualizar todas as linhas.
  • Use prepared statements para qualquer valor proveniente de entrada do usuário — nunca concatenação de strings.
  • Combine a string de tipo de vinculação ("sii", etc.) com os tipos reais das suas variáveis para evitar conversões silenciosas.
  • Envolva atualizações em múltiplas tabelas em uma transação para que todas sejam bem-sucedidas ou todas sejam revertidas.
  • Faça backup de dados importantes antes de executar atualizações grandes ou pontuais em produção.

Prática

Prática
O que é importante observar ao atualizar dados com PHP no MySQL?
O que é importante observar ao atualizar dados com PHP no MySQL?
Was this page helpful?