in_array et base de donnée

Eléphanteau du PHP | 11 Messages

14 avr. 2008, 17:49

Bonjour,

J'ai une liste de news qui peuvent apartenir à une ou plusieurs catégories séparées par des tirets du style:

News 1 = 1-12-24-32
News 2 = 4-12-32
News 3 = 4-8
News 4 = 8
News 5 = 1-8

et une liste de catégories:

1,4,8,9,11,12,24,32,44,50,55,56,78

est-il possible de faire afficher la liste des catégories utilisées? sachant que chaque catégorie devra être affichée une seule fois?

est-il possible de faire cela avec in_array directement du styel where in_array?

Je ne sais vraiment pas par ou commencer.. .
j'essaye de progresser mais la je cale (deja! :cry: )

Bonne fin de journée,

Eopla

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

14 avr. 2008, 17:53

Salut,

Je dirais qu'il y a un défaut de conception mais soit...

tu peux essayer de travailler avec des tableaux :
1. explode() sur la liste catégories "des news"
2. explode() sur la liste des catégories
3. array_diff() quelque part :)
4. reste ce qu'il faut afficher :-k

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 686 Messages

14 avr. 2008, 17:53

Pourquoi ne pas classer tes news dans une base de donnée ?

Eléphanteau du PHP | 11 Messages

14 avr. 2008, 23:12

Bonsoir,

J'ai effectivement créé une base de donnée en version simplifiée ci-dessous.

Code : Tout sélectionner

# table `news` DROP TABLE IF EXISTS `news`; CREATE TABLE `news` ( `id` int(7) NOT NULL auto_increment, `actif` int(20) NOT NULL default '0', `news_cat_id` varchar(200) NOT NULL default '0', `titre_fr` text NOT NULL, KEY `id` (`id`) ) TYPE=MyISAM; INSERT INTO `news` VALUES (1,1,'1-12-24-32', 'ma neWs 1'); INSERT INTO `news` VALUES (2,1,'4-12-32', 'ma neWs 2'); INSERT INTO `news` VALUES (3,1,'4-8', 'ma neWs 3'); INSERT INTO `news` VALUES (4,1,'8', 'ma neWs 4'); INSERT INTO `news` VALUES (5,0,'1-8', 'ma neWs 5'); #table `news_cat` DROP TABLE IF EXISTS `news_cat`; CREATE TABLE `news_cat` ( `id` int(7) NOT NULL auto_increment, `actif` int(20) NOT NULL default '0', `titre_fr` text NOT NULL, KEY `id` (`id`) ) TYPE=MyISAM; INSERT INTO `news_cat` VALUES (1,1,'ma cat neW 1'); INSERT INTO `news_cat` VALUES (4,1,'ma cat neWs 2'); INSERT INTO `news_cat` VALUES (8,1,'ma cat neWs 3'); INSERT INTO `news_cat` VALUES (9,1,'ma cat neWs 4'); INSERT INTO `news_cat` VALUES (11,1,'ma cat neWs 5'); INSERT INTO `news_cat` VALUES (12,1,'ma cat neWs 6'); INSERT INTO `news_cat` VALUES (24,1,'ma cat neWs 7'); INSERT INTO `news_cat` VALUES (32,0,'ma cat neWs 8'); INSERT INTO `news_cat` VALUES (44,1,'ma cat neWs 9'); INSERT INTO `news_cat` VALUES (50,0,'ma cat neWs 10'); INSERT INTO `news_cat` VALUES (55,1,'ma cat neWs 11'); INSERT INTO `news_cat` VALUES (56,0,'ma cat neWs 12');
désolé si je suis un peu long

Voici ou j'en suis:

Code : Tout sélectionner

$sql = "SELECT * FROM news where actif=1"; $sql_result = mysql_query($sql,$link); while ($row = mysql_fetch_array($sql_result)) { $news_cat_id = $row["news_cat_id"]; $tab_cat_id = explode('-', $news_cat_id); ////// affichage des catégories $sql = "SELECT * FROM news_cat where actif=1 order by titre_fr"; $sql_result = mysql_query($sql,$link); while ($row = mysql_fetch_array($sql_result)) { $u_id = $row["id"]; $titre = $row["titre_fr"]; // c'est ici que je cale mais je ne suis pas sur de ma façon de procéder } }
Bonne soirée,

Eopla

epla
Invité n'ayant pas de compte PHPfrance

15 avr. 2008, 17:24

Bonjour,

J'ai avancé sur ce sujet... un peu seul je l'avoue :(

Voila ou j'en suis pour l'instant... le problème est que si il y a 0 ou 1 catégorie active... si 2 ou plus aucun soucis cela fonctionne... je galère... quelqu'un a t'il une idée ou une autre manière de procéder?


$sql_result = mysql_query("SELECT news_cat_id FROM news where actif=1"); 
if (!$sql_result) { //ceci est juste pour montrer une erreur s'il y en a une.
    $message  = 'Invalid query: ' . mysql_error() . "\n";
    $message .= 'Whole query: ' . $sql;
    die($message);
}
$cat_ids = array();
while ($row = mysql_fetch_array($sql_result)) { 
    $news_cat_id = $row["news_cat_id"]; 
    $tab_cat_id = explode('-', $news_cat_id); 
    foreach($tab_cat_id as $id){
        if(!in_array($id,$cat_ids)) $cat_ids[]=$id;
    }
}
//////  affichage des catégories 
if(count($cat_ids)>1) $where = "id='".implode("' OR id='",$cat_ids)."'";
//else $where="1=1"; //au cas où il aura moins de 2 catégories; tu peux enlever la condition si tu es sûr qu'il y aura toujours au minimum 2

$sql_result = mysql_query("SELECT * FROM news_cat WHERE $where and actif=1 ORDER BY titre_fr"); 
echo "$where";
if (!$sql_result) {
    $message  = 'Invalid query: ' . mysql_error() . "\n";
    $message .= 'Whole query: ' . $sql;
    die($message);
}
while ($row = mysql_fetch_array($sql_result)) { 
    $u_id = $row["id"]; 
    $titre = $row["titre_fr"]; 
    echo "id: $u_id --> titre: $titre<br>";
} 
Bonne aprés-midi

Eopla