Ir para conteúdo

POWERED BY:

Arquivado

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

Luciano Zanita

Como gravar um foreach no mysql

Recommended Posts

Pessoal boa noite, gostaria de tirar uma dúvida com vocês.

Seguinte eu estou utilizando um foreach para listar os resultados do select multiple no php, mais gostaria de gravar todos esses resultados no mysql, só que não estou conseguindo, veja como ficou o código, só que ele apenas grava o primeiro resultado.

foreach ($mu2 as $mu3) {
        $mu1 = '<option value="'.$mu3.'">'.$mu3.'</option>';
        // Monta a consulta
        mysql_query("UPDATE playlist SET musicas='$mu1' WHERE id = '$id'");
        }

Sem o cadastro mysql ele exibe normal, mais para cadastrar ele nao esta indo, vale ressaltar que as arrays colocada estão funcionando normal, único problema é registrar o foreach no mysql.
No caso quero apenas atualizar um campo chamado musicas com todos resultados do foreach.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

sugiro que vc troque de

mysql_query("UPDATE playlist SET musicas='$mu1' WHERE id = '$id'");

para

$sql = "UPDATE playlist SET musicas='$mu1' WHERE id = '$id'";
echo $sql;

Assim fica mais facil de saber que consultas ele esta enviando ao banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Então cadastrando ta mais apenas 1 unico resultado em vez de todos.

Pois se eu selecionar + de 1 no select multiple ele nao reconhece na hora de cadastrar no mysql mais no foreach reconhece normal por echo no $mu1

Só na parte do mysql que nao vai.[/size]

Compartilhar este post


Link para o post
Compartilhar em outros sites

O atributo "name" da tab <select> deve estar com colchetes, para que todos os valores sejam enviados pro PHP. Caso contrário, só um será enviado/

 

Ex:

 

<select name="opcoes[]">
...

 

Outra coisa estranha é o UPDATE junto com a exibição... é esse o comportamento que quer, mesmo?

 

 

PS: funções mysql_* estão obsoletas desde o PHP 5.5. Prefira usar MySQLi ou PDO. Veja mais aqui: http://www.ultimatephp.com.br/php-por-que-nao-utilizar-funcoes-mysql

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você colocou o UPDATE dentro do loop. Isso faz um UPDATE para cada item. Se quer fazer um único UPDATE com todos os itens, deixe o UPDATE fora do loop e use implode() para transformar o array em string.

 

Mas essa é a modelagem errada. É bom evitar campos multivalorados. Veja: http://rberaldo.com.br/usando-campos-multivalorados/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você colocou o UPDATE dentro do loop. Isso faz um UPDATE para cada item. Se quer fazer um único UPDATE com todos os itens, deixe o UPDATE fora do loop e use implode() para transformar o array em string.

 

Mas essa é a modelagem errada. É bom evitar campos multivalorados. Veja: http://rberaldo.com.br/usando-campos-multivalorados/

 

E como posso fazer isto, tem algum exemplo prático para uso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

php > $arr = ['valor1', 'valor2', 'valor3'];
php > print_r( $arr );
Array
(
    [0] => valor1
    [1] => valor2
    [2] => valor3
)
php > $str = implode( ', ', $arr );
php > var_dump( $str );
string(22) "valor1, valor2, valor3"

 

Mais aqui: http://php.net/implode

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz esse processo mais não consegui exito,

preciso que apenas a uma array que consiga passar a resposta dupla para o mysql cadastrar ao invés de apenas uma apenas.

foreach($_POST["valor"] as $valoresdasmusicas){
            $salvamento = '<option value="'.$valoresdasmusicas.'">'.$valoresdasmusicas.'</option>';
            mysql_query("UPDATE playlist SET musicas='$oksalvar' WHERE id = '$playlistid'");
        }

Como posso aplicar o implode nesse código para que passe o resultado, no caso ele vai cadastrar na BD um option de select no mesmo campo repetindo varias vezes com diferentes resultados, exemplo

<option value="valor1">valor1</option><option value="valor2">valor2</option><option value="valor3">valor3</option><option value="valor4">valor4</option>

e assim por diante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mano, tenta ai

 

 

	for($x=0 ; $x < count($mu2) ; $x++){
	$mu1 = '<option value="'.$mu2[$x].'">'.$mu2[$x].'</option>';
	// Monta a consulta
	mysql_query("UPDATE playlist SET musicas='".$mu1."' WHERE id = '".$id."'");
	}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Já tinha tentando desta forma, mais ainda não consigo receber todos os dados no mysql recebo apenas o primeiro em vez de todos, mais através de um echo consigo ver que o for e foreach recebem normal os resultados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hein?!

Ninguém percebeu que é um UPDATE dentro de um LAÇO com um WHERE id ?

 

Na verdade, está gravando todos, só que um em cima do outro.

 

Primeira coisa: como é a tabela ? poste o schema dela aqui.

Segunda coisa: não grave o html da tag <option> no banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caso ele faz o update apenas com campo musica da determinada ID.

o campo esta com varchar(300).

Como posso fazer a query do mysql para salvar todos resultados juntos ao invés de substituir da forma que você falou...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depende, como é a tabela no banco de dados ?

 

Vai gravar um do lado do outro ? (má modelagem)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depende, como é a tabela no banco de dados ?

 

Vai gravar um do lado do outro ? (má modelagem)

 

tabela playlist como esta no código.

Sobre gravar um do lado do outro tem um motivo obvio, pois ficaria meio inviável gravar 10 mil campos por exemplo novos para atender.

Então acaba sendo viável um ao lado do outro depois fazendo a separação no código.

Claro que foi só um exemplo a parte dos 10 mil campos novos, por isto quero colocar tudo junto no campo musicas pelo UPDATE pelo fato que vai ser muitos resultados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então use a dica do @Beraldo.

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

php > $arr = ['valor1', 'valor2', 'valor3'];
php > print_r( $arr );
Array
(
    [0] => valor1
    [1] => valor2
    [2] => valor3
)
php > $str = implode( ', ', $arr );
php > var_dump( $str );
string(22) "valor1, valor2, valor3"

Ainda assim você está equivocado, e não se "cria 10 mil campos (colunas)", e sim uma modelagem normalizada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então use a dica do @Beraldo.

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

php > $arr = ['valor1', 'valor2', 'valor3'];
php > print_r( $arr );
Array
(
    [0] => valor1
    [1] => valor2
    [2] => valor3
)
php > $str = implode( ', ', $arr );
php > var_dump( $str );
string(22) "valor1, valor2, valor3"
Ainda assim você está equivocado, e não se "cria 10 mil campos (colunas)", e sim uma modelagem normalizada.

 

 

como que posso aplicar isso para cadastrar no mysql? pois tentei usar o implode e foi meio que mal sucedido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda insisto, sua modelagem vai te trazer dores de cabeça. Use uma tabela auxiliar, como sugeri no [anchorlink=2131148]post #6[/anchorlink], e como reforçado pelo William no [anchorlink=2131414]post #16[/anchorlink]

 

Mas, se realmente quiser deixar tudo em um único campo, faça-o por sua conta e risco.

O implode é usado assim:

 

 

mysql_query("UPDATE playlist SET musicas='" . implode( ',', $mu1 ) . "' WHERE id = '$id'");

E deixe fora do loop. Não faz sentido executar o update N vezes, sempre com o mesmo ID

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda insisto, sua modelagem vai te trazer dores de cabeça. Use uma tabela auxiliar, como sugeri no [anchorlink=2131148]post #6[/anchorlink], e como reforçado pelo William no [anchorlink=2131414]post #16[/anchorlink]

 

Mas, se realmente quiser deixar tudo em um único campo, faça-o por sua conta e risco.

O implode é usado assim:

 

 

mysql_query("UPDATE playlist SET musicas='" . implode( ',', $mu1 ) . "' WHERE id = '$id'");

E deixe fora do loop. Não faz sentido executar o update N vezes, sempre com o mesmo ID

 

 

Então o problema que já fiz dessa forma com implode mais não funcionou ele não passa nenhum resultado.

Sei disso porque fiz um echo para ver e no mysql também não ta cadastrando o implode, se eu colocar um resultado com texto ele vai normal.

 

Lembrando que os dados ta vindo de um select

e estão sendo recebidos por $_POST, vale lembrar que o array recebe do select que esta para enviar varios resultados [].

 

Mesmo assim com implode não cadastrar, já a questão de mostrar por foreach no echo ele mostra só na hora do implode que não cadastra o texto.

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.