📘 Aprender PHP do Zero — Parte 8: Imagem de Perfil do Usuário (Avatar)
Agora vamos deixar o sistema mais profissional! Aprenda a permitir que cada usuário tenha uma imagem de perfil, que será exibida no painel após o login.
Você vai aprender:
- Adicionar imagem no cadastro
- Gravar imagem no servidor
- Vincular imagem ao usuário
- Mostrar avatar no painel
- Permitir alterar a imagem de perfil
🧱 1. Alterar tabela de usuários
Adicione uma nova coluna chamada avatar
:
ALTER TABLE usuarios ADD avatar VARCHAR(255);
Essa coluna guardará o nome da imagem do perfil do usuário.
Crie também a pasta uploads/
com permissão total:
mkdir uploads
chmod 777 uploads
📝 2. Formulário de cadastro com imagem (cadastro.html)
<form method="POST" action="registrar.php" enctype="multipart/form-data">
Nome: <input name="nome"><br>
Email: <input type="email" name="email"><br>
Senha: <input type="password" name="senha"><br>
Foto de perfil: <input type="file" name="avatar"><br>
<input type="submit" value="Cadastrar">
</form>
📤 3. registrar.php (faz upload + salva no banco)
<?php
require "conexao.php";
$nome = $_POST["nome"];
$email = $_POST["email"];
$senha = md5($_POST["senha"]);
$avatar = $_FILES["avatar"];
$permitidos = ["image/png", "image/jpeg", "image/jpg"];
$max = 2 * 1024 * 1024;
$nome_avatar = "";
if ($avatar["name"] != "") {
if (!in_array($avatar["type"], $permitidos)) {
die("Tipo de imagem inválido.");
}
if ($avatar["size"] > $max) {
die("Imagem muito grande. Máximo: 2MB");
}
$nome_avatar = uniqid() . "-" . basename($avatar["name"]);
move_uploaded_file($avatar["tmp_name"], "uploads/" . $nome_avatar);
}
$stmt = $conn->prepare("INSERT INTO usuarios (nome, email, senha, avatar) VALUES (?, ?, ?, ?)");
$stmt->bind_param("ssss", $nome, $email, $senha, $nome_avatar);
$stmt->execute();
echo "Cadastro realizado com sucesso! <a href='login.html'>Ir para login</a>";
?>
🔐 4. Login e mostrar avatar (painel.php)
<?php
session_start();
require "conexao.php";
if (!isset($_SESSION["usuario"])) {
header("Location: login.html");
exit;
}
$id = $_SESSION["usuario_id"];
$res = $conn->query("SELECT * FROM usuarios WHERE id = $id");
$user = $res->fetch_assoc();
?>
<h2>Bem-vindo, <?= $user["nome"] ?></h2>
<?php if ($user["avatar"]) : ?>
<img src="uploads/<?= $user["avatar"] ?>" width="120" style="border-radius: 50%">
<?php else: ?>
<img src="uploads/default.png" width="120">
<?php endif; ?>
<br>
<a href="atualizar_foto.php">Alterar foto</a> |
<a href="logout.php">Sair</a>
♻️ 5. Formulário para atualizar imagem (atualizar_foto.php)
<?php
session_start();
if (!isset($_SESSION["usuario_id"])) {
header("Location: login.html");
exit;
}
?>
<form method="POST" action="salvar_foto.php" enctype="multipart/form-data">
Nova imagem de perfil:
<input type="file" name="avatar"><br>
<input type="submit" value="Atualizar">
</form>
salvar_foto.php
<?php
session_start();
require "conexao.php";
$id = $_SESSION["usuario_id"];
$foto = $_FILES["avatar"];
$permitidos = ["image/png", "image/jpeg"];
$max = 2 * 1024 * 1024;
if (!in_array($foto["type"], $permitidos)) {
die("Tipo inválido.");
}
if ($foto["size"] > $max) {
die("Imagem muito grande.");
}
$novo = uniqid() . "-" . basename($foto["name"]);
move_uploaded_file($foto["tmp_name"], "uploads/" . $novo);
// Atualiza no banco
$stmt = $conn->prepare("UPDATE usuarios SET avatar=? WHERE id=?");
$stmt->bind_param("si", $novo, $id);
$stmt->execute();
header("Location: painel.php");
?>
🧪 6. Testando no Android
- Use Acode ou Termux
- Crie os arquivos:
- cadastro.html
- registrar.php
- login.html, login.php
- painel.php
- atualizar_foto.php
- salvar_foto.php
- Crie a pasta
uploads/
com permissão total - Rode o servidor local:
php -S localhost:8000
- Acesse:
http://localhost:8000/cadastro.html
⚠️ O avatar aparece após login, e pode ser atualizado a qualquer momento.
✅ Conclusão da Parte 8
Você agora sabe:
- Adicionar imagem ao perfil do usuário
- Validar tipo e tamanho de imagem
- Gravar e atualizar imagens em PHP
- Exibir avatar de forma dinâmica no painel
👉 Parte 9: Você quer aprender a criar:
- Comentários entre usuários
- Relacionar usuários com posts
- Sistema de notificações básicas?
Comente se tiver dúvida!