Jump to content
Fábio Peixeiro

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

Recommended Posts

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

 

Share this post


Link to post
Share on other 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

 

Edited by Fábio Peixeiro
Adicionadas as Tabelas

Share this post


Link to post
Share on other 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

 

Edited by Fábio Peixeiro

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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]

 

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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 

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 ...

  • Vote 1

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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.