Ir para conteúdo

POWERED BY:

Arquivado

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

Station

[Resolvido] Checkbox array de basedados para formulario

Recommended Posts

Boa noite pessoal.

 

O meu problema é o seguinte:

 

Criei um formulário com umas checkboxes

<?php

$sql = mysql_query("SELECT * FROM extras");

while($row = mysql_fetch_array($sql))
{
echo "<div style='float:left; width:200px;margin-top:5px;margin-bottom:10px;'>";
echo "<input type='checkbox' class='largerCheckbox' name='extra[]' value='";
echo $row['extras'];
echo "'>";
echo $row['extras'];
echo "</div>";
}?>
, os valores dessas checkboxes vão ser gravados na basedados como array.

$extras= implode(",",$_POST['extra']);

      $sql_grava    = "INSERT INTO veiculos (extras) value ('$extras')";

Mas queria criar um formulário para editar essas checkboxes, mas com elas selecionadas dependendo da array que foi inserida na basedados.

Algo como o primeiro CODE que inseri em cima mas com as checkboxes selecionadas conforme a array colocada no segundo CODE.

 

Alguem me pode ajudar? Eu ainda estou a aprender isto tudo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Calma rapaz.. você postou ontem, nem deu tempo de alguem ler o teu topico..

eu criei esse metodo para trazer checkboxs marcados ou nao.. to meio sem tempo de explicar sobre ele, mas veja se consegue entender.

function checkHp( $string )
	{
		$sql = ("SELECT * FROM `hp` ");
		
		if( $string != '' ) {
			$sql2 = ("SELECT idHp FROM `hpCategoria` ");
			$sql2 .= $string;
			
			$consulta2 = mysql_query($sql2);
					
			if(mysql_num_rows($consulta2)!=0)
			{
				while($dadosRel = mysql_fetch_assoc($consulta2))
				{
						$vetorHp[] = $dadosRel['idHp']; 
				}
			}
		}

		
		$consulta = mysql_query($sql);
		
		while( $dados = mysql_fetch_assoc( $consulta ) )
		{
			if( $string != '' && mysql_num_rows($consulta2)!=0 ) {
				if( in_array( $dados['idHp'], $vetorHp ) )
					$checked = 'checked="checked" ';
				else
					$checked = '';
			}
				
			$check .= "\t".'<label>'.$dados['potencia'].'<input type="checkbox" name="idHp[]" value="'.$dados['idHp'].'" '.$checked.'/></label>'."\n\t\t";
		}
		return $check;
	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Calma rapaz.. você postou ontem, nem deu tempo de alguem ler o teu topico..

eu criei esse metodo para trazer checkboxs marcados ou nao.. to meio sem tempo de explicar sobre ele, mas veja se consegue entender.

function checkHp( $string )
	{
		$sql = ("SELECT * FROM `hp` ");
		
		if( $string != '' ) {
			$sql2 = ("SELECT idHp FROM `hpCategoria` ");
			$sql2 .= $string;
			
			$consulta2 = mysql_query($sql2);
					
			if(mysql_num_rows($consulta2)!=0)
			{
				while($dadosRel = mysql_fetch_assoc($consulta2))
				{
						$vetorHp[] = $dadosRel['idHp']; 
				}
			}
		}

		
		$consulta = mysql_query($sql);
		
		while( $dados = mysql_fetch_assoc( $consulta ) )
		{
			if( $string != '' && mysql_num_rows($consulta2)!=0 ) {
				if( in_array( $dados['idHp'], $vetorHp ) )
					$checked = 'checked="checked" ';
				else
					$checked = '';
			}
				
			$check .= "\t".'<label>'.$dados['potencia'].'<input type="checkbox" name="idHp[]" value="'.$dados['idHp'].'" '.$checked.'/></label>'."\n\t\t";
		}
		return $check;
	}

Oi!

 

Desculpa só responder agora, não tenho conseguido tempo.

 

Eu não percebi muito bem, qual será o valor da $string?

 

Eu fiz de outra maneira mas está sempre a repetir as checkboxes,...

 

$dados = mysql_query("SELECT extras FROM veiculos WHERE id='$id'");
        @$rowdados = mysql_fetch_array($dados);
		$pieces = explode(',', $rowdados["extras"]);
		$arr = array($pieces);
		while (list($key, $value) = each($pieces)) {
			$sql = "select * from extras";
        		$resposta = mysql_query( $sql );
        	
					while ( $linha = mysql_fetch_array( $resposta )) {
            			$select = ($value == $linha['extras']) ? "checked" : "";
							echo "<div style='float:left; width:200px;margin-top:5px;margin-bottom:10px;'>";
							echo "<input type='checkbox' class='largerCheckbox' name='extra[]' value='";
							echo $linha['extras'];
							echo "' $select >";
							echo $linha['extras'];
							echo "</div>";
		  			}
		}

Ele encontra as checkboxes selecionadas por um array na BD, mas repete todas as checkboxes em "$sql = "select * from extras" umas 4 vezes, dependendo do array que encontrar em "SELECT extras FROM veiculos WHERE id='$id'"

 

O problema está nos "while", alguem sabe o problema do meu código?

Compartilhar este post


Link para o post
Compartilhar em outros sites

você está usando whiles encaixados, com certeza isso que está gerando a duplicação.

 

o meu $string ali, é apenas o

WHERE id = 1
Não entendi como está modelado o teu banco.

Pode postar a estrutura dessas 2 tabelas ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Campo Extras

 

|__id__|_______extras_______|

| 1 | AR Condicionado |

| 2 | Auto Radio |

| 3 | ABS |

| 4 | ...... |

....

 

Campo Veiculos

 

|__id__|_______marca_______|_______modelo_______|_______ano_______|_______preco_______|_______extras________________________________________|

| 1 | Peugeot | 206 + | 2004 | 20000.00 | Ar Condicionado,Rádio CD,Airbag Lateral,ABS,Bancos...

| 2 | Lancia | xpto | 2002 | 22400.00 | Rádio CD,Airbag Lateral,ABS,Bancos...

| 3 | ...... |

....

 

Ta aqui Bruno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum... dei uma remodelada.. veja.. fica bem mais fácil.. se você tiver mais uma tabela.

Na tua modelagem, se você um dia, resolver alterar sei lá.. Airbag Lateral para Airbag ou airbag, você perde os relacionamentos.

Pois guardou diretamente uma string de outra tabela no banco.

 

Eu faria assim:

<?php
$con = mysql_connect('localhost', 'root', '123');
mysql_select_db('artigos', $con);

function checkExtras( $string='' ){

	$sql = "SELECT * FROM `extra` ";
	if( $string != '' ){
		$sql2 = "SELECT `idExtra` FROM `extrasveiculo` ";
		$sql2 .= $string;

		$consulta2 = mysql_query($sql2)or die(mysql_error());
						
		if(mysql_num_rows($consulta2)!=0){
			while($dadosRel = mysql_fetch_assoc($consulta2)){
				$extras[] = $dadosRel['idExtra']; 
			}
		}
	}
		
	$consulta = mysql_query($sql)or die(mysql_error());
	
	while( $dados = mysql_fetch_assoc( $consulta ) ){
		if( $string != '' && mysql_num_rows($consulta2)!=0 ){
			if( in_array( $dados['idExtra'], $extras ) )
				$checked = 'checked="checked" ';
			else
				$checked = '';
		}
					
		$check .= "\t".'<label>'.$dados['nomeExtra'].'<input type="checkbox" name="idExtra[]" value="'.$dados['idExtra'].'" '.$checked.'/></label>'."\n";
	}
	return $check;
}
?>
	<p>Veículo 1:</p>
	<?php echo checkExtras('WHERE `idVeiculo` = 1'); ?>
	<p>Veículo 2:</p>
	<?php echo checkExtras('WHERE `idVeiculo` = 2'); ?>
sendo que a estrutura seria:

-- phpMyAdmin SQL Dump
-- version 3.1.2
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tempo de Geração: Ago 18, 2009 as 01:07 PM
-- Versão do Servidor: 5.1.31
-- Versão do PHP: 5.2.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Banco de Dados: `artigos`
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `extra`
--

CREATE TABLE IF NOT EXISTS `extra` (
  `idExtra` int(11) NOT NULL AUTO_INCREMENT,
  `nomeExtra` varchar(25) NOT NULL,
  PRIMARY KEY (`idExtra`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Extraindo dados da tabela `extra`
--

INSERT INTO `extra` (`idExtra`, `nomeExtra`) VALUES
(1, 'AR Condicionado'),
(2, 'Auto Radio'),
(3, 'ABS');

-- --------------------------------------------------------

--
-- Estrutura da tabela `extrasveiculo`
--

CREATE TABLE IF NOT EXISTS `extrasveiculo` (
  `idExtra` int(11) NOT NULL,
  `idVeiculo` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `extrasveiculo`
--

INSERT INTO `extrasveiculo` (`idExtra`, `idVeiculo`) VALUES
(1, 1),
(2, 1),
(3, 2);

-- --------------------------------------------------------

--
-- Estrutura da tabela `veiculo`
--

CREATE TABLE IF NOT EXISTS `veiculo` (
  `idVeiculo` int(11) NOT NULL AUTO_INCREMENT,
  `marca` varchar(25) NOT NULL,
  `modelo` varchar(25) NOT NULL,
  `ano` varchar(4) NOT NULL,
  `preco` varchar(25) NOT NULL,
  PRIMARY KEY (`idVeiculo`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Extraindo dados da tabela `veiculo`
--

INSERT INTO `veiculo` (`idVeiculo`, `marca`, `modelo`, `ano`, `preco`) VALUES
(1, 'Pegeou', '206+', '2004', '20000.00'),
(2, 'Lancia', 'xpto', '2002', '22400.00');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito inteligente...

 

Até estou com agua na boca só de olhar... hoje já não consigo fazer nada, amanha já vejo se funciona.

 

Obrigado Bruno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estava a pensar...

 

e se o Veiculo "idVeiculo=2" tambem conter um extra igual ao "idVeiculo=1"?

 

isto é,

 

INSERT INTO `extrasveiculo` (`idExtra`, `idVeiculo`) VALUES
(1, 1), // <- O veiculo2 tambem tem este extra
(2, 1),
(3, 2);
]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai você vai ter mais uma linha ai.. (1, 2)(idExtra=1 para idVeiculo=2)

INSERT INTO `extrasveiculo` (`idExtra`, `idVeiculo`) VALUES
(1, 1), #extra de id 1 para o veiculo de id 1
(2, 1), #extra de id 2 para o veiculo de id 1
(3, 2), #extra de id 3 para o veiculo de id 2
(1, 2), #extra de id 1 para o veiculo de id 1

(1, 3); #extra de id 1 para o veiculo de id 3 <- e assim por diante
Entendeu ?

Uma linha dessa tabela para cada extra do veículo. Assim você não precisa inflar as outras 2 tabelas.

E elas guardam somente oque representam.

 

Ah sim, estava esquecendo de comentar.

E se você fizer isso:

<?php echo checkExtras(); ?>
a minha funçao te gera todos os checkboxs desmarcados.

 

Outra modelagem, que já vi muito, seria criar campos do tipo SET('s','n')

E colocar as colunas:

`AR Condicionado`,`Auto Radio`,`ABS` na tabela veículos.

Assim a tua tabela cresce horizontalmente oque é muuuuuuuuito errado.

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.