Problème avec Checkbox

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème avec Checkbox

Re: Problème avec Checkbox

par Fre3z69 » 26 févr. 2012, 16:42

J'ai supprimer le lien entre les tables pour tester, et le comportement me convenait.

j’affichais bien les messages enfants, malgré que le père soit détruit.

Et vu que les enfant ont dans leur données une valeur sur le lien "response_mp_id", il m'indique bien lors de l’affichage que ce sont des réponses.

Ça me convient plutôt, mais je sais pas si c'est bien correct de faire ça.

Pensez vous que que ça soit correcte de vouloir garder les enfants alors qu'on à plus le père (Oo les pauvres =D> =D> =D> =D> =D> ) à l'instar de la messagerie privée de phpbb si vous regardez de plus près.

Merci de votre réponse.

Et au passage , le " IN " je l'utiliseras dans ma requête c'est ça?, ou c'est pas utile actuellement?

Merci de votre aide

Cordialement

Re: Problème avec Checkbox

par Ryle » 26 févr. 2012, 16:28

Ben en fait le problème vient de là... active la gestion d'erreur (tu auras tout à loisir de la styliser ensuite ;)).

Si un enregistrement A est le père d'un enregistrement B (via la déclaration d'une simple clé étrangère), tu peux supprimer B, mais tu ne peux pas supprimer A tant que le B lui est rattaché (forcément, il serait rattaché à un enregistrement qui n'existe plus, ce qui compromet l'intégrité de tes données).

Pour éviter cela, tu as deux options que tu peux activer sur ta clé étrangère :
- ON DELETE CASCADE : qui te permet de supprimer tous les enregistrement enfants en cascade quand on supprime le père
- ON DELETE SET NULL : qui te permet de supprimer le lien entre le parent et l'enfant (l'enfant se retrouve alors "orphelin" et a la valeur null au lieu de l'id du parent)

Dans ton cas, c'est la première qu'il te faudrait utiliser. Cependant, il aurait les effets suivants : si ton script supprime B avant A, il n'y a rien de particulier. S'il supprime A en premier, alors ta base va automatiquement supprimer B en cascade, et ton script tentera ensuite de supprimer B, alors que celui-ci n'existera déjà plus.


Pour le IN, l'intérêt c'est d'éviter de faire plusieurs requêtes identiques sur une liste de valeur. En gros :
DELETE FROM t_mp WHERE mp_id = "7"
DELETE FROM t_mp WHERE mp_id = "5"
DELETE FROM t_mp WHERE mp_id = "3"
DELETE FROM t_mp WHERE mp_id = "1"
-- équivaut à :
DELETE FROM t_mp WHERE mp_id IN (1, 3, 5, 7)
Et quand tu as un tableau de valeurs, tu peux utiliser implode() pour facilement générer cette requête :)

Re: Problème avec Checkbox

par Fre3z69 » 26 févr. 2012, 16:12

Faut que tu précise le "on delete cascade" dans définition de le clef étrangère. Si non c'est restrict par défaut il semble.

Attention, parce que si tu commence par le père les autre n'ont pas lieux d'être.

Connais tu la clause "in" de SQL ?
Parce que bon la pas besoin de boucle une seule requête peut faire l'affaire ;)

Pour ce qui est de la non suppression tu devrais avoir un message d'erreur du c'est la clef étrangère qui fait chier.

@+
Attention, parce que si tu commence par le père les autre n'ont pas lieux d'être. :
Si, sur phpbb on peux supprimer le père et toujours avoir les autres.

Connais tu la clause "in" de SQL ?:
non, absolument pas, qu'est ce donc?

Pour ce qui est de la non suppression tu devrais avoir un message d'erreur du c'est la clef étrangère qui fait chier. :
Bin non, j'ai pas mit de or die Oo, si j'ai une erreur, ça affiche rien ^^ (oui pas bien je sais, mais je mettrez les erreur plus tard, je vais les stylisés, et généralement je teste mes requêtes avec phpmyadmin avant, donc je sais plus ou moins que c'est fonctionnel.

Merci de votre aide

Cordialement

Re: Problème avec Checkbox

par moogli » 26 févr. 2012, 11:57

Faut que tu précise le "on delete cascade" dans définition de le clef étrangère. Si non c'est restrict par défaut il semble.

Attention, parce que si tu commence par le père les autre n'ont pas l'ieux d'être.

Connais tu la clause "in" de SQL ?
Parce que bon la pas besoin de boucle une seule requête peut faire l'affaire ;)

Pour ce qui est de la non suppression tu devrais avoir un message d'erreur du c'est la clef étrangère qui fait chier.

@+

Re: Problème avec Checkbox

par Fre3z69 » 25 févr. 2012, 23:39

Je peux pas effacer le premier message de la liste (enfin le père)

J'ai liée la table sur elle même, peux être que ça viens de là

J'ai fait le teste en enlevant le lien,e t en mettant un champs nommé comme celui créer par le lien (jointure) et ça fonctionne.

J'ai fait une liaison 1:n de t_mp sur t_mp, afin de marquer les réponses.

C'est correcte à votre avis, où je me suis tromper de liaison?

J'utilise WorkBench pour schématiser mes tables.



Merci

Cordialement

Re: Problème avec Checkbox

par Fre3z69 » 25 févr. 2012, 23:24

J'obtiens bien les bonnes valeurs pourtant

id_message: 7
requette: DELETE FROM t_mp WHERE mp_id = "7"
id_message: 5
requette: DELETE FROM t_mp WHERE mp_id = "5"
id_message: 3
requette: DELETE FROM t_mp WHERE mp_id = "3"
id_message: 1
requette: DELETE FROM t_mp WHERE mp_id = "1"

Je comprend pas, c'est aléatoire dans les résultat, c'est chiant.

Et malgré tout ça me laisse un message non effacer, celui qui as pour ID 1
En fait il supprime pas l'ID 1, ce qui est bizarre

C'est le message père, mais il devrais quand même s’effacer

Merci de votre aide

Cordialement

Re: Problème avec Checkbox

par Fre3z69 » 25 févr. 2012, 13:13

Ca doit être ça alors

J'ai changer la préparation
<?php
	$msg_id=$_POST['msg_id'];
	$query=$cnx->prepare('DELETE FROM t_mp WHERE mp_id = :id');
	foreach($msg_id as $check)
	{
		echo 'id_message: '.$check.'<br />';
	$query->bindValue(':id',$check,PDO::PARAM_INT);
		// $query='DELETE FROM t_mp WHERE mp_id = "'.$check.'"';
		// echo 'requette: '.$query.'<br />';
		$query->execute();
	}
		$query->CloseCursor();
	echo '<script type="text/javascript">
		<!--
		setTimeout(function()
		{
			window.location.href = "'.SITE_ADRESSE.'message";
		},100);
		// -->
	</script>';
?>
Au premier abord ça fonctionne.

Je vais tout de même te montrer le résultat, mais plus tard, je suis occupé avec un colégue, je fini, et m'en occupe.

Pour ce qui est des indices, je l'est ai mis plus par copie (de phpbb Oo je sais c'est pas bien) que de moi même, et à vrai dire, je ne sais même pas le role des indices dans les ckeckboxs.

Merci de votre aide

Cordialement

Re: Problème avec Checkbox

par Ryle » 25 févr. 2012, 12:39

Est-ce que tu peux nous montrer les résultats que tu obtiens avec les print_r et lors de l'affichage de la requête ? as-tu bien autant de requête affichées que d'id envoyés ?

Bien que cela ne changera pas grand chose, tu as une petit différence dans ton code de confirmation :
 echo '<input type="hidden" value="'.$check.'" name="msg_id['.$check.']"/>';
Le nom de ton champ dans le formulaire initial est msg_id[] sans spécifier d'indice entre les crochets...

Ah et puis une petite remarque : dans ton foreach qui exécute la requête de suppression, la définition de ta requête préparée devrait être en dehors de la boucle. L'intérêt est de définir ta requête préparée une seule fois, puis de l'exécuter autant de fois que nécessaire en passant les paramètres qui vont bien à chaque exécution :)

Re: Problème avec Checkbox

par Fre3z69 » 25 févr. 2012, 11:07

on récupère bien les ID, pourtant j'ai l'impression que ça viens dans l’exécution des requêtes.

Je récupère biens les bonnes valeurs, les requêtes sont les bonnes, pourtant ...

J'ai constater en fessant les test en ligne, que ça ne se comportait pas de la même manière.

Et depuis peu, ça ne fait plus cela en local.

Je vois absolument pas ce qui se passe, et pourquoi ça me fait cela.

Merci de votre aide

Cordialement

Re: Problème avec Checkbox

par sirakawa » 25 févr. 2012, 10:33

Suggestions pour les tests:
titres clairs pour les messages ce qui aide à les identifier: message 1, message 2...
utiliser print_r($_POST); die(); ou print_r($-GET);die(); suivant la méthode employée par la <form...>, die() pour ne pas risquer que l'affichage soit recouvert par autre chose.
créer la requête mysql dans une variable et afficher la variable:
$sql = "Delete * from tabl ....";
print "$sql"; die();

Problème avec Checkbox

par Fre3z69 » 25 févr. 2012, 08:01

Salutation

Voici encore un soucis

J'ai dans mon système de messagerie privée et lors de l'affichage des messages, des checkbox qui permettent d’effacer, mettre en lu ou en non lu tout les messages sélectionnés. (Images à l'appuie)
Image

Pour ce qui est de " lu, non lu " il n'y a aucun soucis.

Mais pour ce qui est de effacer, là je me retrouve confronté à un comportement bizarre.

En effet, lors de la sélection des messages, et de l'envoie du formulaire vers l'option effacer, on retrouve bien nos messages sélectionnés.
Mais on les perds lors de la confirmation d’effacement.
(Voici une série d'image pour vous montré le problème)
Je sélectionne les messages que je souhaite effacer, et je met le sélecteur d'option sur Supprimer les messages
Image

J'envoie, et vérifie dans la source qu'on récupère bien les messages sélectionnés, et au passage on demande confirmation pour effacer les messages.
J'ai créer un formulaire à l'instar de phpbb, afin de récupérer les id des messages précédemment sélectionnés.
Image

Je clique sur oui, ça fait son travail, mais là surprise il n'y a qu'un seul message effacé au lieu des 2 souhaités.
Image

En revanche, on supprime bien tout les messages sélectionnés si on les coche tous, et de même si on en sélectionne que un seul (mais aussi bizarre qu'il soit, que celui du haut fonctionne, si je sélectionne celui du bas de la liste, ou au milieu, ça ne fonctionneras pas).

Voici mes scripts, maintenant que vous comprenez (j’espère) mieux mon problème

La page d'affichage des messages (seulement la partie nous intéressant)
<?php
.........
		$query=$cnx->prepare('SELECT 
		mp_read, mp_id, users_id_sender, mp_title, mp_date, users_id_receiver, mp_post, response_mp_id
		FROM t_mp
		LEFT JOIN t_users ON t_mp.users_id_sender = t_users.users_id
		WHERE users_id_receiver = :usersid ORDER BY mp_id DESC');
		$query->bindValue(':usersid',USERS_ID,PDO::PARAM_INT);
		$query->execute();
		if ($query->rowCount()>0)
		{
		//On boucle et on remplit le tableau
	$paire = true;
		while ($data = $query->fetch())
		{

	// if (empty($data['response_mp_id'])) {$mp_title=$data['mp_title'];}
	$mp_title=(isset($data['response_mp_id']))?'Re: '.$data['mp_title']:$data['mp_title'];

	$users_id = $data['users_id_sender'];
	$auteur = auteur($users_id);
	$couleur=($paire)?'listeforum':'listeforump';
		echo'<tr class="'.$couleur.'">';
			//Mp jamais lu, on affiche l'icone en question
			if($data['mp_read'] == 0)
			{
				echo'<td class="infomessagemp">
					<img src="'.SITE_ADRESSE.'images/forum/topic_nonlu.png" alt="Non lu" />
				</td>';
			}
			else //sinon une autre icone
			{
				echo'<td class="infomessagemp">
					<img src="'.SITE_ADRESSE.'images/forum/topic_lu.png" alt="D&eacute;ja lu" />
				</td>';
			}
			echo'<td class="infostitremp"><strong>
				<a href="'.SITE_ADRESSE.'message?action=consulter&mpid='.$data['mp_id'].'">
				'.stripslashes(htmlspecialchars($mp_title)).'</a></strong>
			</td>
			<td class="auteurmessagesmp">
				<a style="color:#'.$auteur['group_color'].';font-weight:bold;" href="'.SITE_ADRESSE.'voirprofil?action=consulter&m='.$auteur['users_id'].'"> '.$auteur['users_name'].'</a>
			</td>
			<td class="datemessagemp">
				'.changedateusfr($data['mp_date']).'
			</td>
			<td class="actionmessagemp">
				<div class="profile-icons">
					<ul class="profile-icons">
						<input type="checkbox" value="'.$data['mp_id'].'" name="msg_id[]"/>
					</ul>
				</div>
				
			</td>
		</tr>';
		$paire = !$paire;
			} //Fin de la boucle
			$query->CloseCursor();
?>
		<tr class="optionforum">
			<td class="optionmessage" colspan="6">
				<select name="select_option">
					<option value="lu">Marquer comme lu</option>
					<option value="non-lu">Marquer comme non lu</option>
					<option value="delet">Supprimer la sélection</option>
				</select>
				<input type="submit" value="Aller" name="submit"/>
				<div><a onclick="marklist('viewfolder', 'msg_id', true); return false;" href="#">Tout cocher</a> • <a onclick="marklist('viewfolder', 'msg_id', false); return false;" href="#">Tout décocher</a></div>
			</td>
		</tr>
<?php
		} //Fin du if
........
?>
La page de confirmation, pour ne pas effacer bêtement les messages.
<?php
.........
		$select_option=$_POST['select_option'];
		$msg_id=$_POST['msg_id'];
.........
			if ($select_option == 'delet') {
				alerte('Êtes-vous sûr de vouloir supprimer ce message ?');
				echo '<form method="post" action="'.SITE_ADRESSE.'message?action=supprimer">';
				foreach($msg_id as $check)
				{
					echo '<input type="hidden" value="'.$check.'" name="msg_id['.$check.']"/>';
				}
						echo '<input type="submit" class="button2" value="Oui" name="confirm"/>  
						<input type="submit" class="button2" value="Non" name="cancel"/>
					</form>';
			}
?>
Et pour finir, la page de suppression des messages.
<?php
if (isset($_POST['cancel']) AND $_POST['cancel']=="Non")
{
	echo '<script type="text/javascript">
		<!--
		setTimeout(function()
		{
			window.location.href = "'.SITE_ADRESSE.'message";
		},100);
		// -->
	</script>';
}
if (isset($_POST['confirm']) AND $_POST['confirm']=="Oui")
{
	$msg_id=$_POST['msg_id'];
	foreach($msg_id as $check)
	{
		$query=$cnx->prepare('DELETE FROM t_mp WHERE mp_id = :id');
		$query->bindValue(':id',$check,PDO::PARAM_INT);
		$query->execute();
		$query->CloseCursor();
	}
	echo '<script type="text/javascript">
		<!--
		setTimeout(function()
		{
			window.location.href = "'.SITE_ADRESSE.'message";
		},100);
		// -->
	</script>';
}
?>
Si vous savez de quoi il s'agit, ou que vous avez une vague idée, SVP, aidez moi.

Merci de votre aide

Cordialement