Fábio Peixeiro 0 Denunciar mensagem Publicado 7 de Junho de 2017 Bom dia, executo o seguinte código que corre por trás de um script para atualizar as informações da página sem refresh na mesma. Spoiler <?php $c = $_REQUEST['a']; require("C:/xampp/htdocs/connect.php"); $query = "SELECT cd_p, nome, morada FROM participantes ORDER BY cd_p"; $result = mysqli_query($connect, $query); ?> <!DOCTYPE html> <html> <head> <script src="part_ati/js/script.js"></script> </head> <body> <div class="container"> <div class="table-responsive"> <div id="employee_table"> <input type="hidden" value="<?php echo $c; ?>"> <div id="partTable" style=" overflow: auto"> <table id="tabela" class="table table-striped table-bordered" cellspacing="0" width="100%"> <thead> <tr> <th width="5%">#</th> <th width="50%">Nome</th> <th width="35%">Morada</th> <th width="10%">Estado</th> </tr> </thead> <?php while ($row = mysqli_fetch_array($result)) { $p = $row['cd_p']; $query2 = "SELECT participantes.cd_p, participantes_atividades.cd_ati FROM participantes_atividades, participantes WHERE participantes.cd_p = participantes_atividades.cd_p AND participantes_atividades.cd_ati = $c AND participantes_atividades.cd_p = $p ORDER BY cd_p"; $result2 = mysqli_query($connect, $query2) or die ("Erro"); ?> <tr> <td><?php echo $row["cd_p"]; ?></td> <td><?php echo $row["nome"]; ?></td> <td><?php echo $row["morada"]; ?></td> <td><?php if ($row2 = mysqli_fetch_array($result2)) echo '<a data-id=', $row['cd_p'], ' name="bRemover" class="btn btn-danger btn-xs bRemover-data">Remover</a>'; else echo '<a data-id=', $row['cd_p'], ' name="bAdicionar" class="btn btn-primary btn-xs bAdicionar-data">Adicionar</a>'; ?></td> </tr> <?php } ?> </table> </div> </div> </div> </div> </body> </html> com a execução do script: Spoiler $(document).ready(function() { $(document).on('click', '.bAdicionar-data', function(){ var id = $(this).attr('data-id'); var ati = document.getElementById("ati"); $.ajax({ url:"part_ati/js/ins.php", method:"POST", data:{p:id,a:ati.value}, success: function (data) { $('#partTable').html(data); } }); }); $(document).on('click', '.bRemover-data', function(){ var id = $(this).attr('data-id'); var ati = document.getElementById("ati"); $.ajax({ url:"part_ati/js/del.php", method:"POST", data:{p:id,a:ati.value}, success: function (data) { $('#partTable').html(data); } }); }); }); ele chama este ficheiro: Spoiler <?php //session_start(); $connect = mysqli_connect("localhost", "root", "", "Junta"); $p = $_REQUEST['p']; $cd = $_REQUEST['a']; $sql = "INSERT INTO participantes_atividades (cd_p,cd_ati) VALUES ('$p','$cd')"; if (mysqli_query($connect, $sql) or die ("Erro ligação à base de dados")) { $output = ''; $select_query = "SELECT cd_p, nome, morada FROM participantes ORDER BY cd_p"; $result = mysqli_query($connect, $select_query) or die("ERRO: Inserção na Tabela participantes_atividades"); $output .= ' <table id="tabela" class="table table-striped table-bordered" cellspacing="0" width="100%"> <thead> <tr> <th width="5%">#</th> <th width="50%">Nome</th> <th width="35%">Morada</th> <th width="10%">Estado</th> </tr> </thead> '; while ($row = mysqli_fetch_array($result)) { $p = $row['cd_p']; $query2 = "SELECT participantes.cd_p, participantes_atividades.cd_ati FROM participantes_atividades, participantes WHERE participantes.cd_p = participantes_atividades.cd_p AND participantes_atividades.cd_ati = $cd AND participantes_atividades.cd_p = $p ORDER BY cd_p"; $result2 = mysqli_query($connect, $query2) or die ("ERRO: Ligação à Tabela participantes_atividades"); $output .= ' <tr> <td>' . $row["cd_p"] . '</td> <td>' . $row["nome"] . '</td> <td>' . $row["morada"] . '</td> <td>'; if ($row2 = mysqli_fetch_array($result2)) { $output .= '<a data-id=' . $row['cd_p'] . ' name="bRemover" class="btn btn-danger btn-xs bRemover-data">Remover</a>'; } else { $output .= '<a data-id=' . $row["cd_p"] . ' name="bAdicionar" class="btn btn-primary btn-xs bAdicionar-data">Adicionar</a>'; } $output .= ' </td> </tr> '; } $output .= '</table>'; echo $output; } O resultado é este: Spoiler Ou seja ele atualiza a tabela e os botões cada vez que é efetuada uma query à BD mas às vezes ele da erro e executa o "or die". Spoiler Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1177 Denunciar mensagem Publicado 7 de Junho de 2017 em vez de apresentatres uma mensagem generica de erro, deverias, ao menos, dar info do erro (que podes descubrir atraves da funcao http://php.net/manual/en/mysqli.error.php) isto porque desconfio que nao tens nenhuma funcionalidade de logging 1 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Fábio Peixeiro 0 Denunciar mensagem Publicado 7 de Junho de 2017 (editado) Antes de mais obrigado pela resposta rápida. Desconhecia completamente o "mysqli_error" quando o adicionei "if (mysqli_query($connect, $sql) or die (mysqli_error($connect)))" obtive o seguinte erro: "Duplicate entry '1-2' for key 'PRIMARY'" mesmo adicionando e removendo o mesmo participante varias vezes so acontece às vezes. Alguma sugestão? A minha DB é a seguinte: Spoiler Tabela Participantes: Spoiler Tabela Atividades: Spoiler Tabela Participantes_Aividades: Spoiler Editado 7 de Junho de 2017 por Fábio Peixeiro Adicionadas as Tabelas Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Fábio Peixeiro 0 Denunciar mensagem Publicado 7 de Junho de 2017 (editado) Peço desculpa pelo double-post mas acho que já corrigi o erro, corrijam-me se estiver errado. O meu problema era que a tabela participantes_atividades nao tinha nenhuma chave primária, o que eu fiz foi criar a chave primária cd_p_a (unique, auto increment) e desta maneira na tive mais erros. EDIT: surgiu-me outro erro, quando insiro o participante na DB ele insere em duplicado: Spoiler Editado 7 de Junho de 2017 por Fábio Peixeiro Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1177 Denunciar mensagem Publicado 7 de Junho de 2017 2 minutes ago, Fábio Peixeiro said: Peço desculpa pelo double-post mas acho que já corrigi o erro, corrijam-me se estiver errado. O meu problema era que a tabela participantes_atividades nao tinha nenhuma chave primária, o que eu fiz foi criar a chave primária cd_p_a (unique, auto increment) e desta maneira na tive mais erros. isso nao devera resolver o problema, isto porque deverias criar um index composto pelas duas FK, e isso iria demonstrar que caso ocorre o que referes ocorrer, poderas ficar com registos repetidos no contexto da relacao das duas FK. o que estas a fazer nao e mais do que esconder um problema. o que deverias fazer seria confirmar (a olho mesmo) que o registo foi realmente removido quando carregas no botao para tal, porque parece que deve haver algum problema ai IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Fábio Peixeiro 0 Denunciar mensagem Publicado 7 de Junho de 2017 Como crio o index composto? Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1177 Denunciar mensagem Publicado 7 de Junho de 2017 https://dev.mysql.com/doc/refman/5.7/en/create-table.html Quote create_definition: ... | {INDEX|KEY} [index_name] [index_type] (index_col_name,...) [index_option] ... ou entao podes sempre usar o ALTER TABLE https://dev.mysql.com/doc/refman/5.7/en/alter-table.html Quote alter_specification: ... | ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) [index_option] ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Fábio Peixeiro 0 Denunciar mensagem Publicado 7 de Junho de 2017 Desculpa a minha ignorância mas nao trabalho com mysql já à algum tempo e por isso não estou a conseguir alterar a tabela participantes_atividades para um index composto. Não estou a entender os comandos que são preciso executar aqui. 23 minutos atrás, HappyHippyHippo disse: ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) [index_option] Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1177 Denunciar mensagem Publicado 7 de Junho de 2017 ALTER TABLE nome_da_tabela ADD UNIQUE nome_do_registo_de_indice (nome_da_coluna_1, nome_da_coluna_2) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Fábio Peixeiro 0 Denunciar mensagem Publicado 7 de Junho de 2017 Fiz as alterações 7 minutos atrás, HappyHippyHippo disse: ALTER TABLE nome_da_tabela ADD UNIQUE nome_do_registo_de_indice (nome_da_coluna_1, nome_da_coluna_2) e agora tenho o mesmo erro outra vez: Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1177 Denunciar mensagem Publicado 7 de Junho de 2017 2 minutes ago, Fábio Peixeiro said: Fiz as alterações e agora tenho o mesmo erro outra vez: como disse, estavas a "mascarar" um erro que ainda presiste na tua solucao. agora, o erro pode estar naquilo que nao foi apresentado : remocao IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Fábio Peixeiro 0 Denunciar mensagem Publicado 7 de Junho de 2017 Aqui está o ficheiro que apaga o registo: Spoiler <?php error_reporting(E_ALL); $connect = mysqli_connect("localhost", "root", "", "Junta"); $p = $_REQUEST['p']; $cd = $_REQUEST['a']; $sql = "DELETE FROM participantes_atividades WHERE cd_ati = $cd AND cd_p = $p"; if (mysqli_query($connect, $sql) or die (mysqli_error($connect))) { $output = ''; $select_query = "SELECT cd_p, nome, morada FROM participantes ORDER BY cd_p"; $result = mysqli_query($connect, $select_query); $output .= ' <table id="tabela" class="table table-striped table-bordered" cellspacing="0" width="100%"> <thead> <tr> <th width="5%">#</th> <th width="50%">Nome</th> <th width="35%">Morada</th> <th width="10%">Estado</th> </tr> </thead> '; while ($row = mysqli_fetch_array($result)) { $p = $row['cd_p']; $query2 = "SELECT participantes.cd_p, participantes_atividades.cd_ati FROM participantes_atividades, participantes WHERE participantes.cd_p = participantes_atividades.cd_p AND participantes_atividades.cd_ati = $cd AND participantes_atividades.cd_p = $p ORDER BY cd_p"; $result2 = mysqli_query($connect, $query2) or die ("Erro"); $output .= ' <tr> <td>' . $row["cd_p"] . '</td> <td>' . $row["nome"] . '</td> <td>' . $row["morada"] . '</td> <td>'; if ($row2 = mysqli_fetch_array($result2)) { $output .= '<a data-id=' . $row['cd_p'] . ' name="bRemover" class="btn btn-danger btn-xs bRemover-data">Remover</a>'; } else { $output .= '<a data-id=' . $row["cd_p"] . ' name="bAdicionar" class="btn btn-primary btn-xs bAdicionar-data">Adicionar</a>'; } $output .= ' </td> </tr> '; } $output .= '</table>'; echo $output; } É exatemente igual ao de inserir com a alteração na query. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1177 Denunciar mensagem Publicado 7 de Junho de 2017 vais fazer dois testes - vais brincar a carregar no botao, mas teras de contar devagar ate 5 de cada vez que carregas no botao (nao devera existir problemas) - da segunda vez, vais abandalhar, como deves estar a fazer, e carregar o mais rapido que podes (o que devera estoirar isso em 3 tempos) se foi isso que aconteceu, diz ... 1 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Fábio Peixeiro 0 Denunciar mensagem Publicado 7 de Junho de 2017 No primeiro teste tinha os 3 registos já inseridos, conseguir remover os 3 com sucesso, logo à primeira vez que fui adicionar deu o mesmo erro, voltei a repetir o teste e dos 5s e aconteceu o mesmo erro à 3ª vez, no 2º teste deu erro passado algumas tentativas. Posso te mandar o meu skype por mensagem privada para poder-mos falar se possivel? Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Fábio Peixeiro 0 Denunciar mensagem Publicado 7 de Junho de 2017 Problema resolvido, Obrigado ao @HappyHippyHippo pelo suporte no Teamviewer Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1177 Denunciar mensagem Publicado 7 de Junho de 2017 problema resolvido razao > duplo registo do evento click sobre o elemento, e consequente dupla chamada do ajax para remover e adicionar o registo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites