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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre r�gulier
    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
    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 chevronn� Avatar de IP-Fix
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    421
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 421
    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
    Membre r�gulier
    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
    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 : 54
    Localisation : Suisse

    Informations professionnelles :
    Activit� : D�veloppeur Web

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 1 571
    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.

  5. #5
    Membre r�gulier
    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
    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