<select> multiple et BDD

Résolu/Fermé
Php my win - 13 févr. 2013 à 15:24
 Php my win - 14 févr. 2013 à 13:01
Bonjour,

J'ai un formulaire qui permet de poster des news, à chaque fois que je poste une new je dois choisir la catégorie dans laquelle je vais le mettre.

Je voudrais pouvoir le placer dans plusieurs catégories, voila donc le code de mon select :

function show_list_cats($name_field = "id_cat", $idselected = "", $cache_cat = false)
//affiche dans une liste deroukante la liste des categories
{
	global $T_categories; //nom de la table utilisee
	// $name_field = 'id_cat[]';
	$list = "<select class='selcat' size='3' class='select' multiple='true' name='" . $name_field . "[]'>\n"; 
	// $list = "<select class=\"selcat\" size=\"3\" class=\"select\" multiple=\"true\" name=\"$name_field\">\n"; 
	$list .= "<option selected value=\"0\">Choisissez une catégorie</option>\n";
	$list .= "\n";

	//selection des categories
	//creation de la requete
	if ($cache_cat)
	//si il faut cacher certaines categories (submit_site.php)
		$sql = "SELECT id FROM $T_categories WHERE activation = 1 AND can_add = 1 ORDER BY cat_name ASC ";
	else
	//on ne doit cacher aucune categorie (admin)		
		$sql = "SELECT id FROM $T_categories ORDER BY cat_name ASC ";
	//envoi de la requete
	$res = send_sql($sql,"trouver les catégories pour créer la liste déroulante");
	
	while ($resultat = mysql_fetch_array($res,MYSQL_ASSOC))
	{
		$path = path2cat($resultat["id"]);
		//ajout de la categorie proprement dite dans les options de la liste
		if ($resultat["id"] != $idselected)
			$list_cats[] = "<option label=\"$path \" value=\"$resultat[id]\">$path</option>";
		else
			$list_cats[] = "<option label=\"$path \" value=\"$resultat[id]\" selected>$path</option>";		
	}
	//tri par ordre alphabetique
	@asort($list_cats); 
	$list .= @implode(",",$list_cats);
	$list .= "</select>\n";
	return $list;
}


J'ai ajouté [] à select pour le transformer en tableau, ensuite je l'enregistre dans la BDD via implode, jusque là pas de problème mes catégories s'enregistre comme ceci dans la $id_cat : 106,108,...

Par contre je n'arrive pas à faire en sorte que les articles apparaissent dans chaque catégorie choisie, voici le code pour vérifier le nombre d'article dans une catégorie :

function get_nbsites($cat)
//retourne le nombre de sites presents dans une categorie ainsi que dans ses sous-categories
{
	global $T_categories,$T_sites; //noms des tables utilisees
	
	//on place la categorie dans un tableau
	$list_all_cats[] = $cat;
	
	while (list($cle,$id_cat) = each ($list_all_cats))
	//tant qu'on a encore des nouvelles categories
	{
		//on va chercher toutes les sous-categories de id_cat 
		$sql_scats = "SELECT id FROM $T_categories WHERE id_cat_mere = '$id_cat' AND activation = 1 ";
		//on envoie la requete
		$res_scats = send_sql($sql_scats,"trouver le nombre de sous-catégories de $id_cat");
		//ajout des categories dans le tableau
		while ($result = mysql_fetch_array($res_scats,MYSQL_ASSOC))
			$list_all_cats[] = $_POST['$result["id"]']; 
	}

	//preparation de la requete pour aller chercher le nombre de site 
	$sql_nb_sites = "SELECT count(id) as count FROM $T_sites WHERE activation = 1 and ("; 
	for ($i=0;$i<$nb_cats-1;$i++)
	//on rajoute toutes les sous-categories
	$sql_nb_sites .= "id_cat = '$list_all_cats[$i]' or ";
	$sql_nb_sites .= "id_cat = '$list_all_cats[$i]') ";
	//envoi de la requete
	$res_nb_sites = send_sql($sql_nb_sites,"trouver le nombre de sites dans la catégorie $id_cat");
	return mysql_result($res_nb_sites,0,"count");
}


Je ne comprend pas ce que je dois changer pour arriver à faire apparaitre l'article dans chacune des catégories, sachant que si il y a deux valeur alors l'article n'apparait pas.

Merci d'avance à ceux qui me viendront en aide.

6 réponses

Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
13 févr. 2013 à 17:05
salut,
Essayes avec SPLIT tu peux scinder ta chaine de categories 128,152,130 en un array et Tester si categorie dans l'array par IN

WHERE $cat IN (SPLIT(",",id_cat_mere))

??
0
Bonjour

J'avais répondu mais la réponse à disparue.

Merci de prendre le temps de te pencher sur mon problème.

Je ne sais pas trop ou placer le code que tu me donnes.

ID_cat_mère n'est pas bon je pense car Mes valeurs sont rangées dans id_cat.

Ma table $_site
Structure : Id | description | titre | id_cat

1 | blabla | titre | 106,107

Voila ce que j'obtiens avec Implode sur id_cat

Par contre au moment de récupérer la new pas moyen elle n'est dans aucune des catégories.
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
Modifié par Alain_42 le 14/02/2013 à 07:52
il faut donc:
"SELECT * FROM ".$_site." WHERE $cat IN (SPLIT(",",id_cat))"  

ou même:
 "SELECT * FROM ".$_site." WHERE $cat IN (id_cat)"
// en fait remplacer le signe = par IN dans ta requette 


$cat étant la catégorie recherchée
id_cat le champ de la BDD qui contient les catégories 106,107
0
Il me renvoie : Parse error: syntax error, unexpected ','
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J'ai réussi à mettre la commande correctement et cela ne change rien, au dessus j'ai un compteur de new, il indique bien le nombre de new que j'ai par contre il refuse de les mettre dans les catégories
0
Il me faudrait un code qui dise de vérifier dans la table si Id_cat à plusieurs valeurs. Je bloque vraiment, je cherche depuis plusieurs jours alors de l'aide serait la bienvenue même si vous n'êtes pas sûr.
0