IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[AJAX] Suppression données mysql avec checkbox et passant par ajax


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut [AJAX] Suppression données mysql avec checkbox et passant par ajax
    Bonsoir à tous,

    débutant dans le monde d'Ajax,
    je souhaiterai supprimer une série de mail dans une base de donnée dont on aurait chécké la checkbox au préalable.

    Actuellement j'ai un une liste de mail qui sont affichés, grâce à une connexion à la base de donnée de mysql par Php.
    Devant chaque mail, j'ai ajouté une checkbox afin de pouvoir supprimer une série de mail et pas un à la fois.

    Voici le code php pour afficher la checkbox:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // CHECKBOX
    echo "<td class=\"empty_td\"><input type=\"checkbox\" name=\"erase[ ]\" value=\"".$row->mailing_id."\"></td>";
    $row->mailing_id correspondant bien sûr à l'id de l'élément dans la base de donnée.

    Une fois les checkbox sélectionnée, je clique sur un bouton qui lance le script javascript (js_fct_confirm_checkbox_delete):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a href=\"javascript:js_fct_confirm_checkbox_delete('site_mailing', 'mailing_id','form_checkbox','erase','".$mailing_checkbox_confirm_delete."', 'viewmailing_3_3_0.html')\">";
    site_mailing -> table: nom de la table mysql
    mailing_id -> champ: champ de la table mysql
    form_checkbox -> Nom du formulaire
    erase -> nom du tableau contenant les id
    mailing_checkbox_confirm_delete -> message: message à afficher pour confirmation de la suppression
    viewmailing_3_3_0.html ->page: page à recharger ensuite

    Jusque là tout fonctionne.
    Une fois dans le fichier javascript, je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    /* FUNCTION de chargement de XHR */
    function getXhr()
    {
    	var xhr = null; 
    	if(window.XMLHttpRequest) // Firefox et autres
    	{
    		xhr = new XMLHttpRequest(); 
    	} else if(window.ActiveXObject){ // Internet Explorer 
    		try 
    		{
    			xhr = new ActiveXObject("Msxml2.XMLHTTP");
    		} catch (e) {
    			xhr = new ActiveXObject("Microsoft.XMLHTTP");
    		}
    	} else { // XMLHttpRequest non supporté par le navigateur 
    		alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
    		xhr = false; 
    	} 
    	return xhr;
    }
     
    // SUPPRIME une liste d'utilisateur en fonction du checkbox
    function js_fct_confirm_checkbox_delete(table, champ, form, name, message, page) 
    {
     
    	// VERIFIE si au moins un checkbox est TRUE
    	// RECUPERATION des checkbox TRUE
    	var NbrCheckbox = document.forms[form].elements.length;
    	var CheckboxCheckedArray = new Array(); // Contient le numéro des checkboxs qui sont checkée parce que sinon on prend dans l'ordre d'affichage 
    	var SendAfter;
     
    	for ( var i=0; i<NbrCheckbox; i++) // Boucle qui lit chaque checkbox de ma page
    	{
    		// CHEMIN pour atteindre les checkbox dans le formulaire 'form' comptant un nombre 'cpt' de checkbox
    		element = document.forms[form].elements[i];
     
    		// CONDITION pour voir si checké ou pas 
    		if (element.checked == true)
    		{
    			// SI oui ajoute la valeur du checkbox au tableau
    			CheckboxCheckedArray.push(i); // Ajoute la "coordonnée" de la Checkbox checkée
    		}
    	}
     
    	// TEST si au moins une checkbox est cochée ET demande confirmation de la suppression
    	if ( (CheckboxCheckedArray.length!=0) && (confirm(message)) )
    	{
     
    		 var data     = null;
    		 var filename = "act/act_checkbox_delete.php";	// FICHIER CIBLE
    		var xhr = getXhr();
     
     
    		// TEST
    		for (j=0; j<CheckboxCheckedArray.length; j++)
    		{
     
    			// Ici on va voir comment faire du post
    			xhr.open("POST",filename,true);
     
    			// ne pas oublier ça pour le post
    			xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
     
    			// CHEMIN pour atteindre les checkbox dans le formulaire 'form' comptant un nombre 'cpt' de checkbox
    			element = document.forms[form].elements[CheckboxCheckedArray[j]];
     
    			// CONCATENATION des données dans la variable data
    			data = "table="+table+"&champ="+champ+"&id="+element.value;
     
    			// ENVOI
    			xhr.send(data);
    		}
     
    		// RECharge la page
    		location.replace(page);
     
    	}
     
    }
    Et c'est logiquement ci-dessus que j'ai un problème, puisque, il arrive à me supprimer seulement le 1er checkbox sélectionné mais pas les suivants.
    C'est sans doute mon système de boucle qui n'est pas très au point...

    Ou peut-être dans le code php mais il me semble qu'il est correcte...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // CONNEXION à la base de donnée
    	$sql = "DELETE FROM 
    				".utf8_decode($_POST['table'])."
    			WHERE 
    				".utf8_decode($_POST['champ'])." = '".utf8_decode($_POST['id'])."';";
     
    	$result = mysql_query($sql) or die("ERREUR: La requête n'est pas valide: ".mysql_error());
    Si quelqu'un pouvait me sortir de ce mauvais pas, cela me ferait très plaisir.
    Merci beaucoup.

  2. #2
    Membre confirmé Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    Points : 494
    Points
    494
    Par défaut
    a mon avis c'est ton Code SQL qui est bizarre! :p

    Il manque un OR :

    WHERE id = 2 OR id = 3 OR id = ... etc

    Bonne chance !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    C'est vrai que ce n'est pas très logique...
    mais ne m'y connaissant pas trop en ajax, je me disais qu'il faisait une requête sql à chaque élément du erase et donc de la boucle for ()...

    Maintenant je me disais qu'en envoyant toutes les données d'un coup au lieu de faire une boucle for() et d'ensuite les re-décomposer avec php et faire seulement la requête sql pour chaque élément serait plus efficace. Mais n'y-a-t'il rien de plus "propre" du côté d'ajax?

    Merci pour ton avis je vais de toute façon tester

  4. #4
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Salut,

    Tout d'abord une première remarque:

    Ta boucle utilise une seule et unique instance de XmlHttpRequest pour envoyer
    des requêtes successives. Tu ne devrais pas utiliser la même instance ou alors
    attendre au moins la fin des requêtes avant d'en lancer une autre.

    Installe FireBug sur ton FireFox et observe dans l'onglet "Net" les requêtes
    réellement émises.

    Maintenant il est clair qu'une seule requête peut très bien faire l'affaire.

    Tu pourrai modifier ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (element.checked == true) CheckboxCheckedArray.push(element.value);
     
    ...
     
    data = "liste="+CheckboxCheckedArray.join(',');
    xhr.send(data);
    Ainsi tu ne passe qu'un paramètre contenants tous les id à effacer, de la forme:
    liste=12,34,54 par exemple.

    Coté php tu fais une chaine sql avec un IN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $liste = $_GET['liste']; // protéger ici d'éventuelles injections sql 
    $sql = "DELETE FROM mailing WHERE mailing_id IN ($liste)";
    Ton code PHP de suppression est très générique, il permet de supprimer
    n'importe quel champ dans n'importe quelle table.

    Je doute que tu utilises pleinement cette généricité dans ton application.
    C'est un grand risque au niveau sécurité. Un hacker pourrait décider de
    supprimer beaucoup de chose avec une telle page php.

    C'est plus prudent de faire de petites page php avec des rôles très précis:

    delete-mails.php qui attends un seul paramètre, la liste des id à supprimer.
    Si ton code fait plus d'une ligne, c'est que tu as mal choisi ton langage !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup pour ta précision!

    Je vais essayer cela rapidement.

    Pour ce qui est de la protection de mon fichier php.
    Tu as tout à fait raison. Et je vais donc remédier à cela!

    Merci

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/02/2010, 02h02
  2. Réponses: 11
    Dernier message: 22/11/2006, 07h31
  3. Réponses: 3
    Dernier message: 19/09/2006, 15h36
  4. Peut on lier une base de donnée Mysql avec MS Project
    Par casper24 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 06/04/2006, 22h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo