Ir para conteúdo

POWERED BY:

Arquivado

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

i.Surfer

Foreach com array multidimensional

Recommended Posts

Tudo bom galera???

 

Seguinte, tava tentando criar um script pra inserir um array multidimensional no DB, só que envez de exibir tudo que tem no array, ele para quando termina o primeiro bimestre e da este erro:

 

bimestre: 1 | materia: 1 | nota: 8.9bimestre: 1 | materia: 2 | nota: 2.5bimestre: 1 | materia: 3 | nota: 10bimestre: 1 | materia: 4 | nota: 0.4bimestre: 1 | materia: 5 | nota: 9.11Duplicate entry '1-1' for key 1
Mas quando tiro a parte do de inserir no DB ele funciona perfeitamente. http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif

 

Aqui esta o script:

 

PHP

[*]<?

[*]FUNCTION EXEC($i,$notas) {

[*] global $tb;

[*] FOREACH ($notas AS $tda => $x) {

[*] FOREACH ($notas[$tda] AS $mat => $nota ) {

[*] DB_OPEN();

[*] @mysql_query("INSERT INTO {$tb['notas_ano'](aluno,materia,{$tb['dano']},nota)

[*] VALUES ('{$i}','{$mat}','{$tda}','{$nota}')")

[*] OR ERRO(mysql_error());

[*] DB_CLOSE();

[*] echo "bimestre: $tda | materia: $mat | nota: $nota<br />";

[*] }

[*] }

[*]}

[*]

[*]$n["1"]["1"] = 8.90; $n["1"]["2"] = 2.50; $n["1"]["3"] = 10.0; $n["1"]["4"] = 0.40; $n["1"]["5"] = 9.11;

[*]$n["2"]["1"] = 4.50; $n["2"]["2"] = 6.54; $n["2"]["3"] = 7.00; $n["2"]["4"] = 8.99; $n["2"]["5"] = 6.30;

[*]$n["3"]["1"] = 2.40; $n["3"]["2"] = 6.00; $n["3"]["3"] = 8.50; $n["3"]["4"] = 9.00; $n["3"]["5"] = 7.80;

[*]$n["4"]["1"] = 9.36; $n["4"]["2"] = 5.40; $n["4"]["3"] = 6.10; $n["4"]["4"] = 6.30; $n["4"]["5"] = 8.00;

[*]

[*]EXEC("1",$n)

[*]?> 

 

Atenção:

1) A variável '$tb' vem de um config que fiz, e os valores usados dela são $tb['notas_ano'] = "notas_bimestrais" e $tb['dano'] = "bimestre".

2) As funções, DB_OPEN() para abrir conexao com o DB, ERRO() mostrar erro personalizadamente caso exista, e DB_CLOSE() que fecha a conexao.

 

 

Gente, agradeço muito se alguem puder me ajudar, tentei de tudo aqui mas não achei uma solução, pesquisei no php.net e no mysql.com também, mas não encontrei nada à respeito.

 

Valeu ! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

A tabela onde ocorre esse INSERT é essa:

 

CREATE TABLE notas_ano (
 aluno INT NOT NULL DEFAULT '',
 materia INT NOT NULL DEFAULT '',
 bimestre INT NOT NULL DEFAULT '',
 nota FLOAT NOT NULL DEFAULT '',
 PRIMARY KEY  (aluno,materia)
);

 

1) Sem a parte do MySQL no codigo funciona normalmente certo?! Então deve ser algo com o MySQL mesmo, mas não sei o que é.

2) O que é esse negócio de duplicado ???

3) Não usei UNIQUE, devo usar???

 

Bom, valeu pela ajuda ! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

você define um campo como UNIQUE para que não possa ser inserido 2 vezes o mesmo valor, texto... bastante usado para email, id, coisas do tipo.

valor duplicado é o mesmo valor inserido 2 vezes, por exemplo dois produtos com mesmo código ou o mesmo aluno na mesma matéria duas vezes. :P

Então, a pergunta do Felipe é se você usou alguma propriedade que evite sejam inseridos mesmos valores 2 vezes...

 

Você definiu a chave primária aluno + matéria....

Está inserindo até aluno = 1 e matéria = 5

bimestre: 1 | materia: 1 | nota: 8.9bimestre: 1 | materia: 2 | nota: 2.5bimestre: 1 | materia: 3 | nota: 10bimestre: 1 | materia: 4 | nota: 0.4bimestre: 1 | materia: 5 | nota: 9.11

A partir dae você tenta repetir a chave. Não poderá mais repetir a combinação aluno = 1 e matéria = 2 ou outra que se repita. Assim estará cadastrando o mesmo aluno na mesma matéria duas vezes. Duplicidade :)

 

Dae você tem que ver, se for permitido cadastrar o mesmo aluno na mesma matéria, deve mudar a chave primária.

 

Consegui me expressar direitinho? :P

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

você define um campo como UNIQUE para que não possa ser inserido 2 vezes o mesmo valor, texto... bastante usado para email, id, coisas do tipo.

valor duplicado é o mesmo valor inserido 2 vezes, por exemplo dois produtos com mesmo código ou o mesmo aluno na mesma matéria duas vezes.  :P

Então, a pergunta do Felipe é se você usou alguma propriedade que evite sejam inseridos mesmos valores 2 vezes...

 

Você definiu a chave primária aluno + matéria....

Está inserindo até aluno = 1 e matéria = 5

bimestre: 1 | materia: 1 | nota: 8.9bimestre: 1 | materia: 2 | nota: 2.5bimestre: 1 | materia: 3 | nota: 10bimestre: 1 | materia: 4 | nota: 0.4bimestre: 1 | materia: 5 | nota: 9.11
A partir dae você tenta repetir a chave. Não poderá mais repetir a combinação aluno = 1 e matéria = 2 ou outra que se repita. Assim estará cadastrando o mesmo aluno na mesma matéria duas vezes. Duplicidade  :)

 

Dae você tem que ver, se for permitido cadastrar o mesmo aluno na mesma matéria, deve mudar a chave primária.

 

Consegui me expressar direitinho?  :P

 

Abraço

<{POST_SNAPBACK}>

http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Entendi ! Ótima explicação, muito obrigado !

 

Só mais um coisa, não tem outra solução, porque preciso ter alunos e matérias como chave primária para poder fazer select multiplo, como posso resolver isso gente ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguem ??? Estou precisando encontrar uma solução pessoal, por favor, alguem pode me ajudar???Grato !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cria um outro campo e declara como uma terceira chave... hora + data... time() ou então uma ID pra cada registro... alguma coisa para que não haja duplicidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Consegui resolver o problema da duplicidade ! :D Fiz como você falou Rauffer, coloquei como PK 3 campos, assim o problema foi resolvido. http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

 

Continuando o script, cheguei a outro erro muito estranho que fiquei horas tentando contornar e nada, o script funciona, faz tudo que mando fazer, só que exibe um erro que não faz nada :wacko:

 

Se alguem puder me ajudar fico grato ! O script segue logo abaixo:

 

PHP

[*]FUNCTION EDIT($id,$f) {

[*] global $tb;

[*] FOREACH ($f AS $d => $x) {

[*] FOREACH ($f[$d] AS $m => $ft) {

[*] DB_OPEN();

[*] $q = @mysql_query("SELECT faltas 

[*]  FROM {$tb['faltas']} 

[*]  WHERE aluno='{$id}' AND {$tb['dano']}='{$d}' 

[*]  AND materia='{$m}'")

[*]  OR ERRO(mysql_error());

[*]

[*] $r = @mysql_fetch_row($q);

[*]

[*] IF ($r[0] == "") {

[*] @mysql_query("INSERT INTO {$tb['faltas']}

[*] (aluno,{$tb['dano']},materia,faltas)

[*] VALUES ('{$id}','{$d}','{$m}','{$ft}')")

[*] OR ERRO(mysql_error());

[*]

[*] $metodo = "INSERT";

[*] }

[*] ELSE {

[*] @mysql_query("UPDATE {$tb['faltas']} 

[*] SET faltas='{$ft}' 

[*] WHERE aluno='{$id}' AND {$tb['dano']}='{$d}'

[*] AND materia='{$m}'")

[*] OR ERRO(mysql_error());

[*]

[*] $metodo = "UPDATE";

[*] }

[*] DB_CLOSE();

[*] echo "{$tb['dano']}: {$d}    |    materia: {$m}

[*]    |    falta: {$ft}    ($metodo)<br />";

[*] }

[*] }

[*]}

[*]

[*]$f["1"]["1"] = 11; $f["2"]["1"] = 6; $f["3"]["1"] = 5; $f["4"]["1"] = 14;

[*]$f["1"]["2"] = 9.; $f["2"]["2"] = 8; $f["3"]["2"] = 10; $f["4"]["2"] = 6;

[*]$f["1"]["3"] = 15; $f["2"]["3"] = 4; $f["3"]["3"] = 3; $f["4"]["3"] = 8;

[*]$f["1"]["4"] = 3; $f["2"]["4"] = 7; $f["3"]["4"] = 0; $f["4"]["4"] = 10;

[*]$f["1"]["5"] = 8; $f["2"]["5"] = 1; $f["3"]["5"] = 15; $f["4"]["5"] = 0;

[*]$f["1"]["6"] = 4; $f["2"]["6"] = 5; $f["3"]["6"] = 12; $f["4"]["6"] = 0;

[*]$f["1"]["7"] = 12; $f["2"]["7"] = 2; $f["3"]["7"] = 7; $f["4"]["7"] = 0;

[*]$f["1"]["8"] = 9; $f["2"]["8"] = 0; $f["3"]["8"] = 8; $f["4"]["8"] = 4;

[*]$f["1"]["9"] = 0; $f["2"]["9"] = 0; $f["3"]["9"] = 1; $f["4"]["9"] = 1;

[*]$f["1"]["10"] = 0; $f["2"]["10"] = 1; $f["3"]["10"] = 1; $f["4"]["10"] = 6;

[*]$f["1"]["11"] = 6; $f["2"]["11"] = 1; $f["3"]["11"] = 0; $f["4"]["11"] = 1;

[*]$f["1"]["12"] = 2; $f["2"]["12"] = 3; $f["3"]["12"] = 0; $f["4"]["12"] = 2;

[*]$f["1"]["13"] = 1; $f["2"]["13"] = 7; $f["3"]["13"] = 9; $f["4"]["13"] = 2;

[*]$f["1"]["14"] = 0; $f["2"]["14"] = 6; $f["3"]["14"] = 3; $f["4"]["14"] = 0;

[*]$f["1"]["15"] = 1; $f["2"]["15"] = 2; $f["3"]["15"] = 1; $f["4"]["15"] = 0;

[*]EDIT("1",$f);

 

ATENÇÃO: As funções DB_OPEN() e DB_CLOSE() vem de outro arquivo, elas fazem a conexão com o Banco de Dados. E a variável $tb é um array que contém o nome das tabelas no Banco de Dados.

 

E ele imprime no browser isso:

 

Warning: Invalid argument supplied for foreach() in C:\root\teste.php on line 4

 

Warning: Invalid argument supplied for foreach() in C:\root\teste.php on line 4

 

Warning: Invalid argument supplied for foreach() in C:\root\teste.php on line 4

 

Warning: Invalid argument supplied for foreach() in C:\root\teste.php on line 4

 

Warning: Invalid argument supplied for foreach() in C:\root\teste.php on line 4

 

Warning: Invalid argument supplied for foreach() in C:\root\teste.php on line 4

 

Warning: Invalid argument supplied for foreach() in C:\root\teste.php on line 4

 

Warning: Invalid argument supplied for foreach() in C:\root\teste.php on line 4

bimestre: 1    |    materia: 1    |    falta: 11    (INSERT)

bimestre: 1    |    materia: 2    |    falta: 9    (INSERT)

bimestre: 1    |    materia: 3    |    falta: 15    (INSERT)

bimestre: 1    |    materia: 4    |    falta: 3    (INSERT)

bimestre: 1    |    materia: 5    |    falta: 8    (INSERT)

bimestre: 1    |    materia: 6    |    falta: 4    (INSERT)

bimestre: 1    |    materia: 7    |    falta: 12    (INSERT)

bimestre: 1    |    materia: 8    |    falta: 9    (INSERT)

bimestre: 1    |    materia: 9    |    falta: 0    (INSERT)

bimestre: 1    |    materia: 10    |    falta: 0    (INSERT)

bimestre: 1    |    materia: 11    |    falta: 6    (INSERT)

bimestre: 1    |    materia: 12    |    falta: 2    (INSERT)

bimestre: 1    |    materia: 13    |    falta: 1    (INSERT)

bimestre: 1    |    materia: 14    |    falta: 0    (INSERT)

bimestre: 1    |    materia: 15    |    falta: 1    (INSERT)

bimestre: 2    |    materia: 1    |    falta: 6    (INSERT)

bimestre: 2    |    materia: 2    |    falta: 8    (INSERT)

bimestre: 2    |    materia: 3    |    falta: 4    (INSERT)

bimestre: 2    |    materia: 4    |    falta: 7    (INSERT)

bimestre: 2    |    materia: 5    |    falta: 1    (INSERT)

bimestre: 2    |    materia: 6    |    falta: 5    (INSERT)

bimestre: 2    |    materia: 7    |    falta: 2    (INSERT)

bimestre: 2    |    materia: 8    |    falta: 0    (INSERT)

bimestre: 2    |    materia: 9    |    falta: 0    (INSERT)

bimestre: 2    |    materia: 10    |    falta: 1    (INSERT)

bimestre: 2    |    materia: 11    |    falta: 1    (INSERT)

bimestre: 2    |    materia: 12    |    falta: 3    (INSERT)

bimestre: 2    |    materia: 13    |    falta: 7    (INSERT)

bimestre: 2    |    materia: 14    |    falta: 6    (INSERT)

bimestre: 2    |    materia: 15    |    falta: 2    (INSERT)

bimestre: 3    |    materia: 1    |    falta: 5    (INSERT)

bimestre: 3    |    materia: 2    |    falta: 10    (INSERT)

bimestre: 3    |    materia: 3    |    falta: 3    (INSERT)

bimestre: 3    |    materia: 4    |    falta: 0    (INSERT)

bimestre: 3    |    materia: 5    |    falta: 15    (INSERT)

bimestre: 3    |    materia: 6    |    falta: 12    (INSERT)

bimestre: 3    |    materia: 7    |    falta: 7    (INSERT)

bimestre: 3    |    materia: 8    |    falta: 8    (INSERT)

bimestre: 3    |    materia: 9    |    falta: 1    (INSERT)

bimestre: 3    |    materia: 10    |    falta: 1    (INSERT)

bimestre: 3    |    materia: 11    |    falta: 0    (INSERT)

bimestre: 3    |    materia: 12    |    falta: 0    (INSERT)

bimestre: 3    |    materia: 13    |    falta: 9    (INSERT)

bimestre: 3    |    materia: 14    |    falta: 3    (INSERT)

bimestre: 3    |    materia: 15    |    falta: 1    (INSERT)

bimestre: 4    |    materia: 1    |    falta: 14    (INSERT)

bimestre: 4    |    materia: 2    |    falta: 6    (INSERT)

bimestre: 4    |    materia: 3    |    falta: 8    (INSERT)

bimestre: 4    |    materia: 4    |    falta: 10    (INSERT)

bimestre: 4    |    materia: 5    |    falta: 0    (INSERT)

bimestre: 4    |    materia: 6    |    falta: 0    (INSERT)

bimestre: 4    |    materia: 7    |    falta: 0    (INSERT)

bimestre: 4    |    materia: 8    |    falta: 4    (INSERT)

bimestre: 4    |    materia: 9    |    falta: 1    (INSERT)

bimestre: 4    |    materia: 10    |    falta: 6    (INSERT)

bimestre: 4    |    materia: 11    |    falta: 1    (INSERT)

bimestre: 4    |    materia: 12    |    falta: 2    (INSERT)

bimestre: 4    |    materia: 13    |    falta: 2    (INSERT)

bimestre: 4    |    materia: 14    |    falta: 0    (INSERT)

bimestre: 4    |    materia: 15    |    falta: 0    (INSERT)

Fico no aguardo, valeu gente !! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilizando a informações (o array) que foi passado, fiz da seguinte forma:

 

foreach ($f as $bimestre => $materia){    print "<h2>" . $bimestre . "</h2>";        foreach ($materia as $mat => $nota)    {        print $mat ."=>".$nota."<br />";    }}

Verifique se é o esperado.

 

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilizando a informações (o array) que foi passado, fiz da seguinte forma:

 

foreach ($f as $bimestre => $materia){    print "<h2>" . $bimestre . "</h2>";        foreach ($materia as $mat => $nota)    {        print $mat ."=>".$nota."<br />";    }}
Verifique se é o esperado.

 

 

[]'s

<{POST_SNAPBACK}>

Tentei adaptar ao modo que você fez e continua dando o mesmo erro! Mas o que você fez não ;e exatamente o que quero.

 

Eu altererei uma parte do script que fiz por uma parte do seu que estava diferente, olha ai:

 

PHP

[*]FUNCTION EDIT($id,$f) {

[*] global $tb;

[*] FOREACH ($f AS $d => $x) {

[*]// Foi nesta parte abaixo que troquei o ' $f[$d] ' por $x como o que você fez Felipe

[*] FOREACH ($x AS $m => $ft) {

[*] DB_OPEN();

[*] $q = @mysql_query("SELECT faltas 

[*]  FROM {$tb['faltas']} 

[*]  WHERE aluno='{$id}' AND {$tb['dano']}='{$d}' 

[*]  AND materia='{$m}'")

[*]  OR ERRO(mysql_error());

[*]

[*] $r = @mysql_fetch_row($q);

[*]

[*] IF ($r[0] == "") {

[*] @mysql_query("INSERT INTO {$tb['faltas']}

[*] (aluno,{$tb['dano']},materia,faltas)

[*] VALUES ('{$id}','{$d}','{$m}','{$ft}')")

[*] OR ERRO(mysql_error());

[*]

[*] $metodo = "INSERT";

[*] }

[*] ELSE {

[*] @mysql_query("UPDATE {$tb['faltas']} 

[*] SET faltas='{$ft}' 

[*] WHERE aluno='{$id}' AND {$tb['dano']}='{$d}'

[*] AND materia='{$m}'")

[*] OR ERRO(mysql_error());

[*]

[*] $metodo = "UPDATE";

[*] }

[*] DB_CLOSE();

[*] echo "{$tb['dano']}: {$d}    |    materia: {$m}

[*]    |    falta: {$ft}    ($metodo)<br />";

[*] }

[*] }

[*]}

[*]

[*]$f["1"]["1"] = 11; $f["2"]["1"] = 6; $f["3"]["1"] = 5; $f["4"]["1"] = 14;

[*]$f["1"]["2"] = 9.; $f["2"]["2"] = 8; $f["3"]["2"] = 10; $f["4"]["2"] = 6;

[*]$f["1"]["3"] = 15; $f["2"]["3"] = 4; $f["3"]["3"] = 3; $f["4"]["3"] = 8;

[*]$f["1"]["4"] = 3; $f["2"]["4"] = 7; $f["3"]["4"] = 0; $f["4"]["4"] = 10;

[*]$f["1"]["5"] = 8; $f["2"]["5"] = 1; $f["3"]["5"] = 15; $f["4"]["5"] = 0;

[*]EDIT("1",$f);

 

Mas obrigado mesmo assim pela ajuda, aguardo respostas! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como devem vir os resultados?Pensei que era:-------------------------BimestreMateria => Nota...-------------------------

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como devem vir os resultados?

Pensei que era:

 

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

Bimestre

 

Materia => Nota

...

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

<{POST_SNAPBACK}>

Isso que o script imprime na tela é apenas como debugger pra ver o que o codigo esta fazendo, o importante é a inserção ou atualização no banco de dados.

 

E o erro está ocorrendo no segundo foreach, mas não entendo o porque !

 

Valeu! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro ainda é:Invalid argument supplied for foreach()??Se for, verifique a estrutura do Array fornecido com print_r() antes de utilizar os foreach's.[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro ainda é:

Invalid argument supplied for foreach()

??

 

Se for, verifique a estrutura do Array fornecido com print_r() antes de utilizar os foreach's.

 

 

[]'s

<{POST_SNAPBACK}>

Como que verifico a estrutura com print_r ??

E sim, o erro é " invalid arqument supplied for foreach() "

 

Grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloca:

 

FUNCTION EDIT($id,$f) {    global $tb;        //----------------------    // Visualizar array        print "<pre>";    print_r($f);        //--------------------        FOREACH ($f AS $d => $x) {// Foi nesta parte abaixo que troquei o ' $f[$d] ' por $x como o que você fez Felipe        FOREACH ($x AS $m => $ft) {            DB_OPEN();            $q = @mysql_query("SELECT faltas                               FROM {$tb['faltas']}                               WHERE aluno='{$id}' AND {$tb['dano']}='{$d}'                                     AND materia='{$m}'")                 OR ERRO(mysql_error());            $r = @mysql_fetch_row($q);            IF ($r[0] == "") {                @mysql_query("INSERT INTO {$tb['faltas']}                              (aluno,{$tb['dano']},materia,faltas)                              VALUES ('{$id}','{$d}','{$m}','{$ft}')")                OR ERRO(mysql_error());                $metodo = "INSERT";            }            ELSE {                @mysql_query("UPDATE {$tb['faltas']}                              SET faltas='{$ft}'                              WHERE aluno='{$id}' AND {$tb['dano']}='{$d}'                                    AND materia='{$m}'")                OR ERRO(mysql_error());                $metodo = "UPDATE";            }            DB_CLOSE();            echo "{$tb['dano']}: {$d}	|	 materia: {$m}                     |	 falta: {$ft}	($metodo)<br />";        }    }}

Com print_r() veremos como está a estrutura do Array.

Com isso veremos o porque do erro no foreach.

 

 

Vamos lá!

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.