Trabalhar com inputs do tipo text ou textareas utilizando HTML e PHP é relativamente simples. Seu valor é o mesmo que está gravado na base de dados, você só precisa conferir e exibir no código. Por outro lado, quando trabalhamos com inputs do tipo radio ou checkbox, seu valor é fixo, não pode ser alterado e, em alguns casos, nem mesmo exibido.

Inputs tipo checkbox e radio não exibem valores na tela do usuário, apenas uma opção para ser selecionada.

Inputs tipo checkbox e radio

Inputs tipo checkbox e radio

Vamos entender como tratar o envio de formulários com inputs de radio e checkbox abaixo.

Analisando os dados

Antes de qualquer coisa, precisamos analisar os dados enviados pelo nosso formulário, então vamos criar tal formulário em um arquivo PHP, que envia dados para si próprio (apenas para facilitar nossa vida):

<form action="" method="POST">
	<input type="checkbox" name="exemplo" id="exemplo" value="1">
	<label for="exemplo">Exemplo de checkbox</label><br><br>
	
	<p><label for="entendeu">Entendeu?</label></p>
	
	<input type="radio" name="entendeu" value="1"> Sim
	
	<input type="radio" name="entendeu" id="entendeu" value="0"> Não
	
	<br><br>
	
	<input type="submit" value="Enviar">
</form>

Antes do formulário, vamos analisar o que será postado pelo mesmo quando ele for enviado.

Para fazer isso, utilize o trecho de código abaixo.

<?php
/* 
Verifica se algo foi postado pelo nosso formulário.
Neste caso o tipo do formulário deverá ser POST, e o 
POST não deve estar vazio.
*/
if ( 'POST' === $_SERVER['REQUEST_METHOD'] && ! empty( $_POST ) ) {

	// Abre uma tag <pre>
	echo '<pre>';

	// Exibe o conteúdo do post
	print_r( $_POST );
	
	// Fecha a tag pre
	echo '</pre>';
}
?>

Na primeira parte do código acima, simplesmente verificamos se o formulário foi enviado para o navegador e se o HTTP POST não está vazio. Se não foi postado ou o post estiver vazio, não faremos nada.

Com isso em mente, se você enviar o formulário que criamos anteriormente sem marcar nada, nada é feito.

Caso marque um dos campos, terá o seguinte:

Array
(
    [exemplo] => 1
    [entendeu] => 0
)

Um array com o nome e valores dos campos do formulário.

Você pode acessar qualquer valor com o seguinte formato:

echo $_POST['entendeu'];
echo $_POST['exemplo'];

Ou da forma mais longa, evitando erros:

<?php
/* 
Verifica se algo foi postado pelo nosso formulário.
Neste caso o tipo do formulário deverá ser POST, e o 
POST não deve estar vazio.
*/
if ( 'POST' === $_SERVER['REQUEST_METHOD'] && ! empty( $_POST ) ) {

	// Verifica o campo de nome "entendeu"
	if ( ! empty( $_POST['entendeu'] ) ) {
		// Exibe os dados do campo entendeu
		echo 'Endendeu = ' . $_POST['entendeu'] . '<br>';
	}

	// Verifica o campo de nome "exemplo"
	if ( ! empty( $_POST['exemplo'] ) ) {
		// Exibe os dados do campo exemplo
		echo 'Exemplo = ' . $_POST['exemplo'] . '<br>';
	}
	
}
?>

Agora vamos manipular um pouco os dados com PHP.

Remarcando inputs depois do formulário enviado

Como estamos tratando de formulários HTML com PHP puro, assim que os dados forem enviados para o servidor, nada que o usuário havia marcado ou escrito estará marcado ou escrito. Existem várias maneiras para corrigir este problema, uma delas é verificar se os dados foram salvos na base de dados, buscar esses dados e exibi-los; a outra é exibir os próprios dados do que o usuário postou anteriormente (ou ambas, dependendo do caso).

O problema é que não podemos fazer isso com inputs de radio ou checkbox, já que não vamos exibir seu valor para o usuário, vamos apenas remarcar o campo se ele tiver sido marcado anteriormente.

Lembre-se que para marcar um input do tipo checkbox ou radio, basta adicionar o atributo “checked” no mesmo. Exemplo:

<input type="radio" id="entendeu" name="entendeu" value="1" checked> Sim

Para fazer a verificação se o usuário marcou tal input antes de enviar o formulário, faremos o seguinte:

<form action="" method="POST">
	<?php 
	// Variável que vai marcar nosso input de exemplo
	$marca_exemplo = null;
	
	// Verifica se o campo exemplo tem algum valor
	// E se este valor é igual a 1
	if ( ! empty( $_POST['exemplo'] ) && $_POST['exemplo'] == 1 ) {
		// Modifica o valor da variável 
		$marca_exemplo = ' checked ';
	}	
	?>
	<input <?php echo $marca_exemplo?> type="checkbox" name="exemplo" id="exemplo" value="1">
	<label for="exemplo">Exemplo de checkbox</label><br><br>
	
	<p><label for="entendeu">Entendeu?</label></p>
	
	<?php 
	// Marca "entendeu"
	$marca_entendeu_sim = null;
	$marca_entendeu_nao = null;
	
	// Verifica se o campo entendeu tem algum valor
	// E se este valor é igual a 1
	if ( ! empty( $_POST['entendeu'] ) && $_POST['entendeu'] == 1 ) {
		// Modifica o valor da variável 
		$marca_entendeu_sim = ' checked ';
	} elseif ( empty( $_POST['entendeu'] ) ) {
		// Modifica o valor da variável 
		$marca_entendeu_nao =' checked ';
	}
	?>	
	
	<input <?php echo $marca_entendeu_sim?> type="radio" id="entendeu" name="entendeu" value="1"> Sim
	
	<input <?php echo $marca_entendeu_nao?> type="radio" name="entendeu" value="0"> Não
	
	<br><br>
	
	<input type="submit" value="Enviar">
</form>

Agora, toda vez que o formulário for enviado, os inputs serão remarcados conforme estavam antes da atualização da página.

Nos trechos de código PHP acima, simplesmente criamos uma variável sem valor algum (null) e só modificamos seu valor se o valor do input não estiver vazio. Fizemos isso em ambas as partes do código.

Cuidados com checkbox e radio com HTML e PHP

Um dos primeiros cuidados que você precisa ter quando for trabalhar com inputs do tipo checkbox ou radio, é que eles não configuram nenhuma chave no POST para o PHP quando não forem marcados.

Isso pode gerar um erro de Notice se você fizer o seguinte:

<?php
/* 
Verifica se algo foi postado pelo nosso formulário.
Neste caso o tipo do formulário deverá ser POST, e o 
POST não deve estar vazio.
*/
if ( 'POST' === $_SERVER['REQUEST_METHOD'] && ! empty( $_POST ) ) {

	// Erro de Notice se o input não for marcado
	echo $_POST['exemplo'];
	
}
?>

Para prevenir isso, você deve checar se a chave está configurada no array da seguinte maneira:

<?php
/* 
Verifica se algo foi postado pelo nosso formulário.
Neste caso o tipo do formulário deverá ser POST, e o 
POST não deve estar vazio.
*/
if ( 'POST' === $_SERVER['REQUEST_METHOD'] && ! empty( $_POST ) ) {

	// Configura o valor de exemplo em uma variável se a chave
	// estiver configurada
	$exemplo = !empty($_POST['exemplo']) ? $_POST['exemplo'] : '';
	
	// Agora você pode utilizar a variável $exemplo sem medo
	echo $exemplo;
	
}
?>

Além de mais seguro, seu código fica mais simples.

Concluindo

Inputs de checkbox e radio são muito úteis para opções que o usuário não tem que digitar nada, apenas concordar com algo. Além disso, este tipo de opção evita erros que o usuário possa gerar no sistema, já que o valor será escolhido por você e é certeza que este será o mesmo que você escolheu sempre.

Outro ponto que gosto muito nos inputs de checkbox e radio é que você pode configurar valores inteiros na base de dados, ou seja, 1 para sim e 0 para não, ou 1 para concordar e vazio para discordar. Ocupa menos espaço e facilita minha vida como desenvolvedor.

Caso tenha alguma dúvida, não hesite em deixar seu comentário.