Problème d'affichage php

Fermé
milo1986 Messages postés 126 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 30 août 2011 - Modifié par milo1986 le 29/08/2011 à 11:11
gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 - 30 août 2011 à 10:51
Bonjour,

Voilà, je suis en train de développer un site avec une partie blog. Pour la page blog lorsque le visiteur clique dessus il doit voir les derniers articles toutes catégories confondues. Après il peut choisir la catégorie qu'il souhaite dans un menu. Si je n'ai qu'un seul article enregistré dans ma base de données cela fonctionne correctement mais si je décide d'en rajouter un, il n'affiche plus que le dernier et n'affiche plus les catégories... je n'arrive pas à voir d'où cela provient.

je vous poste ici la partie de code pour l'affichage du ou des derniers articles, si quelqu'un peut m'éclairer car à force de chercher je ne vois plus trop....


<div id="content">
<?php
if (isset($_GET['cat']))
{
$cat=$_GET['cat'];
$sql_post="SELECT * FROM ARTICLE, AUTEUR WHERE ARTICLE.NUMAUT=AUTEUR.NUMAUT AND NUMCAT='$cat' AND PUBART='1' ORDER BY NUMART DESC";
}
else
{
$sql_post="SELECT * FROM ARTICLE, AUTEUR WHERE ARTICLE.NUMAUT=AUTEUR.NUMAUT AND PUBART='1' ORDER BY NUMART DESC";
}
$req_post = mysql_query($sql_post) or die ('Erreur SAL ! <br>'.$sql_post.'<br>'.mysql_error ());

while ($data_post = mysql_fetch_assoc($req_post))
{

//fonction limitation de mots
function debutchaine($chaine, $nbmots) { // 1er argument : chaîne - 2e argument : nombre de mots
$chaine = preg_replace('!<br.*>!iU', "", $chaine); // remplacement des BR par des espaces
$chaine = strip_tags($chaine);
$chaine = preg_replace('/\s\s+/', ' ', $chaine); // retrait des espaces inutiles
$tab = explode(" ",$chaine);
if (count($tab) <= $nbmots) {
$affiche = $chaine;
} else {
$affiche = "$tab[0]";
for ($i=1; $i<$nbmots; $i++) {
$affiche .= " $tab[$i]";
}
}
$affiche .= '...';
return $affiche;
}

$mots_complets = $data_post['CONTART']; //data événement
$nb_mots = 50;
$mot_courts = debutchaine($mots_complets, $nb_mots);


?>
<div class="post-entry">
<h2 class="blog-title"><span><?php echo '<a href="single.php?post='.$data_post['NUMART'].'">'.$data_post['TITART']; ?></a></span></h2>
<div class="entry-meta">
<span class="author"><?php echo $data_post['NOMAUT']; ?></span>
<span class="date"><?php echo $data_post['DATART']; ?></span>
</div>
<p>
<?php
echo $mot_courts;
?>
</p>
<p><?php echo '<a href="single.php?post='.$data_post['NUMART'].'" class="link-button">Lire la suite ?</a>'; ?></p>
</div>
<?php } ?>


</div>


A voir également:

4 réponses

Bonjour

Tu as mis la définition de function debutchaine à l'intérieur d'une boucle while.
S'il y a plus d'un article, tu parcours ta boucle plus d'une fois et tu re-définis donc ta fonction. Or il est interdit de redéfinir une fonction déjà définie en PHP.
Sors donc la définition de la fonction de la boucle. En général, on ne met pas de définition de fonction au milieu du code (boucle ou pas, d'ailleurs)
2
milo1986 Messages postés 126 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 30 août 2011 22
30 août 2011 à 10:20
Merci effectivement lorsque j'enlève la définition de la boucle ça fonctionne beaucoup mieux.
0
gaerebut Messages postés 1017 Date d'inscription mardi 30 octobre 2007 Statut Membre Dernière intervention 22 novembre 2013 171
30 août 2011 à 10:51
Bonjour,

Ton code pique les yeux !
Essais de modifier un peu comme ceci:

- Indente ton code
- Remplace le isset par !empty => le !empty vérifie si la variable n'est pas vide mais aussi si elle existe
- Protège tes variables. Notamment la variable $cat. Ici, une attaque de type 'injection sql' peut être réalisée.
- Sert de ta première condition pour éviter le code redondant:

Exemple: Remplace ça:
if(isset($_GET['cat'])){ 
	$cat=$_GET['cat']; 
	$sql_post="SELECT * FROM ARTICLE, AUTEUR WHERE ARTICLE.NUMAUT=AUTEUR.NUMAUT AND NUMCAT='$cat' AND PUBART='1' ORDER BY NUMART DESC"; 
} 
else{
	$sql_post="SELECT * FROM ARTICLE, AUTEUR WHERE ARTICLE.NUMAUT=AUTEUR.NUMAUT AND PUBART='1' ORDER BY NUMART DESC"; 
}


Par ça:
$sql_post = 'SELECT * FROM ARTICLE, AUTEUR WHERE ARTICLE.NUMAUT=AUTEUR.NUMAUT AND PUBART="1"'.((!empty($_GET['cat']))?' AND NUMCAT="'.$_GET['cat'].'"':null).'ORDER BY NUMART DESC';


- Evite les SELECT * (Conseillé de mettre le nom des colonnes même s'il y en à beaucoup)
- N'hésite pas à utiliser des alias pour les noms de table (plus facile et requête moins longue => tu t'y perds moins)
- Tu ne precises pas à quelle table appartiennent les champs NUMCAT et NUMART (continue ta méthode jusqu'au bout ou utilises des alias)
- Utilises plutôt ID que NUMAUT

- Sort ta fonction debutchaine pour éviter à ta fonction d'être redéfinie, ceci résoudra ton problème d'ailleurs (normalement)

- Pourquoi stockes-tu une variable dans une autre variable ($mots_complets = $data_post['CONTART'];) alors qu'après, tu appels directement cette première variable sans l'avoir stockée dans une autre variable ? (<?php echo $data_post['NOMAUT']; ?> ou <?php echo $data_post['DATART']; ?>)

Voici quelques informations qui peuvent t'aider à mieux coder selon moi.

A+
Gaerebut
0
schancel Messages postés 296 Date d'inscription dimanche 20 mars 2011 Statut Membre Dernière intervention 7 décembre 2018 49
29 août 2011 à 22:50
ajout une limite a la requete sql LIMIT "si tu veux cinq" 0,5 WHERE id>0
-2