Jump to content

[Resolvido] Manipular checkbox em PHP sem o submit


Recommended Posts

Posted (edited)

Boas amigos,

Então é assim, estou desenvolvendo um Painel de Administração para a minha página e neste momento encontro-me na página de gestão de utilzadores, como tal, vou buscar à base de dados a sua informação e a mostro numa tabela. Nesta tabela existem umas checkboxes, que deverão ser selecionadas para serem posteriormente manipuladas no PHP.

Não estou usando submit porque estou usando um dropdown e não um botão...

Código:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Utilizadores - Administração</title>
<link rel="stylesheet" href="../includes/Messi/messi.min.css" />
<script src="js/jquery/jquery-1.9.1.min.js"></script>
<script src="../includes/Messi/messi.min.js"></script>
</head>
<body>
<?php
if(!isset($_SESSION)) {
session_start();
}

$page = 'adm_users';
$sub_page = 'adm_users_list';

require_once('../includes/basedados.php');

// Se o utilizador não estiver logado, apresentar mensagem de erro.
if(!isset($_SESSION['utilizador_id'])) { ?>
<h2>Não tem permissões para visualizar esta página</h2>
<p>É necessário ter login efetuado para visualizar esta página.
<br>Clique <a href="index.php">aqui</a> e efetue o login.
<?php
// Se o utilizador estiver logado, prosseguir até próxima verificação...
} else {
// Se o utilizador não for Administrador, apresentar mensagem de erro.
if(!$_SESSION['nivel_utilizador'] == 2) { ?>
  <h2>Não tem permissões para visualizar esta página</h2>
	<p>É necessário ter privilégios de Administrador para visualizar o conteúdo desta página.
  <?php
header("refresh: 5; ../index.php");

// Se o utilizador estivar logado e for Administrador, apresentar o conteúdo da página.
} else {
		include 'temas/default/cabecalho.php';
		include 'temas/default/navegacao.php';
?>

<div id="content">

<!--  start page-heading -->
<div id="page-heading">
<h1>Utilizadores</h1>
</div>
<!-- end page-heading -->

<table border="0" width="100%" cellpadding="0" cellspacing="0" id="content-table">
<tr>
<th rowspan="3" class="sized"><img src="images/shared/side_shadowleft.jpg" width="20" height="300" alt="" /></th>
<th class="topleft"></th>
<td id="tbl-border-top"> </td>
<th class="topright"></th>
<th rowspan="3" class="sized"><img src="images/shared/side_shadowright.jpg" width="20" height="300" alt="" /></th>
</tr>
<tr>
<td id="tbl-border-left"></td>
<td>
<!--  start content-table-inner ...................................................................... START -->
<div id="content-table-inner">

<!--  start table-content  -->
<div id="table-content">
<!--  start product-table ..................................................................................... -->
<form id="user_form" action="utilizadores.php" method="POST">
<table border="0" width="100%" cellpadding="0" cellspacing="0" id="product-table">
<tr>
<th class="table-header-check"><a id="toggle-all" ></a> </th>
<th class="table-header-repeat line-left minwidth-1"><a href="">Utilizador</a> </th>
<th class="table-header-repeat line-left minwidth-1"><a href="">Nome</a></th>
<th class="table-header-repeat line-left"><a href="">Email</a></th>
<th class="table-header-repeat line-left"><a href="">Data Registo</a></th>
<th class="table-header-repeat line-left"><a href="">Último Login</a></th>
<th class="table-header-options line-left"><a href="">Ativado</a></th>
</tr>

<?php
$mostrarUtilizadores = $conn->query("SELECT * FROM utilizadores ORDER BY utilizador_id DESC");
while($output = $mostrarUtilizadores->fetch(PDO::FETCH_ASSOC)) { ?>
<tr>
<td><input type="checkbox" value="<?php echo $output['utilizador_id']; ?>" name="selec[]" /></td>
<td><?php echo $output['utilizador']; ?></td>
<td><?php echo $output['nome'].' '.$output['sobrenome']; ?></td>
<td><a href="mailto:<?php echo $output['email']; ?>"><?php echo $output['email']; ?></a></td>
<td><?php echo $output['data_registo']; ?></td>
<td><?php echo $output['data_ultimo_login']; ?></td>
<td><?php if(($output['ativado']) == 1) echo 'Sim'; else echo 'Não'; ?></td>
</tr>
<?php } ?>
</table>
</form>
<!--  end product-table................................... -->
</div>
<!--  end content-table  -->

<!--  start actions-box ............................................... -->
<div id="actions-box">
<a href="" class="action-slider"></a>
<div id="actions-box-slider">
  <a href="?accao=editar" onclick="document.getElementById('user_form').submit(); return false;" class="action-edit">Editar</a>
<a href="?accao=apagar" onclick="document.getElementById('user_form').submit(); return false;" class="action-delete">Apagar</a>
</div>
<div class="clear"></div>
</div>
<!-- end actions-box........... -->

<!--  start paging..................................................... -->
<table border="0" cellpadding="0" cellspacing="0" id="paging-table">
<tr>
<td>
<a href="" class="page-far-left"></a>
<a href="" class="page-left"></a>
<div id="page-info">Página <strong>1</strong> / 15</div>
<a href="" class="page-right"></a>
<a href="" class="page-far-right"></a>
</td>
</tr>
</table>
<!--  end paging................ -->

<div class="clear"></div>

</div>
<!--  end content-table-inner ............................................END  -->
</td>
<td id="tbl-border-right"></td>
</tr>
<tr>
<th class="sized bottomleft"></th>
<td id="tbl-border-bottom"> </td>
<th class="sized bottomright"></th>
</tr>
</table>
<div class="clear"> </div>

</div>
</body>
<?php

function apagar() {
if(isset($_POST['selec'])) {
	if(sizeof($_POST['selec']) > 1) {
		echo "<script>";
		echo "new Messi('Deverá apenas selecionar um Utilizador.', {title: 'Erro', titleClass: 'anim error', buttons: [{id: 0, label: 'Fechar', val: 'X'}]});";
		echo "</script>";
	} else {
		foreach($_POST['selec'] as $key => $value) {
  try {
				$sql = $conn->prepare("DELETE * FROM ".TB_USER." WHERE utilizador_id = ?");
  $sql->execute(array($value));
				echo "<script>";
				echo "new Messi('Utilizador apagado com sucesso!', {title: 'Informação', titleClass: 'success', buttons: [{id: 0, label: 'Close', val: 'X'}]});";
				echo "</script>";
   } catch(PDOException $ex) {
  echo 'ERRO: ' . $ex->getMessage();
}
		}
	}
} else {
	echo "<script>";
	echo "new Messi('É necessário selecionar um Utilizador.', {title: 'Erro', titleClass: 'anim error', buttons: [{id: 0, label: 'Fechar', val: 'X'}]});";
	echo "</script>";
}
}
function editar() {
echo "<script>";
echo "new Messi('Função Editar', {title: 'Informação', titleClass: 'success', buttons: [{id: 0, label: 'Close', val: 'X'}]});";
echo "</script>";
}


if (isset($_GET['accao'])) {
switch($_GET['accao']) {
	case 'apagar': apagar(); break;
	case 'editar': editar(); break;
}
}

include 'temas/default/rodape.php';
} } ?>

Aqui está o que estou falando:

checkboxes.jpg

Alguma ajuda?

Edited by soueu
Posted

A dúvida está no Tópico: Manipular checkbox em PHP sem o submit

Sai sempre a mensagem: "É necessário selecionar um Utilizador", o que quer dizer que a função não está a detetar a seleção no checkbox...

Ou seja, as opções da lista dropdown (Editar, Apagar) não estão a interagir com as opções marcadas no checkbox, e eu queria saber como o fazer sem ter que usar um botão Submit. Queria apenas marcar a opção e selecionar lá na lista o Editar ou Apagar...

PS: Hmm...estranho, pensei que o tinha feito, peço desculpa.

Posted

a cena é que tu tas a usar um link apenas, nao envia conteudo (post)

mete as checkbox's, alias, a tabela dentro de um form

e adiciona aos links um

[b]onclick="document.getElementById('my_form').submit(); return false;"[/b]

não estou certo se rezolve completamente, mas em parte ja vai funcionar pois ja envia um post 😉

  • Vote 1

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted

Obrigado pela resposta, I-NOZex.

Eu tentei usar antes, mas não consegui pois não tinha a certeza como enviar o conteudo da FORM para o PHP.

Mesmo assim não consigo enviar o formulário...

Código Atual:

<tr>
 <form id="user_form" method="POST">
<td><input type="checkbox" name="selec[]" /></td>
 </form>
</tr>

<div id="actions-box">
 <a href="" class="action-slider"></a>
 <div id="actions-box-slider">
<a href="?accao=editar" onclick="document.getElementById('user_form').submit(); return false;" class="action-edit">Editar</a>
<a href="?accao=apagar" onclick="document.getElementById('user_form').submit(); return false;" class="action-delete">Apagar</a>
 </div>
 <div class="clear"></div>
</div>

:S

Posted

espero nao tar em erro, mas o que te falta é adicionares um atributo value as checkbox, nessa value metes o id ao user que se refere, deste genero:

    <td><input type="checkbox" value="1" name="selec[]" /></td>
    <td><input type="checkbox" value="2" name="selec[]" /></td>

ele assim ja envia uma valor correcto no post

se nao tiver nenhuma check selecionada, nao envia nenhum valor no selec[], se tiver ele envia as que tao 😉

se resolver, mete like 😄 eu testei aqui e pareceu-me ser o que falta

  • Vote 1

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted

Agora fiquei abananado :S

Aqui está o meu código:

<?php
  $mostrarUtilizadores = $conn->query("SELECT * FROM utilizadores ORDER BY utilizador_id DESC");
while($output = $mostrarUtilizadores->fetch(PDO::FETCH_ASSOC)) { ?>
<tr>
  <form id="user_form" method="POST">
  <td><input type="checkbox" value="1" name="selec[]" /></td>
  <td><?php echo $output['utilizador']; ?></td>
  <td><?php echo $output['nome'].' '.$output['sobrenome']; ?></td>
  <td><a href="mailto:<?php echo $output['email']; ?>"><?php echo $output['email']; ?></a></td>
  <td><?php echo $output['data_registo']; ?></td>
  <td><?php echo $output['data_ultimo_login']; ?></td>
  <td><?php if(($output['ativado']) == 1) echo 'Sim'; else echo 'Não'; ?></td>
</form>
</tr>
<?php } ?>
</table>
<!--  end product-table................................... -->
</form>
</div>
<!--  end content-table  -->

<!--  start actions-box ............................................... -->
<div id="actions-box">
<a href="" class="action-slider"></a>
<div id="actions-box-slider">
  <a href="?accao=editar" onclick="document.getElementById('user_form').submit(); return false;" class="action-edit">Editar</a>
<a href="?accao=apagar" onclick="document.getElementById('user_form').submit(); return false;" class="action-delete">Apagar</a>
</div>
<div class="clear"></div>
</div>
<!-- end actions-box........... -->


function apagar() {
if(isset($_POST['selec'])) {
	if(sizeof($_POST['selec']) == 2) {
		echo "<script>";
		echo "Deverá apenas selecionar um Utilizador";
		echo "</script>";
	} else {
		foreach($_POST['selec'] as $key => $value) {
			echo $value;
		}
	}
} else {
	echo "<script>";
	echo "É necessário selecionar um Utilizador";
	echo "</script>";
}
}
function editar() {
echo "<script>";
echo "Função Editar";
echo "</script>";
}


if (isset($_GET['accao'])) {
switch($_GET['accao']) {
	case 'apagar': apagar(); break;
	case 'editar': editar(); break;
}
}

Como ficaria no meu caso?

Posted (edited)

em vez de

<td><input type="checkbox" value="1" name="selec[]" /></td>

metes

<td><input type="checkbox" value="<?=$output['id']; ?>" name="selec[]" /></td>

presumindo que a chave primaria se chama ID...

e o form deve de englobar a tabela, ou seja, deves de abrir a tag antes do <table> e fechar depois do </table>

Edited by I-NOZex
  • Vote 1

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted

eheh, sempre disposto a ajudar, se bem que não o fazia assiduamente mas decidi dar um maior contributo a comunidade, ja por varias vezes me terem solucionado problemas.

Ainda bem que já funciona 😉

na real o teu unico problema era so fazer o submit com um <a> link, ao qual so faltava aquela instrução js no onclick, faltava-te o formulario tambem, mas a solução para fazer um submit sem submit button é por via de js

Boas programações 👍

  • Vote 1

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
  • 5 months later...
Posted

Peço desculpa por estar reabrindo este tópico, mas depois de algum tempo testando o meu projeto, não consigo colocar a funcionar o checkbox...

Eu penso que o

 $_POST['selec'] 

não está funcionando corretamente, pois sempre que seleciono uma checkbox recebo a mensagem de output "Deverá apenas selecionar um Utilizador".

Deixo aqui o código completo da pagina:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Utilizadores - Administração</title>
<link rel="stylesheet" href="../includes/Messi/messi.min.css" />
<script src="../includes/Messi/messi.min.js"></script>
</head>
<body>
<?php
if(!isset($_SESSION)) {
session_start();
}

$page = 'adm_users';
$sub_page = 'adm_users_list';

require_once('../includes/basedados.php');

// Se o utilizador não estiver logado, apresentar mensagem de erro.
if(!isset($_SESSION['utilizador_id'])) { ?>
<h2>Não tem permissões para visualizar esta página</h2>
<p>É necessário ter login efetuado para visualizar esta página.
<br>Clique <a href="index.php">aqui</a> e efetue o login.
<?php
// Se o utilizador estiver logado, prosseguir até próxima verificação...
} else {
// Se o utilizador não for Administrador, apresentar mensagem de erro.
if(!$_SESSION['nivel_utilizador'] == 2) { ?>
  <h2>Não tem permissões para visualizar esta página</h2>
	<p>É necessário ter privilégios de Administrador para visualizar o conteúdo desta página.
  <?php
header("refresh: 5; ../index.php");

// Se o utilizador estivar logado e for Administrador, apresentar o conteúdo da página.
} else {
		include 'temas/default/cabecalho.php';
		include 'temas/default/navegacao.php';
?>

<div id="content">

<!--  start page-heading -->
<div id="page-heading">
<h1>Utilizadores</h1>
</div>
<!-- end page-heading -->

<table border="0" width="100%" cellpadding="0" cellspacing="0" id="content-table">
<tr>
<th rowspan="3" class="sized"><img src="images/shared/side_shadowleft.jpg" width="20" height="300" alt="" /></th>
<th class="topleft"></th>
<td id="tbl-border-top"> </td>
<th class="topright"></th>
<th rowspan="3" class="sized"><img src="images/shared/side_shadowright.jpg" width="20" height="300" alt="" /></th>
</tr>
<tr>
<td id="tbl-border-left"></td>
<td>
<!--  start content-table-inner ...................................................................... START -->
<div id="content-table-inner">

<!--  start table-content  -->
<div id="table-content">
<!--  start product-table ..................................................................................... -->
<form id="mainform" action="">
<form id="user_form" method="POST">
<table border="0" width="100%" cellpadding="0" cellspacing="0" id="product-table">
<tr>
<th class="table-header-check"><a id="toggle-all" ></a> </th>
<th class="table-header-repeat line-left minwidth-1"><a href="">Utilizador</a> </th>
<th class="table-header-repeat line-left minwidth-1"><a href="">Nome</a></th>
<th class="table-header-repeat line-left"><a href="">Email</a></th>
<th class="table-header-repeat line-left"><a href="">Data Registo</a></th>
<th class="table-header-repeat line-left"><a href="">Último Login</a></th>
<th class="table-header-options line-left"><a href="">Ativado</a></th>
</tr>

<?php
  $mostrarUtilizadores = $conn->query("SELECT * FROM utilizadores ORDER BY utilizador_id DESC");
while($output = $mostrarUtilizadores->fetch(PDO::FETCH_ASSOC)) { ?>
  <tr>
  <td><input type="checkbox" value="<?php echo $output['utilizador_id']; ?>" name="selec[]" /></td>
  <td><?php echo $output['utilizador']; ?></td>
  <td><?php echo $output['nome'].' '.$output['sobrenome']; ?></td>
  <td><a href="mailto:<?php echo $output['email']; ?>"><?php echo $output['email']; ?></a></td>
  <td><?php echo $output['data_registo']; ?></td>
  <td><?php echo $output['data_ultimo_login']; ?></td>
  <td><?php if(($output['ativado']) == 1) echo 'Sim'; else echo 'Não'; ?></td>
  </tr>
<?php } ?>
</table>
</form>
</form>
<!--  end product-table................................... -->
</div>
<!--  end content-table  -->

<!--  start actions-box ............................................... -->
<div id="actions-box">
<a href="" class="action-slider"></a>
<div id="actions-box-slider">
  <a href="?accao=editar" onclick="document.getElementById('user_form').submit(); return false;" class="action-edit">Editar</a>
<a href="?accao=apagar" onclick="document.getElementById('user_form').submit(); return false;" class="action-delete">Apagar</a>
</div>
<div class="clear"></div>
</div>
<!-- end actions-box........... -->

<!--  start paging..................................................... -->
<table border="0" cellpadding="0" cellspacing="0" id="paging-table">
<tr>
<td>
<a href="" class="page-far-left"></a>
<a href="" class="page-left"></a>
<div id="page-info">Página <strong>1</strong> / 15</div>
<a href="" class="page-right"></a>
<a href="" class="page-far-right"></a>
</td>
</tr>
</table>
<!--  end paging................ -->

<div class="clear"></div>

</div>
<!--  end content-table-inner ............................................END  -->
</td>
<td id="tbl-border-right"></td>
</tr>
<tr>
<th class="sized bottomleft"></th>
<td id="tbl-border-bottom"> </td>
<th class="sized bottomright"></th>
</tr>
</table>
<div class="clear"> </div>

</div>
</body>
<?php

function apagar() {
if(isset($_POST['selec'])) {
	if(sizeof($_POST['selec']) == 2) {
		echo "<script>";
		echo "new Messi('Deverá apenas selecionar um Utilizador.', {title: 'Erro', titleClass: 'anim error', buttons: [{id: 0, label: 'Fechar', val: 'X'}]});";
		echo "</script>";
	} else {
		foreach($_POST['selec'] as $key => $value) {
  try {
				$sql = $conn->prepare("DELETE * FROM ".TB_USER." WHERE utilizador_id = ?");
  $sql->execute(array($value));
				echo "<script>";
				echo "new Messi('Utilizador apagado com sucesso!', {title: 'Informação', titleClass: 'success', buttons: [{id: 0, label: 'Close', val: 'X'}]});";
				echo "</script>";
   } catch(PDOException $ex) {
  echo 'ERRO: ' . $ex->getMessage();
}
		}
	}
} else {
	echo "<script>";
	echo "new Messi('É necessário selecionar um Utilizador.', {title: 'Erro', titleClass: 'anim error', buttons: [{id: 0, label: 'Fechar', val: 'X'}]});";
	echo "</script>";
}
}
function editar() {
echo "<script>";
echo "new Messi('Função Editar', {title: 'Informação', titleClass: 'success', buttons: [{id: 0, label: 'Close', val: 'X'}]});";
echo "</script>";
}


if (isset($_GET['accao'])) {
switch($_GET['accao']) {
	case 'apagar': apagar(); break;
	case 'editar': editar(); break;
}
}

include 'temas/default/rodape.php';
} } ?>
Posted

Mostra o HTML de output disso + o javascript (exceto bibliotecas externas), sff.

  • Vote 1

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Posted

eu fiz aqui uns peqenos testes com base no teu codigo, e se as checkboxs selecionadas, forem apenas 2, é que mostra essa mensagem, se for apenas uma ou 3 ou mais, nao manda mensagem nenhuma, ou seja, precisas de mudar essa condiçao para isto:

if(sizeof($_POST['selec']) > 1)
  • Vote 1

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net
Posted (edited)

Mostra o HTML de output disso + o javascript (exceto bibliotecas externas), sff.

Não entendi bem... Postei o código completo, só não postei a biblioteca (externa) que estou usando. Messi: http://marcosesperon.es/apps/messi/

As restantes bibliotecas inclusas não têm nada haver, são apenas do tema do site.

eu fiz aqui uns peqenos testes com base no teu codigo, e se as checkboxs selecionadas, forem apenas 2, é que mostra essa mensagem, se for apenas uma ou 3 ou mais, nao manda mensagem nenhuma, ou seja, precisas de mudar essa condiçao para isto:

if(sizeof($_POST['selec']) > 1)

Hum, faz sentido. No entando ainda obtenho o output: "É necessário selecionar um Utilizador." Quando seleciono 1 ou mais checkboxes. Se não selecionar checkbox nenhum = mesmo efeito.

É como se o PHP não reconhece-se o valor do input da form.

Edited by brunoais
removido o quote triplo
Posted (edited)

@soueu

Qual é o output do teu programa? O que é que o browser vê?

Edited by brunoais
  • Vote 1

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Posted (edited)

e explica-me porque raio tens um form dentro do outro???

Eu também estava pensando sobre isto, na verdade não sei, por alguma razão o devo ter feito, mas o facto é que se remover o "mainform" o "user_form" deixa de ser detectado.

@soueu

Qual é o output do teu programa? O que é que o browser vê?

Dá o seguinte output:

Não é possível obter a propriedade 'submit' de uma referência não definida ou nula
Edited by soueu
Posted

Definir uma action vale mais quando queremos manipular uma form por um ficheiro externo. Quando não especificamos uma action o ficheiro atual é automaticamente assumido.

De qualquer das formas, não fez diferença e retirando o primeiro form (mainform) fez com que o submit deixa-se de ter efeito 😞

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.