Tiago j.a 0 Denunciar post Postado Fevereiro 18, 2010 Bom dia pessoal, eu estou com um problema de inserção no banco de dados, ele está inserindo apenas o último campo do formulário. Eu tenho um formulário, onde esse formulário possui vários valores, é um array. E quando envio para o banco, envio os dados para duas tabelas, com um loop, mas ele está enviando para o banco apenas o último. esse é o código de envio: if(isset($_POST['fornecedor'])){ //$fornecedor = $_POST['fornecedor']; foreach($_POST['data'] as $IdArray => $ValueArray) ?><br /><a href="index.php?link=2" class="textocentro">Voltar<br /></a><?php { if (($_POST['data'][$IdArray] == "" || $_POST['equipamento'][$IdArray] == "" || $_POST['numero_certificado'][$IdArray] == "" || $_FILES['pdf']['name'][$IdArray] == "")) { echo "Nao foi possivel inserir os dados do campo: "; echo $IdArray + 1; echo "<br>"; } else { if(isset($INSERT)){ $INSERT .= ",('$fornecedor[0]','".$_POST['data'][$IdArray]."','".$_POST['numero_certificado'][$IdArray]."','".$_FILES['pdf']['name'][$IdArray]."')"; $INSERT2 .= ",('$fornecedor[0]','".$_POST['numero_certificado'][$IdArray]."','".$_POST['equipamento'][$IdArray]."')"; } else{ $INSERT = "INSERT INTO certificado (fornecedor,data,numero_certificado,pdf) values ('$fornecedor[0]','".$_POST['data'][$IdArray]."','".$_POST['numero_certificado'][$IdArray]."','".$_FILES['pdf']['name'][$IdArray]."')"; $INSERT2 = "INSERT INTO equipamento (fornecedor,numero_certificado,equipamento) values ('$fornecedor[0]','".$_POST['numero_certificado'][$IdArray]."','".$_POST['equipamento'][$IdArray]."')"; } mysql_query($INSERT); mysql_query($INSERT2); } } if(isset($INSERT) && isset($INSERT2)){ echo "<br>"; echo "Dados corretos enviados com sucesso"; } } Desde já agradeço a compreensão e ajuda de todos. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 18, 2010 Insira uns echos nos blocos para ver onde estão caindo. E arrume a indentação do código. Está péssimo de entender. Não consegui perceber onde termina cada bloco. Assim fica mais difícil de detectar os problemas. Compartilhar este post Link para o post Compartilhar em outros sites
Dee 0 Denunciar post Postado Fevereiro 18, 2010 Porquê você verifica: if(isset($INSERT)){ Sem mesmo nao ter nada nessa variável ? Não é para entrar no If propositalmente e entrar no Else ? Ps: Beraldo E arrume a indentação do código. Está péssimo de entender. Não consegui perceber onde termina cada bloco. Assim fica mais difícil de detectar os problemas. Compartilhar este post Link para o post Compartilhar em outros sites
Tiago j.a 0 Denunciar post Postado Fevereiro 18, 2010 isso,ele entra no else sempre, tirei já aquela verificação. Ele tá enviando apenas o último, porque, essa parte aqui, está fora do loop, ou isso não tem nada a ver? mysql_query($INSERT); mysql_query($INSERT2); Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 18, 2010 Se está fora do loop, é esse o motivo. Insira esse trecho dentro do loop. Estando fora do loop, apenas a última SQL será executada Compartilhar este post Link para o post Compartilhar em outros sites
Tiago j.a 0 Denunciar post Postado Fevereiro 18, 2010 coloquei dentro do loop, mas continua enviando apenas o último. if(isset($_POST['fornecedor'])) { foreach($_POST['data'] as $IdArray => $ValueArray) ?><br /><a href="index.php?link=2" class="textocentro">Voltar<br /></a><?php { if (($_POST['data'][$IdArray] == "" || $_POST['equipamento'][$IdArray] == "" || $_POST['numero_certificado'][$IdArray] == "" || $_FILES['pdf']['name'][$IdArray] == "")) { echo "Nao foi possivel inserir os dados do campo: "; echo $IdArray + 1; echo "<br>"; } else { $INSERT = "INSERT INTO certificado (fornecedor,data,numero_certificado,pdf) values ('$fornecedor[0]','".$_POST['data'][$IdArray]."','".$_POST['numero_certificado'][$IdArray]."','".$_FILES['pdf']['name'][$IdArray]."')"; $INSERT2 = "INSERT INTO equipamento (fornecedor,numero_certificado,equipamento) values ('$fornecedor[0]','".$_POST['numero_certificado'][$IdArray]."','".$_POST['equipamento'][$IdArray]."')"; } mysql_query($INSERT); mysql_query($INSERT2); } if(isset($INSERT) && isset($INSERT2)) { echo "<br>"; echo "Dados corretos enviados com sucesso"; } } Compartilhar este post Link para o post Compartilhar em outros sites
Dee 0 Denunciar post Postado Fevereiro 18, 2010 Só um detalhe, no seu insert você colocou isso: $_POST['data'][$IdArray] Mas no Foreach você declarou isso como $ValueArray, então porque você nao coloca: $ValueArray[$IdArray] ? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 18, 2010 outra coisa é que você está inserindo conteúdo entre o foreach e a chave de abertura. Junte as duas partes $INSERT e $INSERT2 são strings. Sempre retornarão TRUE. Você tem que testar o retorno de mysql_query. Mais precisamente, precisa usar a função mysql_affected_rows para determinar o número de linhas afetadas pelo comando SQL. Sua indentação ainda está deprimente. Desculpe a sinceridade. Já pensou em alinahr os blocos? É bem mais fácil de entender: foreach( ... ) { if ( ... ) { ... } else { if ( ... ) { ... } } } Compartilhar este post Link para o post Compartilhar em outros sites
Tiago j.a 0 Denunciar post Postado Fevereiro 18, 2010 uahsuahsua desculpa a bagunça, é que faz pouco que começei, isso não justifica mas, to meio enrolado ainda .prometo que vou fazerda maneira certa. usei a função que me passou, e me retornou: Warning: mysql_affected_rows() expects parameter 1 to be resource, string given in C:\xampp\htdocs\quali\Admin\teste_qualipar\cadastra_certificado.php on line 105 Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 18, 2010 Mostre como fez. Provavelmente colocou uma string como parâmetro. Veja a documentação da função: http://www.php.net/manual/en/function.mysql-affected-rows.php O parâmetro é opcional, mas, se passar parâmetor, deve ser o link de conexão Compartilhar este post Link para o post Compartilhar em outros sites
Tiago j.a 0 Denunciar post Postado Fevereiro 18, 2010 fiz assim, e me retornou 1. mysql_query($INSERT); mysql_query($INSERT2); echo mysql_affected_rows(); Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 18, 2010 isso quer dizer que a última inserção afetou uma linha. Você tem que testar cada uma das inserções separadamente, ou seja, chame mysql_affected_rows após cada INSERT Compartilhar este post Link para o post Compartilhar em outros sites
Tiago j.a 0 Denunciar post Postado Fevereiro 18, 2010 coloquei em baixo dos dois INSERT´S, dentro do loop, ele me retornou -1. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 18, 2010 É só ler o link que passei. Returns the number of affected rows on success, and -1 if the last query failed. A query falhou. Use mysql_error para verificar o erro que foi retornado http://www.php.net/mysql_error A documentação explica tudo sobre as funções. Compartilhar este post Link para o post Compartilhar em outros sites
Tiago j.a 0 Denunciar post Postado Fevereiro 18, 2010 passo por parametro o insert, isso? me retornou o seguinte: Warning: mysql_error() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\quali\Admin\teste_qualipar\cadastra_certificado.php on line 104 Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 18, 2010 Não. Veja o link que passei mysql_error não tem parâmetros. Execute as consultas assim: mysql_query( consulta ) or exit( mysql_error() ); Compartilhar este post Link para o post Compartilhar em outros sites
Tiago j.a 0 Denunciar post Postado Fevereiro 18, 2010 coloquei desta forma, ele não me retornou erro algum: mysql_query( $INSERT ) or exit( mysql_error() ); mysql_query( $INSERT2 ) or exit( mysql_error() ); Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 18, 2010 Então poste o script atualizado, com todas as modificações. Diga exatamente o que está acontecendo, qual consulta retorna 1 e qual retorna -1 Compartilhar este post Link para o post Compartilhar em outros sites
Tiago j.a 0 Denunciar post Postado Fevereiro 18, 2010 Ai está o script, o mysql_affected_rows() imprimi apenas 1, era para imprimir dois valores, pois estou enviando dois campos pelo formulário. eu não sei o que está acontecendo, ele envia apenas o último campo, verifiquei se o for está fazendo o loop corretamente, e está, imprimi as variaveis dentro do loop para ver se tinha valor nelas, e imprimiu corretamente. $certificado[0] $certificado[1] Só que ao enviar para o banco, ele envia apenas o último foreach($_POST['data'] as $IdArray => $ValueArray) ?><br /><a href="index.php?link=2" class="textocentro">Voltar<br /></a><?php { if (($_POST['data'][$IdArray] == "" || $_POST['equipamento'][$IdArray] == "" || $_POST['numero_certificado'][$IdArray] == "" || $_FILES['pdf']['name'][$IdArray] == "")) { echo "Nao foi possivel inserir os dados do campo: "; echo $IdArray + 1; echo "<br>"; } else { $INSERT = "INSERT INTO certificado (fornecedor,data,numero_certificado,pdf) values ('$fornecedor[0]','".$_POST['data'][$IdArray]."','".$_POST['numero_certificado'][$IdArray]."','".$_FILES['pdf']['name'][$IdArray]."')"; $INSERT2 = "INSERT INTO equipamento (fornecedor,numero_certificado,equipamento) values ('$fornecedor[0]','".$_POST['numero_certificado'][$IdArray]."','".$_POST['equipamento'][$IdArray]."')"; } mysql_query($INSERT) or exit( mysql_error() ); mysql_query($INSERT2) or exit( mysql_error() ); echo mysql_affected_rows(); } if($INSERT && INSERT2) { echo "<br>"; echo "Dados corretos enviados com sucesso"; } Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Fevereiro 18, 2010 Eu havia citado sobre a chave de abertura de bloco e sobre $INSERT e INSERT2 serem strings. Mas você nem prestou atenção a isto. Leia os posts inteiros. Também falei que mysql_affected_rows pega apenas o total de linhas afetadas do último comando SQL executado. Inclusive postei que você deveria chamar a função duas vezes, uma para cada INSERT. Teste assim: foreach( $_POST['data'] as $IdArray => $ValueArray ) { if (($_POST['data'][$IdArray] == "" || $_POST['equipamento'][$IdArray] == "" || $_POST['numero_certificado'][$IdArray] =="" || $_FILES['pdf']['name'][$IdArray] == "")) { echo "Nao foi possivel inserir os dados do campo: "; echo $IdArray + 1; echo "<br>"; } else { $INSERT = "INSERT INTO certificado (fornecedor,data,numero_certificado,pdf) values ('$fornecedor[0]','".$_POST['data'][$IdArray]."','".$_POST['numero_certificado'][$IdArray]."','".$_FILES['pdf']['name'][$IdArray]."')"; $INSERT2 = "INSERT INTO equipamento (fornecedor,numero_certificado,equipamento) values ('$fornecedor[0]','".$_POST['numero_certificado'][$IdArray]."','".$_POST['equipamento'][$IdArray]."')"; } echo 'Executando consulta 1: ' . $INSERT; $exec = mysql_query($INSERT) or exit( mysql_error() ); echo 'Consulta 1: ' . echo mysql_affected_rows(); echo 'Executando consulta 1: ' . $INSERT1; $exec2 = mysql_query($INSERT2) or exit( mysql_error() ); echo 'Conusulta 2: ' . mysql_affected_rows(); } if( $exec && $exec2 ) { echo "<br>"; echo "Dados corretos enviados com sucesso"; } E sou chato quanto a indentação também. Há linguagens, como Python, que não têm delimitadores de bloco; os blocos são distinguidos por meio de indentação. Se um dia precisar usar uma linguagem assim, vai sofrer com isso. Execute esse código e poste o resultado Compartilhar este post Link para o post Compartilhar em outros sites