Blocage $_POST / Script

Bigpotxxx
Invité n'ayant pas de compte PHPfrance

24 avr. 2012, 18:46

Bonjour,

J'ai un script qui permet de passer une image d'un état publique à privé.
On sélectionner les images et on valide ainsi une requête SQL est faite car privée/publique est géré par la BDD.
			if ($_POST['choix'] == 2)
			{
			  $recuperation = $_POST['iarray'];
			  $verification = count($_POST['iarray']);
			  
			  $warn_verif = mysql_query("SELECT * FROM uploaded_images WHERE userid = '" . mysql_real_escape_string($_SESSION['dmx_userid']) . "' AND private = '0'");			

					if ( mysql_num_rows($warn_verif) < 1 )
					{
						echo '<div class="error-box">Opération impossible : Vous ne possédez aucune image ayant l\'état « publique ».</div>';
						$err = 1;
					}			  
	
					if ($verification < 1 )
					{
						echo '<div class="error-box">Opération impossible : Vous devez sélectionner au moins une image pour continuer !</div>';
						$err = 1;
					}
					
						$recherche = mysql_query("SELECT * FROM uploaded_images WHERE file = '" . $recuperation . "'");
						$resultat = mysql_fetch_array($recherche);					
					
					if ($resultat['private'] > 0 || $resultat['private'] < 0)
					{
						echo '<div class="error-box">Opération impossible : Les images sélectionnées sont déjà privées !</div>';
						$err = 1;
					}
					
					if ($err != 1)
					{
					  for ($i = 0; $i < mysql_num_rows($recherche); $i++)
					  {
						mysql_query("UPDATE uploaded_images SET private = 1 WHERE id = '". mysql_real_escape_string($resultat['id']) ."'");						

						if ($verification < 2 && $verification > 0)
						{
							echo '<div class="success-box">L\'image a bien été converti en état privé !</div>';
						}						
					
						elseif ($verification > 1)			
						{
							echo '<div class="success-box">Les images sélectionnées ont bien été convertis en état privé !</div>';
						}
						
						else
						{
							echo '<div class="error-box">Une erreur inconnue s\'est produite empêchant notre système de dire si l\'opération s\'est bien déroulée.</div>';
						}	
					  }						
					}	
			}
Vous le voyez, on vérifie que l'utilisateur a au moins sélectionné une image, qu'il dispose d'au moins une image publique, puis vu que les checkbox permettant de sélectionner les images ont pour valeur le nom de l'image (soit la colonne "file" dans la BDD) on les appelles avec une boucle for pour les mettre à jour de 0 à 1. Sauf que quand on valide, rien ne s'affiche.. Voyez-vous un beug là ?

Merci infiniment à cette communauté réputé. =D>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 avr. 2012, 07:04

Salut,

Sans le formulaire et sans le code de validation complet je ne peu qu'être évasif.
- sais tu ce que fait le script (dans quel if il passe ou pas, avec qu'elles valeurs etc. )?
- as tu essayer de debuger la chose ? Ça ce fait généralement à grand coup de var_dump() ou de print_r que tu place judicieusement (par exemple un var_dump($_POST); au début du script pour voir ce que renvoie le formulaire) tu peux aussi ajouter des echo pour indiquer le passage dans if ou un else.
- si tu a un environnement de debugage complet alors la c'est le top mais je ne pense sinon tu poserais pas la question ;)
- pour la requête update utilisé plutôt la clause in de mysql au lieu de faire des requêtes en boucle (plus performant ^^) c'est relativement simple : update tabletruc set machin='bidulle' where id in(1,3,877,7906); tu peux mettre autant d'élément que tu veux dans le in, donc couplé à la fonction php implode tu fait ça très simplement.
-pense à utilise mysql_real_escape_string pour sécuriser un peu tous ça.


@+
Il en faut peu pour être heureux ......

Bigpotxxx
Invité n'ayant pas de compte PHPfrance

25 avr. 2012, 10:44

Merci de m'avoir répondu.

1/ En ce qui concerne mysql_real_escape_string, j'en ai déjà mis un peu partout.

2/ Pas vraiment besoin du reste du code car il est pas inutile dans ce cas. Comme j'ai dit, on sélectionne au préalable les images avec une checkbox portant leur nom de fichier et ensuite il faut justement (si les conditions sont remplies), les changer d'état (privé => publique ou publique => privé).
			  $recuperation = $_POST['iarray'];
			  $verification = count($_POST['iarray']);
                          // Pour débug !
			  var_dump($_POST); echo 'Echo1';
Là il récupère le nom des images sélectionnées, et compte combien on été sélectionnées !
 $warn_verif = mysql_query("SELECT * FROM uploaded_images WHERE userid = '" . mysql_real_escape_string($_SESSION['dmx_userid']) . "' AND private = '0'");			

					if ( mysql_num_rows($warn_verif) < 1 )
					{
						echo '<div class="error-box">Opération impossible : Vous ne possédez aucune image ayant l\'état « publique ».</div>';
						$err = 1;
					}			  
	
					if ($verification < 1 )
					{
						echo '<div class="error-box">Opération impossible : Vous devez sélectionner au moins une image pour continuer !</div>';
						$err = 1;
					}
Là on va chercher dans la BDD toutes les images correspondant à l'utilisateur connecté, voir si il a des images déjà, puis on vérifie s'il en a sélectionné au moins une. Puis tout le reste du code, on traite la demande. J'ai placé des var_dump($_POST) partout, et quand je lance le processus j'atterit sur la fameuse page blanche dépourvue de message et cela m'indique ceci :
array(3) { ["iarray"]=> array(1) { [0]=> string(9) "rRJ2H.png"(le nom de l'image est bien enregistré donc) } ["choix"]=> string(1) "2" ["submit"]=> string(5) "Aller" } Echo1
Néanmoins, parmi tous les echo que j'ai placé c'est celui du début qui s'affiche.

Ouin :(

Bigpotxxx
Invité n'ayant pas de compte PHPfrance

25 avr. 2012, 11:24

Je ne peut pas éditer (pas inscris !) donc j’espère que j'enfreins pas la règle des 24H (oui je les aient lu les règles :mrgreen: ).

J'ai rajouté un mysql_real_escape_string à mes requêtes (aux endroit ou il y avait pas) et maintenant cela me dit ceci en plus :
Warning: mysql_real_escape_string() expects parameter 1 to be string, array given in /monchemin on line 207
Donc cette partie du code :
					$recherche = mysql_query("SELECT * FROM uploaded_images WHERE file = '" . mysql_real_escape_string($recuperation) . "'");
Renvoi NULL, pourtant au début je fais bien : $recuperation = $_POST['iarray']; qui contient le nom des fichiers sélectionnés..

Bigpotxxx
Invité n'ayant pas de compte PHPfrance

28 avr. 2012, 15:48

Up ! :D

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 avr. 2012, 23:58

Up ! :D
mal vu ^^

le message indique que tu passe un tableau (ce qui semble vrai :) ) comme paramètre à la fonction mysql_real_escape_string, hors il faut passer une chaine de caractère.

utilise donc array_walk pour faire une fonction qui va traiter tout le tableau.

De la même manière tu ne peux pas utiliser un tableau ainsi (imagine si tu arrive chez un concessionnaire avec une caisse en 400 morceaux et que tu lui demande la marque le modèle et la finition en 30s ou moins :mrgreen: ).
Pour construire la requete il va falloir utiliser le in de mysql et la fonction implode

exemple de requête avec in : select truc from machin where bidulle in (1,2,3,4,5,6);


@+
Il en faut peu pour être heureux ......

Bigpotxxx
Invité n'ayant pas de compte PHPfrance

30 avr. 2012, 23:09

Bonsoir,

Je vais donc travailler à cela et vous tenir au courant ! :)