Problème d'affichage php
milo1986
Messages postés
126
Date d'inscription
Statut
Membre
Dernière intervention
-
gaerebut Messages postés 1017 Date d'inscription Statut Membre Dernière intervention -
gaerebut Messages postés 1017 Date d'inscription Statut Membre Dernière intervention -
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>
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:
- Problème d'affichage php
- Affichage double ecran - Guide
- Easy php - Télécharger - Divers Web & Internet
- Problème affichage fenêtre windows 10 - Guide
- Windows 11 affichage classique - Guide
- Thunderbird problème affichage message - Forum Thunderbird
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)
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)
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:
Par ça:
- 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
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