Page 1 sur 1

traitement d'une chaine en tableau

Posté : 12 juil. 2012, 23:29
par artotal
Bonjour,
J'ai une variable dans lequele je concatène une seconde variable, le tout dans une requette.
La seconde variable est passée comme un array ?
repasPropose.dietaryOptions=Array
le code, réception de la variable isset($_POST['checkb'] sous la forme "Diabetique, Vegetarian, Vegan, etc... :
	if(isset($_POST['checkb'])) {
		$varCheck=$_POST['checkb'];
		foreach ($varCheck as $value) {
			if ($value=='Diabetique') $Diabetique=	"AND repasPropose.dietaryOptions = 'Diabetique'";
			if ($value=='Vegetarian') $Vegetarian=	"AND repasPropose.dietaryOptions =  'Vegetarian'";
			if ($value=='Vegan') $Vegan=	"AND repasPropose.dietaryOptions = 'Vegan'";
			if ($value=='No sugar') $NoSugar=	"AND repasPropose.dietaryOptions = 'No sugar'";
			if ($value=='100% organic') $Organic=	"AND repasPropose.dietaryOptions = '100% organic'";
			if ($value=='No nuts') $NoNuts=	"AND repasPropose.dietaryOptions = 'No nuts'";
			if ($value=='Low fat') $LowFat=	"AND repasPropose.dietaryOptions = 'Low fat'";
			if ($value=='Gluten free') $GlutenFree=	"AND repasPropose.dietaryOptions = 'Gluten free'";
			if ($value=='No milk') $NoMilk=	"AND repasPropose.dietaryOptions = 'No milk'";
		}
	}
	$sql1='	';
	$Diab=(isset($Diabetique))?$sql1.=$Diabetique:'';
	$Vege=(isset($Vegetarian))?$sql1.=$Vegetarian:'';
	$Vega=(isset($Vegan))?$sql1.=$Vegan:'';
	$NoSu=(isset($NoSugar))?$sql1.=$NoSugar:'';
	$Orga=(isset($Organic))?$sql1.=$Organic:'';
	$NoNu=(isset($NoNuts))?$sql1.=$NoNuts:'';
	$LowF=(isset($LowFat))?$sql1.=$LowFat:'';
	$Glut=(isset($GlutenFree))?$sql1.=$GlutenFree:'';
	$NoMi=(isset($NoMilk))?$sql1.=$NoMilk:'';
	echo $sql1;
Ensuite dans ma requête :
	$sql="SELECT *,repasPropose.id AS idRepas,repasPropose.description AS descriptionRepas
			 		FROM repasPropose 
				JOIN compteUtilisateur ON repasPropose.idCompteUtilisateur=compteUtilisateur.id 
				WHERE compteUtilisateur.ville = '".$villeQuery."'
				AND compteUtilisateur.etatUSA =   '".$stateQuery."'
				".$sql1."
			 	AND repasPropose.productType = ". $idProductQuery;	
J'affiche la requête :

Code : Tout sélectionner

SELECT *,repasPropose.id AS idRepas,repasPropose.description AS descriptionRepas FROM repasPropose JOIN compteUtilisateur ON repasPropose.idCompteUtilisateur=compteUtilisateur.id WHERE compteUtilisateur.ville = 'austin' AND repasPropose.dietaryOptions = 'Array' AND repasPropose.productType = 1
Merci

Re: traitement d'une chaine en tableau

Posté : 12 juil. 2012, 23:36
par artotal
J'avais oublié l'explode.
Par contre si j'explode une chaîne qui est vide ça me retourne une erreur, sans le séparateur.

Re: traitement d'une chaine en tableau

Posté : 12 juil. 2012, 23:40
par artotal
Bien non pas besoin d'explode puisque je récupère déjà un tableau ?

Re: traitement d'une chaine en tableau

Posté : 13 juil. 2012, 09:01
par Mazarini
Je ne vois pas d'ou vient le array car $sqll me semble bien une chaine. Tu peux ajouter des echo $sqll entre la constitution de la chaine et la constitution du sql pour voir quand s'effectue la transformation (mauvaise affection/erreur de frappe ?).


Par contre tu peux simplifier ton code pour constituer $sqll :
<?PHP
$sqll = ' ';
foreach ($varCheck as $value) {
      $sqll .=  " AND repasPropose.dietaryOptions = '$value'";
}
?>
Edit : Attention à utiliser mysql_real_escape_string() pour éviter les injections SQL

Re: traitement d'une chaine en tableau

Posté : 13 juil. 2012, 19:02
par artotal
@ Mazarin
En faite en js j'envoie un tableau, qui se lit simplement comme un implode, d'ou mon châtiment, il a fallu directement faire un foreach et ça fonctionne
[javascript]var valeurs = [];
$checkbox.find('input:checked[name=dietary_types]').each(function() {
valeurs.push($(this).val());
});
$.ajax({
url: 'controleur.php',
type: 'POST',
data: { checkb:valeurs, productQuery:$productQuery, searchCity:$searchCity },
success: function(h) {
if (valeurs=='') {
$('#results').html('no result !');
}else{
$('#results').html(h);
$('#map_loading').hide();
}
},
error: function(XMLHttpRequest,textStatus, errorThrown){
alert(XMLHttpRequest, textStatus,errorThrown);
},[/javascript]

"Par contre tu peux simplifier ton code pour constituer $sqll :"
Oui et non, ma requête, dois commencer par un AND et ensuite par un OR.
Enfin je travaille dessus, parce que ce n'est pas encore ça, mais si tu as une idée pour la concision ou ma requête je suis preneur.
Pour le contexte de la requête, j'ai 9 checkbox, et je récupère à chaque changement la liste des checkbox coché, avec $().change(function()...
		$varCheck=$_POST['checkb'];
		//$varCheck=explode("'",$_POST['checkb']);
	if (!empty($varCheck)) {
		foreach ($varCheck as $key => $value) {
			
			if($value=='Diabetique' AND $key==0) 
				$Diabetique=	"	AND repasPropose.dietaryOptions = 'Diabetique'";
			else if($value=='Diabetique')
				$Diabetique=	"	OR repasPropose.dietaryOptions = 'Diabetique'";
				
			if($value=='Vegetarian' AND $key==0) 
				$Vegetarian=	"	AND repasPropose.dietaryOptions = 'Vegetarian'";
			else if($value=='Vegetarian')
				$Vegetarian=	"	OR repasPropose.dietaryOptions = 'Vegetarian'";
			
			if($value=='Vegan' AND $key==0) 
				$Vegan=	"	AND repasPropose.dietaryOptions = 'Vegan'";
			else if($value=='Vegan')
				$Vegan=	"	OR repasPropose.dietaryOptions = 'Vegan'";
			if($value=='No sugar' AND $key==0) 
				$NoSugar=	"	AND repasPropose.dietaryOptions = 'No sugar'";
			else if($value=='No sugar')
				$NoSugar=	"	OR repasPropose.dietaryOptions = 'No sugar'";
			if($value=='100% organic' AND $key==0) 
				$Organic=	"	AND repasPropose.dietaryOptions = '100% organic'";
			else if($value=='100% organic')
				$Organic=	"	OR repasPropose.dietaryOptions = '100% organic'";
			if($value=='No nuts' AND $key==0) 
				$NoNuts=	"	AND repasPropose.dietaryOptions = 'No nuts'";
			else if($value=='No nuts')
				$NoNuts=	"	OR repasPropose.dietaryOptions = 'No nuts'";
			if($value=='Low fat' AND $key==0) 
				$LowFat=	"	AND repasPropose.dietaryOptions = 'Low fat'";
			else if($value=='Low fat')
				$LowFat=	"	OR repasPropose.dietaryOptions = 'Low fat'";
			if($value=='Gluten free' AND $key==0) 
				$GlutenFree=	"	AND repasPropose.dietaryOptions = 'Gluten free'";
			else if($value=='Gluten free')
				$GlutenFree=	"	OR repasPropose.dietaryOptions = 'Gluten free'";
			if($value=='No milk' AND $key==0) 
				$NoMilk=	"	AND repasPropose.dietaryOptions = 'No milk'";
			else if($value=='No milk')
				$NoMilk=	"	OR repasPropose.dietaryOptions = 'No milk'";
		}
		//echo $key;
	}
	$sql1='	';
	$Diab=(isset($Diabetique))?$sql1.=$Diabetique:'';
	$Vege=(isset($Vegetarian))?$sql1.=$Vegetarian:'';
	$Vega=(isset($Vegan))?$sql1.=$Vegan:'';
	$NoSu=(isset($NoSugar))?$sql1.=$NoSugar:'';
	$Orga=(isset($Organic))?$sql1.=$Organic:'';
	$NoNu=(isset($NoNuts))?$sql1.=$NoNuts:'';
	$LowF=(isset($LowFat))?$sql1.=$LowFat:'';
	$Glut=(isset($GlutenFree))?$sql1.=$GlutenFree:'';
	$NoMi=(isset($NoMilk))?$sql1.=$NoMilk:'';

				$sql="SELECT *,repasPropose.id AS idRepas,repasPropose.description AS descriptionRepas
			 		FROM repasPropose 
				JOIN compteUtilisateur ON repasPropose.idCompteUtilisateur=compteUtilisateur.id 
				WHERE compteUtilisateur.ville = '".$villeQuery."'
			 	AND repasPropose.productType = ". $idProductQuery;	
$sql=$sql.$sql1;
	$result= $connection->select($sql);
	$i=0;
	foreach ($result as $key => $v) 
	{
		$i++;
.....

Re: traitement d'une chaine en tableau

Posté : 13 juil. 2012, 21:57
par artotal
J'ai conciser le code :)
	if (!empty($varCheck) && $varCheck !=='vide') {
		foreach ($varCheck as $key => $value) {
			if($key==0) 
				$sql1.=	"	AND repasPropose.dietaryOptions = '".$value."'";
			else if($key!==0)
				$sql1.=	"	OR repasPropose.dietaryOptions = '".$value."'";
		}
	}
effectivement cela est mieux à la lecture.

Je voudrais ajouter, j'ai développé une classe, il y a cinq ans :
C'est des requêtes préparé, donc ça ne devrait pas poser de difficulté.
http://www.phpclasses.org/browse/file/23687.html
Peux-tu me donner ton avis ?
Merci