Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

aecioferreira

[Resolvido] Checkboxes dinâmicos retornam 'Array'

Recommended Posts

Beleza galera?

 

Sei que isso já pode ter sido perguntado por aí, mas até agora não achei uma solução pra esse problema.

Seguinte...

Numa página do site eu tenho uma listagem dinâmica, contendo alguns checkboxes, nessa estrutura:

 

TITULO VISUALIZAR EXCLUIR EDITAR

NOME DA PAGINA CHECKBOX CHECKBOX CHECKBOX

 

e um botão gravar.

 

Já li que teria que passar esses checkboxes em array (com isso, os names e as ids ficaram visualizar[],editar[],excluir[]) pra página de gravação do banco de dados.Nessa pagina de gravação dos dados passados eu tenho la as variáveis:

 

$visualizar = $_POST['visualizar'];
$excluir = $_POST['excluir'];
$editar = $_POST['editar'];

 

Porém quando eu faço o update na tabela, o campo retorna o valor array, por exemplo:

update tabela set visualizar = 'array' where cod_usuario = $cod_usuario;

 

Durante as leituras pela internet achei isso, que pelo que entendi seria um loop:

 

foreach($visualizar as $chave => $campos){
echo $campos. "<br>";
}

 

Com isso, o php escreve pra mim o valor "S" dos checkboxes Visualizar que selecionei na pagina, mas nao há ID para os mesmos...

 

Sendo assim, a minha dúvida é:

Como o php reconhecerá que o checkbox que selecionei é da página 1 e não da 2 por exemplo?

Como faço pra gravar os valores do checkbox no banco, ao inves de ficar aparecendo esse "array"? o correto seria aparecer "S".

alguem pode me ajudar?

 

Desde já, obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você tem essas variaveis certo ?

$visualizar = $_POST['visualizar'];
$excluir = $_POST['excluir'];
$editar = $_POST['editar'];

Verifica se elas foram setadas assim:

 

if(isset($visualizar)) { $var1  = "S"; }
else { $var1 = "N"; }

if(isset($editar)) { $var2  = "S"; }
else { $var2 = "N"; }

if(isset($excluir)) { $var3  = "S"; }
else { $var3 = "N"; }

Dae você pega esas variaveis e coloca no UPdate.
[code]
update tabela set visualizar = '$var1', editar = '$var2', excluir = '$var3' where cod_usuario = $cod_usuario;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Blza.

Com isso apareceu o 'S' no update, embora não gravou no banco de dados.

Além disso, como sao checkboxes dinamicos (cada um corresponde a uma página, no caso), como ele vai saber que selecionei o primeiro checkbox e nao o ultimo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como assim não gravou no banco, você está executando o Update ?

Dá algum erro ?

 

No value do CheckBox, você coloca o Código da Pagina se tiver ou o Nome...

Dae no Update você faz..

 

$cod_pagina = $_POST['visualizar'];
update tabela set visualizar = '$var1', editar = '$var2', excluir = '$var3' where cod_usuario = $cod_usuario and cod_pagina = $cod_pagina;

Uma coisa que eu nao estou entendendo... são acões diferentes, pq você nao faz isso em um RADIO em vez de CHECK, e se o usuário selecionar o Visualizar e o Editar e o Excluir, o que vai acontecer ? :S

Compartilhar este post


Link para o post
Compartilhar em outros sites

A questão do update foi orelhada... rs ignore...

Esse modulozinho do site seria pra o cara ter permissao de acessar ou nao uma area, ou se pode acessar ou nao editar, ou editar e nao excluir etc... sacou?

entao q q acontece

no form principal eu tenho uma view q lista as paginas cadastradas e esses checkbox sao pra setar o q o usuario pode e o q nao pode fazer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porem, como sao dinamicos, ou seja, a tabela nao tem la 70 campos pra cada usuario, eu qria ver como posso fazer da forma q falei acima...

eu sei q tem alguma coisa a ver com loop, mas nao sei como fazer tal coisa... entende?

sao 14 paginas atualmente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça assim. No checkbox, você faz assim:

 

<input type="checkbox" name="visualizar[<?php echo $var_que_contem_o_id_da_pagina ?>]" value="<?php echo $var_que_contem_o_id_do_usuario ?>" />

Aí na página que recebe os dados, você faz assim:

 

foreach($_POST['visualizar'] as $chave => $valor)
{
    echo 'O checkbox marcado foi da página '.$chave.' para o usuário '.$valor;
}

Veja se compreende a lógica.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi sim, porém acabou não funcionando...

De tanto mexer ontem eu consegui fazer com que ele começasse a contar os checkboxes que marquei, porém ele está começando a contagem do zero, ou seja, se eu marco um checkbox, ele atualiza o registro correspondente à página 1.

Se eu marco 3 checkboxes, ele atualiza o registro da página 3 e assim sucessivamente.

mesmo mandando escrever o $i do loop que criei, se eu marquei 7, ele escreve 6 registros e, após isso, ele coloca uma "," que eu usei pra concatenar e ver se resolvia após o último número.

 

Abaixo, segue a parte do código do formulário e também da página de gravação.

 

FORMULÁRIO

<?php
$sql_pagina = mysql_query("SELECT * FROM VW_PERMISSOES_GERAIS WHERE COD_USUARIO = '$cod_usuario'");
while($lista_pagina = mysql_fetch_assoc($sql_pagina)){
?>
   <tr>
      <td align="left" class="fundo_permissoes"><?php echo $lista_pagina['descricao_pagina']; ?></td>
      <td align="center" class="fundo_permissoes"><input name="visualizar[]" type="checkbox" id="visualizar[]" style="background-color:#f1f1f1; border:0px;" value="S" /></td>
      <td align="center" class="fundo_permissoes"><input name="inserir[]" type="checkbox" style="background-color:#f1f1f1; border:0px;" value="S" /></td>
      <td align="center" class="fundo_permissoes"><input name="editar[]" type="checkbox" style="background-color:#f1f1f1; border:0px;" value="S" /></td>
<td align="center" class="fundo_permissoes"><input name="descartar[]" type="checkbox" style="background-color:#f1f1f1; border:0px;" value="S" /></td>
      <td align="center" class="fundo_permissoes"><input name="listagem[]" type="checkbox" style="background-color:#f1f1f1; border:0px;" value="S" /></td>
    </tr>
<?php
     }
?>
    <table>
       <tr><td align="left"><input type="submit" name="button" id="button" value="Gravar" /></td></tr>
    </table>

 

PÁGINA DE GRAVAÇÃO:

$cod_usuario = $_GET['cod_usuario'];

$visualizar = $_POST['visualizar'];
$inserir    = $_POST['inserir'];
$editar     = $_POST['editar'];
$descartar  = $_POST['descartar'];
$listagem   = $_POST['listagem'];

$visualizar = (isset($_POST['visualizar'])) ? $_POST['visualizar'] : array();
$inserir    = (isset($_POST['inserir']))    ? $_POST['inserir']    : array();
$editar     = (isset($_POST['editar']))     ? $_POST['editar']     : array();
$descartar  = (isset($_POST['descartar']))  ? $_POST['descartar']  : array();
$listagem   = (isset($_POST['listagem']))   ? $_POST['listagem']   : array();


if(isset($visualizar) || isset($inserir) || isset($editar) || isset($descartar) || isset($listagem)){
	$var1 = "S";
}
else{
	$var1 = "N";
}



for($i = 1; $i < count($visualizar); $i++){
	$visualiza .= $_POST['visualizar'][$i];
	echo $i . ',';
}


$sql = mysql_query("UPDATE TB_PERMISSOES_GERAIS SET VISUALIZAR = '$var1' WHERE COD_PAGINA = '$i' AND COD_USUARIO = '$cod_usuario'") or die(mysql_error());

echo "UPDATE TB_PERMISSOES_GERAIS SET VISUALIZAR = '$var1' WHERE COD_PAGINA = '$i' AND COD_USUARIO = '$cod_usuario'";

 

Desde já, agradeço a todos que puderem me ajudar a resolver isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, no seu caso o melhor é usar o foreach para percorrer o laço, porque você vai ter como trabalhar separado com o índice e com o valor, como eu tinha colocado mesmo. Aí você coloca o INSERT dentro do foreach.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, consegui um progresso... rs...

Passei o update pra dentro do loop (como não havia pensado nisso antes?... ¬¬)!

Tá quase resolvido.

A questão agora é que, de 14 checkboxes dinâmicos gerados, se eu seleciono 6 na sequência, quando clico em gravar, o php insere até cinco registros. Se escolho 7, ele insere 6 e assim por diante.

Se eu escolho o primeiro e os dois últimos por exemplo (13 e 14), ele novamente some com um registro e grava na sequência (1,2...) ao invés de (1,13,14), nesse caso.

Alguém tem alguma dica?

O código é o mesmo acima, porém com o update dentro do loop.

 

Ok, tentarei com o foreach e havendo alguma nova, aviso aqui.

Vlws!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha...

Primeiro, o seu for começa no 1 e o array no PHP começa no 0. Então ele pula o 0.

Segundo, mantenho a minha opinião. O foreach é a melhor opção pra você. Vai funcionar com o for, mas o foreach é melhor.

 

http://br.php.net/manual/pt_BR/control-structures.foreach.php

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou!! Agora sim!! Vlws!!

Agora, só mais uma coisa: o foreach está fazendo o loop pro $_POST['visualizar'].

Porém como ficariam pros outros campos?

Adicionei o código da página tb para os outros na página do formulário. Tentei adicionar os campos no foreach juntamente com o visualizar ($_POST['visualizar'] || $_POST['inserir'] || $_POST['editar'] || $_POST['descartar'] || $_POST['listagem']) mas não funcionou...

Nesse caso, como ficaria?

Teria que fazer um foreach pra cada pra cada um deles ou tem como fazer isso no mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não pensei nisto... Faz assim... Marca várias opções, bem alternado, como vai ser no dia a dia. Na página que recebe os dados, coloca este código...

 

echo '<pre>';
print_r($_POST);
exit();

Posta aqui o resultado, pra ver como está ficando. Talvez neste caso seja melhor modificar o formulário, mas deixa eu ver como ficou o print_r primeiro.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gerou esse código:

 

O checkbox visualizar marcado foi da página 5

Array
(
    [visualizar] => Array
        (
            [5] => S
        )

    [descartar] => Array
        (
            [8] => S
        )

    [editar] => Array
        (
            [12] => S
        )

    [inserir] => Array
        (
            [14] => S
        )

    [button] => Gravar
)

Compartilhar este post


Link para o post
Compartilhar em outros sites

E o código do usuário? Está aonde? Marca mais de uma opção de cada coisa, por exemplo, marca umas 3 visualizar, uns 3, 4 descartar... Assim por diante. Mostra também como é pra ficar a inserção dos dados em um dos casos.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo, o código do usuário eu tenho uma var estática pegando o valor em $_GET, porém vou arrumar um jeito de passar por sessão por questão de segurança. No caso do código do usuário não o coloquei ali pois na sintaxe de update eu já pego o código do usuário, sacou?

Você acha que mesmo assim precisa?

 

O checkbox visualizar marcado foi da página 1

Array

(

[visualizar] => Array

(

[1] => S

[3] => S

[4] => S

[5] => S

[9] => S

[11] => S

[13] => S

)

 

[descartar] => Array

(

[3] => S

[4] => S

[5] => S

[6] => S

[8] => S

[10] => S

)

 

[listagem] => Array

(

[3] => S

[11] => S

)

 

[inserir] => Array

(

[4] => S

[6] => S

[10] => S

[14] => S

)

 

[editar] => Array

(

[11] => S

[12] => S

)

 

[button] => Gravar

)

 

Só pra você ficar por dentro do sistema...

Quando eu cadastro um usuário, automaticamente o banco dispara três triggers, dentre elas uma que já cria como default os valores nessa tabela tb_permissoes_gerais para: visualizar, inserir, editar, excluir, listar setados como 'N'.

Daí quando a pessoa acessa a página do formulário, o mesmo pega o código do usuário por $_GET (que igual disse que vou arrumar um jeito de passar por sessão por causa de segurança) e, através da view que tem no banco de dados, ele lista todas as páginas cadastradas e gera os checkboxes dinâmicos.

Sendo assim, quando eu mandar gravar, o php deve pegar os valores dos checkboxes que eu selecionei. No final, se por exemplo eu selecionar todas as opções pro usuário, a sintaxe resumiria a isso:

update tb_permissoes_gerais set visualizar = 'S', inserir = 'S', excluir = 'S', editar = 'S', listar = 'S' WHERE COD_PAGINA = '$chave' AND COD_USUARIO = '$cod_usuario';

Compartilhar este post


Link para o post
Compartilhar em outros sites

[visualizar] => Array

(

[1] => S

[3] => S

[4] => S

[5] => S

[9] => S

[11] => S

[13] => S

)

Este código (1, 3...) é o código da página?

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então é melhor mudar a ordem de como está sendo montado o checkbox. Está assim:

operacao[pagina]

 

Coloque

 

permissao[pagina][operacao]

Onde permissao é o nome mesmo. Então, o seu array ficaria mais ou menos assim:

permissao Array
(
     [3] => Array
            (
                 [visualizar] => s
                 [excluir] => s
                 [listagem] => s                 
            )
)

Aí, no foreach, você faz algo assim:

foreach ($_POST['permissao'] as $chave => $valor)
{
    $visualizar = isset($valor['visualizar']) ? $valor['visualizar'] : 'n';
    $excluir = isset($valor['excluir']) ? $valor['excluir'] : 'n';
    $listagem = isset($valor['listagem']) ? $valor['listagem'] : 'n';
    $editar = isset($valor['editar']) ? $valor['editar'] : 'n';
    $qry = mysql_query("update tb_permissoes_gerais set visualizar = '$visualizar', inserir = '$inserir', excluir = '$excluir', editar = 'editar', listar = 'S' WHERE COD_PAGINA = '$chave' AND COD_USUARIO = '$cod_usuario') or die(mysql_error());
}

Veja se compreende.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

aeeeeeeeeeeeeee funcionou!!!! http://forum.imasters.com.br/public/style_emoticons/default/natal_laugh.gif

Vlws!!!

Só tem uma questão agora...

Fiz uma lógicazinha nos checkboxes mas não deu muito certo.

Por exemplo:

Se eu setei que o usuário pode visualizar a página 1, no formulário aparece que tal permissão está concedida (checked=checked). Porém, se eu quiser tirá-la depois, por exemplo, no banco continuava como S.

Com isso, fiz uma lógica com o value.

Se retornar 'S' o value passa a ser 'N' e vice-versa. O que deu errado nisso é que, se o usuário tinha permissão mas o value agora é 'N', ele atualiza todas as outras pra N... rs...

Alguma sugestão?

 

Segue abaixo o código do checkbox atual:

 

<input name="permissao[<?php echo $lista_pagina['cod_pagina']; ?>][visualizar]" type="checkbox" id="visualizar[]" style="background-color:#f1f1f1; border:0px;" value="<?php if($lista_pagina['visualizar'] == 'S') echo "N"; else echo "S"; ?>" <?php if($lista_pagina['visualizar'] == 'S') echo 'checked="checked"'; ?>) />

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.