Ir para conteúdo

POWERED BY:

Arquivado

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

Marcos Oliveira

Montar um SELECT COM CHECKBOX

Recommended Posts

Ola Pessoa estou querendo montar um select de acordo com as opções que os usuários marcarem no formulário, usaria um checkbox e assim eles escolheriam como queriam visualizar o relatório...

 

Ai vem minha dúvida, como posso fazer isso, não sei nem por onde começar. No meu formulário o valor dos checkboxs já são os campos da tabela, mas na hora que eu tentei montar deu tudo errado vejam..:

Eu fiz um echo no final para ver como estava ficando meu select.

 

$saram = $_POST['saram'];
$nome = $_POST['nome'];
$nguerra = $_POST['nguerra'];
$graduacao = $_POST['graduacao'];
$especialidade = $_POST['especialidade'];
$antiguidade = $_POST['antiguidade'];
$ffix = $_POST['ffix'];
$ftra = $_POST['ftra'];
$fcel = $_POST['fcel'];
$fout = $_POST['fout'];
$email = $_POST['email'];
$senha = $_POST['senha'];
$perfil = $_POST['perfil'];

//montando select
$sql = "SELECT ".$saram.",".$nome.",".$nguerra.",".$graduacao.",".$especialidade.",".$antiguidade.",".$ffix.",".$ftra.",".$fcel.",".$fout.",".$email.",".$perfil." FROM tb_militar";
$result = mysql_query($sql) or die (mysql_error());
echo $sql;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode fazer algo semelhante a isso.

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Test</title>

</head>
<body>

<form method="post" id="myform" name="myform">

	<input type="checkbox" name="fields[]" value="name"/> name
	<input type="checkbox" name="fields[]" value="ag-e" /> age
	<input type="checkbox" name="fields[]" value="address" /> address

	<button id="mysubmit" type="submit">Submit</button><br /><br />

</form>

<?php
if(isset($_POST['fields'])) {
	$select = "select ";
	
	for($i = 0; $i < count($_POST['fields']); $i++) {
		$field = $_POST['fields'][$i];
		$select .= preg_replace("/[^a-zA-Z_]/", "", $field);
		if($i < count($_POST['fields']) - 1)
			$select .= ",";
	}

	$select .= " from table";
	echo $select;
}
?>

</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Você pode fazer algo semelhante a isso.

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Test</title>

</head>
<body>

<form method="post" id="myform" name="myform">

	<input type="checkbox" name="fields[]" value="name"/> name
	<input type="checkbox" name="fields[]" value="ag-e" /> age
	<input type="checkbox" name="fields[]" value="address" /> address

	<button id="mysubmit" type="submit">Submit</button><br /><br />

</form>

<?php
if(isset($_POST['fields'])) {
	$select = "select ";
	
	for($i = 0; $i < count($_POST['fields']); $i++) {
		$field = $_POST['fields'][$i];
		$select .= preg_replace("/[^a-zA-Z_]/", "", $field);
		if($i < count($_POST['fields']) - 1)
			$select .= ",";
	}

	$select .= " from table";
	echo $select;
}
?>

</body>
</html>

 

Show de Bola.... Ficou muito bom mesmo, ajustei uns detalhes. Sem querer te atrapalhar, veja minha outra dúvida.

Antes de mais nada muito obrigado, eu também estou pensando um jeito para fazer isso..

Beleza, com o SELECT feito vou jogar em um WHILE e mostrar o SELECT, mas como pode aparecer qualquer coluna como faço para colocar este resultado em uma tabela e exibir o titulo correspondente ao campo selecionado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

seria interessante você tratar os campos permitidos para evitar falhas de segurança.

 

se eu entendi bem seria algo como isso, depois só fazer algo semelhante para os resultados, eles vão estar na mesma ordem.

 

<table>
	<tr>
	<?php
	foreach($_POST['fields'] as $field)
		echo "<th>$field</th>\n";
	?>
	</tr>
</table>

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

seria interessante você tratar os campos permitidos para evitar falhas de segurança.

 

se eu entendi bem seria algo como isso, depois só fazer algo semelhante para os resultados, eles vão estar na mesma ordem.

 

<table>
	<tr>
	<?php
	foreach($_POST['fields'] as $field)
		echo "<th>$field</th>\n";
	?>
	</tr>
</table>

Olá amigo, andei pesquisando, e vi alguns artigos, baseado na dica que vocÊ me deu, mas acontece que esta imprimindo todos as variáveis da array, mesmo as não selecionadas...

 

 

Veja meu código!!

 

<form id="filtro_editavel" name="filtro_editavel" method="post" >

<input name="fields[]" type="checkbox" value=" ml_saram "/>Saram

<input name="fields[]" type="checkbox" value="ml_nome "/>Nome

<input name="fields[]" type="checkbox" value="ml_nguerra "/>Nome de Guerra

<input name="fields[]" type="checkbox" value="ml_graduacao "/>Graduação

<input name="fields[]" type="checkbox" value="ml_especialidade "/>Especialidade

<input name="fields[]" type="checkbox" value="ml_antiguidade "/>Antig. Relativa

<input name="fields[]" type="checkbox" value="ml_ffix "/>Fixo

<input name="fields[]" type="checkbox" value="ml_fcel "/>Celular

<input name="fields[]" type="checkbox" value="ml_out "/>Outro

<input name="fields[]" type="checkbox" value="ml_tra "/>Trabalho

<input name="fields[]" type="checkbox" value="ml_email "/>E-mail

<input name="fields[]" type="checkbox" value="ml_perfil "/>Perfil

<br />

<input name="Enviar" type="submit" value="enviar" />

</form>

<?php

//Montando o select com os checkbox

$campo = $_POST['fields'];

 

if(isset($campo)) {

$select = "SELECT \"";

 

for($i = 0; $i < count($campo); $i++) {

$field = $campo[$i];

$select .= preg_replace("/[^a-zA-Z_]/", "", $field);

if($i < count($campo) - 1)

$select .= ", ";

}

 

$select .= " FROM tb_militar\"";

}

$sql = $select;

$result = mysql_query($sql) or die (mysql_error());

$fields = array('SARAM', 'NOME', 'N. DE GUERRA', 'GRADUAÇÃO','ESPECIALIDADE', 'ANT. RELATIVA', 'TEL. FIXO', 'TEL. CELULAR', 'TEL. OUTRO', 'TEL. TRABALHO', 'E-MAIL', 'PERFIL',);

//imprimindo os resultados..

foreach ($fields as $indice => $valor) {

if ($valor == $fields) continue;

echo "<th>". $valor . "</th>";

}

 

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peguei esse ultimo código e fiz uns ajustes.

<?php
//campos existentes e seus titulos
$campos = array('ml_saram'         => 'Saram',
                'ml_nome'          => 'Nome',
                'ml_nguerra'       => 'N. de Guerra',
                'ml_graduacao'     => 'Graduação',
                'ml_especialidade' => 'Especialidade',
                'ml_antiguidade'   => 'Ant. Relativa',
                'ml_ffix'          => 'Tel. Fixo',
                'ml_fcel'          => 'Tel. Celular',
                'ml_out'           => 'Tel. Outro',
                'ml_tra'           => 'Tel. Trabalho',
                'ml_email'         => 'E-mail',
                'ml_perfil'        => 'Perfil');
?>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF8">
	<title>Teste</title>
</head>
<body>
	<form id="filtro_editavel" name="filtro_editavel" method="post" >
	    <?php
	        foreach($campos as $nome => $titulo)
	            echo '<label><input name="campos[]" type="checkbox" value="' . $nome . '"/>' . $titulo . '</label>';
	    ?>
	    <br />
	    <input name="Enviar" type="submit" value="enviar" />
	</form>
	<?php
	//verifica se os dados foram enviados
	if(isset($_POST['campos'])) {
	    $selecionados = $_POST['campos'];
	    //retorna somente os campos que existem na variavel $campos
	    $permitidos = array_intersect($selecionados, array_keys($campos));
	    //monta a query
	    $query      = 'SELECT ' . implode(', ', $permitidos) . ' FROM tb_militar';
	?>
	<table>
	    <tr>
	    <?php
	    //imprime o cabeçalho
	    foreach ($permitidos as $nome)
	        echo '<th>'. $campos[$nome] . '</th>';
	    ?>
	    </tr>
	    <?php
	    //realiza a consulta
	    $result = mysql_query($query) or die (mysql_error());
	    //imprime os resultados
	    while($valores = mysql_fetch_row($result)) {
	        ?>
	        <tr>
	        <?php
	        foreach($valores as $valor)
	            echo '<td>'.$valor.'</td>';
	        ?>
	        </tr>
	        <?php
	    }
	    ?>
	</table>
	<?php
	}
	?>
</body>
</html>

Bom eu não sei onde você faz a conexão mais isso não vem ao caso, não testei a parte da impressão dos resultados mais se não me engano é isso mesmo.

De qualquer forma recomendo que não utilizar as funções mysql_* pois estão depreciadas utilize a MySQL Improved que tem uma interface compatível ou utilize a PDO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dúvida para comparaçao entre arrays dentro de foreach

 

Peguei esse ultimo código e fiz uns ajustes.

<?php
//campos existentes e seus titulos
$campos = array('ml_saram'         => 'Saram',
                'ml_nome'          => 'Nome',
                'ml_nguerra'       => 'N. de Guerra',
                'ml_graduacao'     => 'Graduação',
                'ml_especialidade' => 'Especialidade',
                'ml_antiguidade'   => 'Ant. Relativa',
                'ml_ffix'          => 'Tel. Fixo',
                'ml_fcel'          => 'Tel. Celular',
                'ml_out'           => 'Tel. Outro',
                'ml_tra'           => 'Tel. Trabalho',
                'ml_email'         => 'E-mail',
                'ml_perfil'        => 'Perfil');
?>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF8">
	<title>Teste</title>
</head>
<body>
	<form id="filtro_editavel" name="filtro_editavel" method="post" >
	    <?php
	        foreach($campos as $nome => $titulo)
	            echo '<label><input name="campos[]" type="checkbox" value="' . $nome . '"/>' . $titulo . '</label>';
	    ?>
	    <br />
	    <input name="Enviar" type="submit" value="enviar" />
	</form>
	<?php
	//verifica se os dados foram enviados
	if(isset($_POST['campos'])) {
	    $selecionados = $_POST['campos'];
	    //retorna somente os campos que existem na variavel $campos
	    $permitidos = array_intersect($selecionados, array_keys($campos));
	    //monta a query
	    $query      = 'SELECT ' . implode(', ', $permitidos) . ' FROM tb_militar';
	?>
	<table>
	    <tr>
	    <?php
	    //imprime o cabeçalho
	    foreach ($permitidos as $nome)
	        echo '<th>'. $campos[$nome] . '</th>';
	    ?>
	    </tr>
	    <?php
	    //realiza a consulta
	    $result = mysql_query($query) or die (mysql_error());
	    //imprime os resultados
	    while($valores = mysql_fetch_row($result)) {
	        ?>
	        <tr>
	        <?php
	        foreach($valores as $valor)
	            echo '<td>'.$valor.'</td>';
	        ?>
	        </tr>
	        <?php
	    }
	    ?>
	</table>
	<?php
	}
	?>
</body>
</html>

Bom eu não sei onde você faz a conexão mais isso não vem ao caso, não testei a parte da impressão dos resultados mais se não me engano é isso mesmo.

De qualquer forma recomendo que não utilizar as funções mysql_* pois estão depreciadas utilize a MySQL Improved que tem uma interface compatível ou utilize a PDO.

Olá Amigo, ficou excelente o seu código, apenas esta acontendo uma coisa que eu não sei resolver de novo...

So te dando trabalho... MAs se você puder me ajudar ficarei muito grato..

 

Veja com o foreach($valores as $valor) consigo resgatar os valores da tabela militar mesmo utilizando um INNER JOIN, porque quando imprimo o valor dos campos ml_fkgraduacao, ml_fkespecialidade, ml_fkperfil, são chaves secundárias e na impressão aparece somente os números(chaves), salvas na tabela tb_militar.

 

Agora vem a bomba:

Como Faço para resgatar o nome nas outras tabelas, veja o meu codigo tentei usar um if mas não deu certo...

De ante-mao muito obrigado.

 

 

 

<?php

//campos existentes e seus titulos

include 'config.php';

$campos = array('ml_saram' => 'Saram',

'ml_nome' => 'Nome',

'ml_nguerra' => 'N. de Guerra',

'ml_fkgraduacao' => 'Graduação',

'ml_fkespecialidade' => 'Especialidade',

'ml_antiguidade' => 'Ant. Relativa',

'ml_ffix' => 'Tel. Fixo',

'ml_fcel' => 'Tel. Celular',

'ml_fout' => 'Tel. Outro',

'ml_ftra' => 'Tel. Trabalho',

'ml_email' => 'E-mail',

'ml_fkperfil' => 'Perfil');

?>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF8">

<title>Teste</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<link type="text/css" href="css/topo.css" rel="stylesheet"/>

<link type="text/css" href="css/conteudo.css" rel="stylesheet"/>

<link type="text/css" href="css/rodape.css" rel="stylesheet"/>

<link type="text/css" href="css/estilo.css" rel="stylesheet" />

 

</head>

<body>

<form id="filtro_editavel" name="filtro_editavel" method="post" >

<?php

foreach($campos as $nome => $titulo)

echo '<label><input name="campos[]" type="checkbox" value="' . $nome . '"/>' . $titulo . '</label>';

?>

<br />

<input name="Enviar" type="submit" value="enviar" />

</form>

<?php

//verifica se os dados foram enviados

if(isset($_POST['campos'])) {

$selecionados = $_POST['campos'];

//retorna somente os campos que existem na variavel $campos

$permitidos = array_intersect($selecionados, array_keys($campos));

//monta a query

$query = "SELECT " . implode(', ', $permitidos) . " FROM tb_militar as m \r

INNER JOIN tb_graduacao as g ON m.ml_fkgraduacao = g.gr_codigo \r

INNER JOIN tb_perfil as p ON m.ml_fkperfil = p.pf_codigo\r

INNER JOIN tb_especialidade as e ON m.ml_fkespecialidade = e.es_codigo\r

WHERE ml_saram="."3322424"; //somente para testar o formulario

?>

<table>

<tr>

<?php

//imprime o cabeçalho

foreach ($permitidos as $nome)

echo "<th class=\"celulatitulo\">". $campos[$nome] . "</th>";

?>

</tr>

<?php

//realiza a consulta

$result = mysql_query($query) or die (mysql_error());

//imprime os resultados

while($valores = mysql_fetch_row($result)) {

?>

<tr>

<?php

foreach($valores as $valor)

if (($valores == 'ml_fkgraduacao') or ($valores == 'ml_fkespecialidade') or ($valores == 'ml_fkperfil')){

$vetor2 = array("ml_fkgraduacao"=>"gr_nome","ml_fkespecialidade"=>"es_nome","ml_fkperfil"=>"pf_nome");

foreach($vetor2 as $chave){

echo "<td class=\"celula\">".$chave."</td>";

}

 

}

echo "<td class=\"celula\">".$valor."</td>";

?>

</tr>

<?php

}

?>

</table>

<?php

}

?>

</body>

</html>

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.