Ir para conteúdo

POWERED BY:

Arquivado

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

lau29

Problema com foreach

Recommended Posts

Boa tarde Galera

Procurei no forum ( e na net)e não consegui achar uma duvida qque para muitos deve ser simples, mas que para mim esta tirando o meu sono.
Estou desenvolvendo um sistema para a faculdade a qual estou me formando ( Ciências da Computação).
Pois bem é um sistema de cadastro de pacientes e o mesmo esta ficando gigante e complexo ( legal!!) :clap: .
Bom vamos a duvida :
Em determinado local do cadastro, existe o famoso questionario do tipo faz e não faz e o mesmo foi montado com checkbox's,e fiz da forma tradicional com array, , esta funcionando bem , os dados estão sendo esgatados, ou seja , marcou a checkbox , o valor é retornado, não marcou , nenhum valor é retornado.

abaixo um exemplo :


<input type="checkbox" name="face[]" value="normal"/>Normal <br />
<input type="checkbox" name="face[]" value="edema"/>Edema <br />
<input type="checkbox" name="face[]" value="mixedematosa"/>Mixedematosa <br />
<input type="checkbox" name="face[]" value="máscara"/>Mascara

e estou pegando os valores com foreach

foreach($_POST['face']as $value){
$face = $value
}

Pois bem sei que dentro da variavel '$face' se encontra os valores marcados pelo usuario,aí chega a duvida , o meu banco para cada opção existe um campo de igual valor, e lá ou será gravado o valor ou ficara como null, identificando assim que a opção não foi marcada pelo usuario.

Então :( como crio a query que irá identificar cada valor que foi clicado eo null's e fazer esses valores serem gravados nos locais correspondendes.

 

Agradeço desde já

 

Laércio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim de certa forma naõ sei como fazer .

A estrutura das tabelas (um exemplo)....

 

normal edema mixedematosa mascara

 

Ou seja para cada checkbox existe uma coluna na tabela

 

então como faço para desmembrar os valor que que recebo na variavel $value e colocar cada valor no seu respectivo campo ? seria mais a estrutura mesmo :

 

existirá mais campos a ser inseridos , onde alguns são variaveis simples e unicas e outras estão no formato de array

$algumavariavel = "INSERT INTO minha tabela (um,dois,tres,quatro,cinco,seis)values('$um','$dois',$value?)"

 

O campos cinco e seis corresponde aos dois valores que se encontram dentor do value .....

 

Desde já agradeço a atenção , espero que eu tenha consigo explicar...

 

Um abraço Laércio....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em termos de normalização esta tudo errado, a nao ser que vc garanta que nunca vai entrar ou sair campo nenhum da lista do checkbox, o que eu acho dificil.

 

Ou seja vc deveria rever a estrutura do banco e normalizar de forma que seja da seguinte forma

 

Paciente_ID | Problema

1 | Edema

1 | Mascara

2 | Normal

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em termos de normalização esta tudo errado, a nao ser que você garanta que nunca vai entrar ou sair campo nenhum da lista do checkbox, o que eu acho dificil.

 

Ou seja você deveria rever a estrutura do banco e normalizar de forma que seja da seguinte forma

 

Paciente_ID | Problema

1 | Edema

1 | Mascara

2 | Normal

 

Sim giesta, voce tem total razão , não havia pensado nessa possibilidade, como é um projeto que é um PBIC de faculdade, outros farão a continuação do projeto e com certeza haverá modificações , mas como farei então, pois fiz varias tabelas que correspondem a campos de checkbox , onde em alguns casos os mesmo são unicos, e outro casos campos textos e text areas , em conjunto com checkbox.

Tenho a tabela pacientes onde o seu id é foreign key dessas tabelas.

Então como devo proceder ? E depois tenho essa estrutura que nem sei fazer ainda .... :pinch:

 

Agradeço atenção de vocês ..no aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu fosse seu professor e vc me entregasse assim eu te deixava de prova fina :P

 

Sugiro que vc refaça caso tenha tempo. Senao vai ficar bem complicado de tratar os dados

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Giesta ...o banco de dados será remodelado , espero ter tempo , pois não havia atentado para esse problema nas normas FN's.

Mas de toda forma continuo com o problema da inserção de arrays , sendo que o valor que contem no array , devo desmebra-lo e inserir um valor em cada campo.

Ou seja como monto essa sintaxe, pois mesmo mudando o banco de dados, o array do checkbox continuará funcionando da mesma forma.

No aguardo de uma esperança( e giesta muito obrigado ate aqui ).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é dentro do foreach, dentro do laço vc insere as linhas por exemplo, ou apenas cria uma string grande pra um sql unico

 

Ex:

foreach($_POST['face']as $value)
{
$sql = Insert into tabela (campo1) values('$value')
mysql_query($sql);
}

Vou mover o topico para php pois la o pessoal podera auxilalo melhor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok ...se for melhor, mova o tópico.

 

Mas deixa ver se entendi, então não existe uma forma de gravar sosmente um valor por coluna usando o foreach ?

Tenho que criar no banco uma coluna que comporte todos os valores que irei cadastrar .?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se é como entendi estes dias apareceu uma dúvida semelhante. Pelo que eu entendi você teria para cada registro no seu banco as várias opções do seu checkbox em campos diferentes, ou seja: registro 1 - campo1, campo2 campo3...campox sendo que para cada campo deste você quer gravar o que foi assinalado nos checkbox do formulário. Se for isto, acredito que você deva criar uma relação entre os registros do array (criado pelos checkbox) e os campos da tabela.

Assim:

 

foreach($_POST['face'] as $indice -> $value) {

if ($indice = 0)

$sql = Insert into tabela (campo0) values('$value') where id_registro='$numero_registro_esta_sendo_atualizado'

mysql_query($sql);

}

if ($indice = 1)

$sql = Insert into tabela (campo1) values('$value') where id_registro='$numero_registro_esta_sendo_atualizado'

mysql_query($sql);

}

....

if ($indice = x)

$sql = Insert into tabela (campox) values('$value') where id_registro='$numero_registro_esta_sendo_atualizado'

mysql_query($sql);

}

 

}

Acredito que com esta rotina você consiga gravar em campos diferentes de um registro os respectivos conteúdos inseridos nos checkbox. os que não foram preenchidos ficarão null. Você vai ter estabelecer esta relação entre o checkbox do seu formulário com o campo da sua tabela. Assim: checkbox1 grava no campo1, o 2 no campo 2 e assim sucessivamente.

 

Espero que tenhas entendido. Qualquer coisa deixe seu recado no meu blog www.macetesweb.com.br.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se é como entendi estes dias apareceu uma dúvida semelhante. Pelo que eu entendi você teria para cada registro no seu banco as várias opções do seu checkbox em campos diferentes, ou seja: registro 1 - campo1, campo2 campo3...campox sendo que para cada campo deste você quer gravar o que foi assinalado nos checkbox do formulário. Se for isto, acredito que você deva criar uma relação entre os registros do array (criado pelos checkbox) e os campos da tabela.

Assim:

 

foreach($_POST['face'] as $indice -> $value) {

if ($indice = 0)

$sql = Insert into tabela (campo0) values('$value') where id_registro='$numero_registro_esta_sendo_atualizado'

mysql_query($sql);

}

if ($indice = 1)

$sql = Insert into tabela (campo1) values('$value') where id_registro='$numero_registro_esta_sendo_atualizado'

mysql_query($sql);

}

....

if ($indice = x)

$sql = Insert into tabela (campox) values('$value') where id_registro='$numero_registro_esta_sendo_atualizado'

mysql_query($sql);

}

 

}

Acredito que com esta rotina você consiga gravar em campos diferentes de um registro os respectivos conteúdos inseridos nos checkbox. os que não foram preenchidos ficarão null. Você vai ter estabelecer esta relação entre o checkbox do seu formulário com o campo da sua tabela. Assim: checkbox1 grava no campo1, o 2 no campo 2 e assim sucessivamente.

 

Espero que tenhas entendido. Qualquer coisa deixe seu recado no meu blog www.macetesweb.com.br.

 

 

Vou tentar implementar essa solução no meu sistema , pois como estou meio com a corda no pescoço , já estava mudando todoo rumo , usando a função implode e tentando gravar todos os valores numa unica coluna , mas vou usar esse modelo e postomo resultado ...

obrigado por enquanto ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

A solução é simples, porém você precisa remodelar seu banco de dados sim conforme o giesta disse anteriormente.

Ela até já passou a remodelagem básica que você vai fazer. Você tem que separar a tabela pacientes, da tabela tratamentos (se é que entendi o escopo), e criar uma terceira tabela chamada tratamentos_pacientes, que terá a estrutura que o giesta passou no post anterior.

 

Em termos de normalização esta tudo errado, a nao ser que você garanta que nunca vai entrar ou sair campo nenhum da lista do checkbox, o que eu acho dificil.

 

Ou seja você deveria rever a estrutura do banco e normalizar de forma que seja da seguinte forma

 

Paciente_ID | Problema

1 | Edema

1 | Mascara

2 | Normal

 

Em relação a inserção no banco de dados, dai tudo já ficou mais simples nessa estrutura:

 

 foreach ():   $sql = "INSERT INTO tratamentos_pacientes (id_paciente, id_tratamento) VALUES (id_paciente, id_tratamento)" endforeach:
 

 

O código acima foi apenas para exemplificar, o nome de variaveis, nome de tabela e etc.. você define aí no teu projeto, so lhe passei a idéia de como será feito.


A solução é simples, porém você precisa remodelar seu banco de dados sim conforme o giesta disse anteriormente.

Ela até já passou a remodelagem básica que você vai fazer. Você tem que separar a tabela pacientes, da tabela tratamentos (se é que entendi o escopo), e criar uma terceira tabela chamada tratamentos_pacientes, que terá a estrutura que o giesta passou no post anterior.

 

Em termos de normalização esta tudo errado, a nao ser que você garanta que nunca vai entrar ou sair campo nenhum da lista do checkbox, o que eu acho dificil.

 

Ou seja você deveria rever a estrutura do banco e normalizar de forma que seja da seguinte forma

 

Paciente_ID | Problema

1 | Edema

1 | Mascara

2 | Normal

 

Em relação a inserção no banco de dados, dai tudo já ficou mais simples nessa estrutura:

 

 foreach ():   $sql = "INSERT INTO tratamentos_pacientes (id_paciente, id_tratamento) VALUES (id_paciente, id_tratamento)" endforeach:
 

 

O código acima foi apenas para exemplificar, nome de variaveis, nome de tabela e etc você define ai no teu projeto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Leozin O MER esta feito dentro das 3FN's , onde o mesmo é composto por 14 tabelas, desde a tabela Pacientes, cidades ,estados,profissões e etc .....

A dúvida , era ( ou ainda é ) como montar a sintaxe a partir do tratamanto do foreach onde ao receber todos os valores dos checkbox's selecionados a variavel criada pelo foreach irá conter todos os "values" que o checkbox contém.

Então mesmo que eu crie mais tabelas e separe mais ( o que esta sendo feito graças ao ensinamentos aqui recebidos ) o foreach irá se comportar da mesma forma. Ou seja ele continuará aramazenando todos os valores dentro de uma unica variavel.....e aí suponhamos que exista a tabela doenças ou tratamentos, então no checkbox irá ter mais ou menos assim

 

diabete x

 

cancer

 

aids x

 

e no formulario html teremos o "name " por exemplo "doenças[]" onde o foreach fará o tratamento

 

foreach ($doenças as $d =>$value){

aqui vai o codigo de inserção ou tratamento das variaves( que é o que naõ sei fazer,desmembrar as variaveis) para que as mesmas sejam desmebradas

por que se eu mandar a variavel $value para a coluna coresponde da tabela qua será o valor enviado

sendo que a variavel contém os vaores checados ?

}

O que o Giesta falou esta certissimo, agora o que o PauloRn me passou parece que ira funcionar

Irei postar o resultado porque usando a função implode estarei ferindo uma das regras do banco que é ter um unico registro por coluna.

 

Um abraço e agradeço a tenção de todos , se caso houver alguma outra solução sou todo ouvidos

Compartilhar este post


Link para o post
Compartilhar em outros sites

To com mesmo problema no meu tópico...

http://forum.imasters.com.br/topic/533813-como-gravar-um-foreach-no-mysql/

da uma olhada la depois

Dei uma boa pesquisada e consegui achar esse topico com o mesmo problerma , e ele conseguiu resolver , alguem consegue explicar como ele fez? Pois estou temtando mas sem sucesso.

 

http://forum.imasters.com.br/topic/232521-resolvido-como-gravar-checkbox/

 

 

Se é como entendi estes dias apareceu uma dúvida semelhante. Pelo que eu entendi você teria para cada registro no seu banco as várias opções do seu checkbox em campos diferentes, ou seja: registro 1 - campo1, campo2 campo3...campox sendo que para cada campo deste você quer gravar o que foi assinalado nos checkbox do formulário. Se for isto, acredito que você deva criar uma relação entre os registros do array (criado pelos checkbox) e os campos da tabela.

Assim:

 

foreach($_POST['face'] as $indice -> $value) {

if ($indice = 0)

$sql = Insert into tabela (campo0) values('$value') where id_registro='$numero_registro_esta_sendo_atualizado'

mysql_query($sql);

}

if ($indice = 1)

$sql = Insert into tabela (campo1) values('$value') where id_registro='$numero_registro_esta_sendo_atualizado'

mysql_query($sql);

}

....

if ($indice = x)

$sql = Insert into tabela (campox) values('$value') where id_registro='$numero_registro_esta_sendo_atualizado'

mysql_query($sql);

}

 

}

Acredito que com esta rotina você consiga gravar em campos diferentes de um registro os respectivos conteúdos inseridos nos checkbox. os que não foram preenchidos ficarão null. Você vai ter estabelecer esta relação entre o checkbox do seu formulário com o campo da sua tabela. Assim: checkbox1 grava no campo1, o 2 no campo 2 e assim sucessivamente.

 

Espero que tenhas entendido. Qualquer coisa deixe seu recado no meu blog www.macetesweb.com.br.

não consegui fzer desta forma......

 

Um abraço a todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lau,

 

Dei uma ilhada no link que você colocou acima e constatei que o Luciano usou a refencia a pocição do elemento no array, ele usou $sistemas[$i]. Este $i, embora ele não mostrou toda a rotina, mas é um contador para identificar a posição do elemento no array. Se você quiser, me manda para paulorn@hotmail.com a rotina e a estrutura da tabela que eu elaboro a rotina comentada e devolvo para você. Eu já usei várias rotinas semelhantes em meus sistemas e sempre funcionaram.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Paulo agradeço a ajuda ...acredito que se te passar só como faço a rotina já vai te elucidar ( se não me diga do que precisa que te passo em detalhes) mas basicamente o sistema funciona da seguinte forma :

 

criei um metodo que recebe as variaveis através de POST e nesse metodo faço o tratamento de todas ela , datas, maiusculas minusculas e etc....após as mesmas serem tratadas chamo a classe de cadastro onde lá só existem os inserts para serem incluidos no BD, no momento resolvi o problema com o implode mas sei que esta errado ...então baseado neste link acho que ficaria assim :

 

Aqui tem a parte do formulario , esse arquivo tem por volta de 2000 linhas;

<tr>
<td>
Falta de Adesão a Atividade Física:  
<input type="checkbox" name="adesao[]" value="Falta_adesao"/>
Dieta:  
<input type="checkbox" name="adesao[]" value="Dieta"/>
</td>
</tr>
<tr>
<td>
Higiene Ambiental Inadequada por ruídos intensos:  
<input type="checkbox" name="adesao[]" value="Higiene"/>
</td>
</tr>
<tr>
<td>
Déficit de saneamento:  
<input type="checkbox" name="adesao[]" value="Deficit_saneamento"/>
Habitação Imprópria:  
<input type="checkbox" name="adesao[]" value="Habitacao_impropria"/>
</td>
</tr>

<tr>
<td>
Outros:  
<input type="checkbox" name="adesao[]" value="outros"/>  

<input type="text" name="outros_texto" id="outros_texto"/>

 

Após todos os itens serem preenchido existe um botão que aciona tudo isso , chama esse arquivo que ira fazer o tratamento das variaves , então aqui no foreach , ele deverá já me fornecer a variavel pronta para que possa ser passada para a classe e fazer a inserção :

 

foreach($_POST['adesao']as $value){
$adesao = $value
}

$texto_agua = $_POST['texto_agua'];
$orientar = implode($_POST['orientar'],",");

para cada array que existe será feito um foreach para a captura da variavel, e essa variavel que tem que ser desmembrada.... e por fim

cadastrar= new Cadastro;
$cadastrar = $cadastrar->cadastropac(aqui vai todas as variaveis ( parametros))

 

classe

 

public function cadastropac($parametro um , parametro2,.......){

 

$historico = "INSERT INTO historicos(
pacientes_idpacientes,estresse_psicossocial,sedentarismo,colesterol,diabetes_relata,renal_relata,
tabagista,diabete_familia,dislipidemias,acidente_vascular,renal_familia,coronariana,morte_subita,
ingestao_alcool,gordura_trans,salgados,enlatados,embutidos,carboidratos,frutas,verduras)
VALUES('$CodPaciente','$psicossocial','$sedentarismo','$colesterol','$diabetes','$renal',
'$tabagista','$dm','$dislipidemias','$vascular','$drenal','$coronaria','$subita','$alcool',
'$rico','$salgados','$enlatados','$embutidos','$carboidratos','$frutas','$verduras')";

$result_hist = mysql_query($historico) or die('Falha na inclusão do historico' .
mysql_error() . $historico);

}

 

essa é só uma das tabelas , como disse são 16 ate o momento.....

só falta fazer esse metodo que foi explicado no topico que lhe mandei e aí será mais facil continuar...

 

Um abraço

Laércio

 

PS: me explique o que mais precisa que lhe mando no e-mail e depois compartilho para o pessoal a soluçao dada , pois vi que essa duvida é recorrente de muitos aqui ..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Galera ( em especial ao Paulo ) ...

Cara estou muito proximo de colocar como resolvido o topico e acredito que ajudar muitos outros ..... :coolio:

Paulo cheguei a esse frankstein aqui :

 

Esse aqui é o formulario:

 

<meta charset="utf-8"/>
<form action="cadastra2.php" method="POST">

<input type="checkbox" name="orelha[]" value="Lesões" />Lesões<br/>
<input type="checkbox" name="orelha[]" value="Deformidade" />Deformidade<br/>
<input type="checkbox" name="orelha[]" value="Normal" />Normal<br/>
<input type="checkbox" name="orelha[]" value="Deficiência" />Deficiência<br/>
<input type="checkbox" name="orelha[]" value="Atrocidade" />Atrocidade<br/>


<br/><br/>

<input type="submit" value="Cadastrar" />

</form>

 

 

e esse aqui é o reponsavel pela mágica :!:

 

<meta charset="utf-8"/>


<?php

if(!isset($_POST['orelha'])){
echo "Nenhum valor selecionado";
}
else{

$itens = $_POST['orelha'];

foreach($itens as $i=>$valor){

for($x=0; $x<count($valor); $x++) {


}

}

}

$sqlCad = "Insert into EXAMES(coluna1,coluna2,coluna3) values($valor,$valor,$valor)";
echo $sqlCad . "<br>";

?>

 

Mas dessa forma a linha de inserçaõ do sql só pega o ultimo valor "checado"......acredito que tenho que dentro do for atribuir os valores dentro de outras variavéis ....mas como ??????? :wacko: :wacko: :wacko: :wacko:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom aprendi com um professor que as vezes em busca do otimo deixamos de fazer o simples. :innocent:
Então depois de muita pesquisa e de ajuda de um grande amigo meu e por sinal um otimo programador ( Bruno sucesso :graduated: ) e de um professor que é acima da média ( valeu Ortiz :clap: ) chegamos a essa solução :

<meta charset="utf-8"/>
<form action="cadastra2.php" method="POST">
    
    <input type="checkbox" name="orelha[0]" value="Lesões" />Lesões<br/>
    <input type="checkbox" name="orelha[1]" value="Deformidade" />Deformidade<br/>
    <input type="checkbox" name="orelha[2]" value="Normal" />Normal<br/>
    <input type="checkbox" name="orelha[3]" value="Deficiência" />Deficiência<br/>
    <input type="checkbox" name="orelha[4]" value="Atrocidade" />Atrocidade<br/>
    
   
    <br/><br/>
    
    <input type="submit" value="Cadastrar" />
    
</form>


Até aqui um formulario normal , só que tive que setar os indices pois cada checkbox tem seu lugar na tabela , aí tanto o for quanto o foreach não colocam os indices fixos , e aí poderiamos cadastrar valores em colunas erradas.

$orelha = isset($_POST['orelha']);   
           
<?php       
             $var1 = (isset($orelha[0]) != "") ? $orelha[0]  : "null";
             $var2 = (isset($orelha[1]) != "") ? $orelha[1]  : "null";
             $var3 = (isset($orelha[2]) != "") ? $orelha[2]  : "null";
             $var4 = (isset($orelha[3]) != "") ? $orelha[3]  : "null";
             $var5 = (isset($orelha[4]) != "") ? $orelha[4]  : "null";
    
               $sqlCad = "Insert into EXAMES(coluna1,coluna2,coluna3,coluna4,coluna5)
                values($var1,$var2,$var3,$var4,$var5)";
                echo $sqlCad . "<br>"; 

?>

e aí recebemos os valores do checkbox , vemos se ele esta vazio , se estiver, todos os valores seráo setados como null, se não ele identifica qual o valor que contem e coloca na sua coluna especifica,e os demais com null.

Como disse é uma solução simples , que pode ser implementada com for, foreach e etc...

Se alguem tiver uma ideia melhor ou conseguir implementar esse de uma forma mais dinamica... :coolio:

Então agradeço a ajuda dada pelos amigos aqui e espero que ajude outros a resolver esse probleminha que é tão recorrente.

 

Um abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá galera,

estou trabalhando com um sistema que lista os registros contidos no BD, e ao lado de cada registro há uma lixeira que quando clicada exclui o registro; coloquei um checkbox ao lado da lixeira para poder excluir todos os registros selecionados de uma só vez, mas estou tendo problemas com a sintaxe usando o Foreach:

obs: o foreach vai ser inserido dentro de um Case:

 

Listagem dos registros:

 

printf('<td><center><a href="?m=usuarios&t=cancelar&id=%s" title="Excluir">
<img src="images/delete.png" alt="Excluir"/>
<input type="checkbox" name="selecionado" id="%s"
value="selecionado"></center></td>'
Case de exclusão do registro:
case 'cancelar':
$sessao= new sessao();
if(isAdmin()==TRUE):
if(isset($_GET['id'])):
$id=$_GET['id'];
if(isset($_POST['excluir'])):
$user= new registros_geral();
$user->valorpk=$id;
$user->deletar($user);
if($user->linhasafetadas==1):
printMSG('Registro excluído com sucesso!', 'sucesso');
unset($_POST);
else:
printMSG('Nenhum registro excluído', 'erro');
endif;
endif;
$userbd= new registros_geral();
$userbd->extras_select ="WHERE id=$id";
$userbd->selecionaTudo($userbd);
$resbd=$userbd->retornaDados();
else:
printMSG('Registro não definido', 'erro');
endif;

 

Este é o código que funciona; preciso de ajuda para inserir um foreach no case 'cancelar'.

abri um form assim:

<form method= "POST">
<h3>Excluir registros selecionados</h3>
<input type="submit" name="excluir">
</form>
O foreach fiz assim:
foreach($_POST['selecionado'] as $id){

 

obrigado

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.