Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Fábio Peixeiro

Às vezes a query não é executada com sucesso

Mensagens Recomendadas

Fábio Peixeiro

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

1ac486878fa548eead24f6fba32665cc.png

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

fa551c48cdbd484f96f0d8bb244aa636.png

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Fábio Peixeiro

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

43780a2470cf436985571dcb8cfa6784.png

Tabela Participantes:

Spoiler

c082bbca6b66460a912d9cc0c2a71da5.png

Tabela Atividades:

Spoiler

114a2d0cfd1d4d3da05493146c78ff5d.png

Tabela Participantes_Aividades:

Spoiler

fe827a8d601147e9a9aa12354adaab88.png

 

Editado por Fábio Peixeiro
Adicionadas as Tabelas

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Fábio Peixeiro

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

b616df0c34d74ffd991b65d4e49bfc47.png

 

Editado por Fábio Peixeiro

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Fábio Peixeiro

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
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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Fábio Peixeiro

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)

708604ccb8ec47a0a09ea8ab7f05feab.png

e agora tenho o mesmo erro outra vez:

1a7fa052be5b4bd8a1d83f6487d980fa.png 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
2 minutes ago, Fábio Peixeiro said:

Fiz as alterações 

708604ccb8ec47a0a09ea8ab7f05feab.png

e agora tenho o mesmo erro outra vez:

1a7fa052be5b4bd8a1d83f6487d980fa.png 

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Fábio Peixeiro

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

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 ...

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Fábio Peixeiro

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
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.