Exécution requête sur bouton sur une ligne tableau


#1

Bonjour, j’ai un petit soucis de requete mysql je m’explique j’aimerais mettre a jour la colonne “statut” via un checkbox en cliquant sur un bouton mais lorsque je clique sur le bouton rien se passe.
je voudrais savoir si mon code est bon
requette.php

<?php
$servername = "localhost";
$username = "root";
$password = "Mm101010";
$dbname = "smartphone";
 
$conn = mysqli_connect($servername, $username, $password, $dbname) or die("Connection failed: " . mysqli_connect_error());
 
 
 
$data_ids = $_REQUEST['data_ids'];
$data_id_array = explode(",", $data_ids);
if(!empty($data_id_array)) {
    foreach($data_id_array as $Or_Affectation) {
        $sql = "UPDATE abonnements SET Statut = 'Non Affecté' ";
        $sql.=" WHERE Or_Affectation = '".$Or_Affectation."'";
        $query=mysqli_query($conn, $sql) or die("supr_Affect.php: Suprimer Affectation");
    }
}
?>

AJAX

  $(document).ready(function() {
                var dataTable = $('#vu_affect_empl').DataTable( {
                    "processing": true,
                    "serverSide": true,
                    "columnDefs": [ {
                          "targets": 0,
                          "orderable": false,
                          "searchable": false
                            
                        } ],
                    "ajax":{
                        url :"Affectation.php", // json datasource
                        type: "post",  // method  , by default get
                        error: function(){  // error handling
                            $(".vu_affect_empl-error").html("");
                            $("#vu_affect_empl").append('<tbody class="vu_affect_empl-error"><tr><th colspan="3"></th></tr></tbody>');
                            $("#vu_affect_empl_processing").css("display","none");
                             
                        }
                    }
                } );
                 
                 
                $("#action_ligne").on('click',function() { // bulk checked
                    var status = this.checked;
                    $(".updateRow").each( function() {
                        $(this).prop("checked",status);
                    });
                });
                 
                $('#update_affect').on("click", function(event){ // triggering delete one by one
                    if( $('.updateRow:checked').length > 0 ){  // at-least one checkbox checked
                        var ids = [];
                        $('.updateRow').each(function(){
                            if($(this).is(':checked')) {
                                ids.push($(this).val());
                            }
                        });
                        var ids_string = ids.toString();  // array to string conversion
                        $.ajax({
                            type: "POST",
                            url: "supr_Affect.php",
                            data: {data_ids:ids_string},
                            success: function(result) {
                                dataTable.draw(); // redrawing datatable
                            },
                            async:false
                        });
                    }
                });
            } );

bouton

<button class="Menu" id="update_affect">Suprimer Affectation</button>

#2

Bonjour @vinkey,

En parcourant rapidement ton code je m’aperçois de 3 choses.

Tu mélanges 3 langages différents dans un même exemple, et tu utilises même une bibliothèque tierce (jQuery) dans l’un de tes langages (JavaScript).

Il ne va pas être possible pour nous de t’aider rapidement car cela nécessite du temps.

Mon conseil :

  • Modifie ton code et fractionne le en petit segment « entrée - sortie » puis tests les séparément. Vérifie si ce que tu attends en entré est bon, et vérifie si ce que tu attends en sortie est bon.

Une fois que tu trouves une « entrée-sortie » qui ne se comporte pas comme souhaité, redivise ton code et ré-itère le processus jusqu’à trouver la pièce qui manque. Cela sera plus simple ensuite de comprendre où sa coince. Si ce petit fragment te reste un mystère, c’est sur lui que tu demanderas de l’aide.

Comment savoir comment diviser mon code ?

Premièrement, scinder par langage est une bonne chose. Ensuite, scinder par groupe de rôle (démarrage, update, événement), puis scinder par fonction.

Les messages d’erreurs sont également une bonne piste, si tu n’as pas du tout de message d’erreur, créé toi des messages personnel, pas à pas.

Hypothèse

« je clique sur le bouton rien se passe ». Quel fonction t’attends tu as voir fonctionner ?

$('#update_affect').on("click", function(event){ ?

Alors met un console.log() dans la fonction et vérifie tes valeurs.

Par exemple avec

$('#update_affect').on("click", function(event) {
    console.log("cible", event.target);
   ...

Tu peux avoir dans ta console l’élément ciblé (c’est donc le bon), ou rien du tout (ta fonction n’est pas appelée), ou une erreur (à priori event.target retourne pas un truc comme prévu). Etc.

Si la fonction est pas appelé, est ce que $('#update_affect').on est prise en compte ?

$(document).ready(function() {
    var $actionLigne = $("#action_ligne");
    console.log("élément dans le DOM ?", $actionLigne);
   ....

Si finalement ça s’affiche pas, peut-être que ton script est pas appelé ? Ou si sa s’affiche mais sans l’élément, peut-être que ton élément n’est pas dans le DOM quand la fonction est demandée, etc.

Peux être que ton code sera correcte jusqu’à

 $.ajax({

Alors dans ce cas affiche directement result, que contient t-il ? dataTable.draw() renvoi ce que tu souhaites ? etc. etc. etc.

Aide toi toi même comme on dit :)

N’hésite pas à revenir avec un problème plus ciblé.

Bon courage.


#3

Juste une remarque, tu vas au devant de gros problème de performance.
(Cela passera sur le poste du dev, lors du lancement du projet … et plus le temps passera, plus l’appli deviendra lourde … et si tu as sysadm ou un dba … il te crucifiera pour l’exemple ^^ )

Dans un foreach, tu lance un update … tu vas donc provoquer le déclenchement de n-requete …

Il y a surement un moyen pour n’en faire qu’une, le serveur SQL t’en remerciera ^^