Problème PHP

  • Auteur de la discussion Auteur de la discussion XoSt
  • Date de début Date de début
WRInaute passionné
Bonjour,

J'ai un problème PHP, je suis chez un hebergeur (reagi.com) et mes pages sont tout le temps en timeout... j'ai regardé, je crois que ca viens des commentaires, donc je post ici le code pour avoir vos avis d'optimisations.

Code:
// Début de l'affichage des news une par une ---------------------------------------------------------------------------------
if($_GET[id]="$_GET[id]"){
$query = "SELECT id,cat,membre,idmembre,titre,news,date,heure,nbvues,valide FROM news WHERE valide='oui' AND id=".$_GET[id]."";
$res = mysql_query($query) or die($query.'<br />'.mysql_error());
$result = mysql_num_rows($res);
if($result!=0){
$row = mysql_fetch_array($res);
mysql_query("UPDATE news SET nbvues=nbvues+1 WHERE id='$_GET[id]'");

// Début appel de la fonction bb_code
$message = $row[news];
$message = bb_code($message);
// Fin appel de la fonction bb_code

?>
<h1 class="titre"><? echo("$row[titre]"); ?></h1>
<div class="dots"></div>
<? echo("<span class=\"titre\">Posté par <a href=\"membres-profil-$row[idmembre].html\">$row[membre]</a> le $row[date] à $row[heure] dans la rubrique $row[cat], lues $row[nbvues]</span>"); ?>
<p><? echo("$message"); ?></p>
<p><? if($resultadmin!=0){ echo("<a href=\"admin-news-editer-$_GET[id].html\">Editer</a>"); } ?></p>
<h2 class="commentaires">Commentaires (<a class="addcommentaire" href="comnews-<? echo("$row[id]"); ?>.html">Ajouter un commentaire</a>)</h2>
<div class="dots"></div>
<?
}
$limite = 10;
if((!$_GET[si])||(!is_numeric($_GET[si]))) {$_GET[si]=0;}
$debut=$_GET[si];
$query = "SELECT * FROM commentaires WHERE sid=".$_GET[id]." AND type='1' ORDER BY id DESC LIMIT $debut,$limite"; 
$res = mysql_query($query) or die($query.'<br />'.mysql_error());
$result = mysql_num_rows($res);
if($result!=0){

// Début page par page
$query3 = "SELECT COUNT(id) FROM commentaires WHERE sid=".$_GET[id]." AND type='1'"; 
$res3 = mysql_query($query3) or die($query3.'<br />'.mysql_error());
$row3 = mysql_fetch_array($res3);
echo("<p class=\"pages\">");
$nbpages=ceil($row3[0]/$limite);
if($debut>0){
$debutp=$debut-$limite;
if($debutp<0) $debutp=0;
echo("<a href=\"news-".$_GET[id]."-$debutp.html\">Précédente</a> | ");}
$pagecourante=ceil($debut/$limite)+1;
for($j=1;$j<=$nbpages;$j++){
if($j==$pagecourante) print(" <span>$j</span> | ");
elseif(($j<=3)||($j>=$nbpages-2)||($j==$pagecourante-1)||($j==$pagecourante+1)){
$debutp=($j-1)*$limite;
echo("<a href=\"news-".$_GET[id]."-$debutp.html\">$j</a> | "); }
elseif(($j==4)&&(($pagecourante<4)||($pagecourante>5))) print(" ... | ");
elseif(($j==$nbpages-3)&&(($pagecourante>$nbpages-3)||($pagecourante<$nbpages-4))) print(" ... | "); }
if($pagecourante<$nbpages){
$debutp=$debut+$limite;
if($debutp>$row3[0]-1) $debutp=$row3[0]-1;
echo(" <a href=\"news-".$_GET[id]."-$debutp.html\">Suivante</a>"); }
echo("</p>");
// Fin page par page

while($row = mysql_fetch_array($res)) {

// Début appel de la fonction bb_code
$message = $row[commentaire];
$message = bb_code($message);
// Fin appel de la fonction bb_code

echo("<div class=\"commentaires\"><div class=\"t12g\">");
$query2 = "SELECT pseudo,id,avatar FROM membres WHERE pseudo='$row[membre]'";
$res2 = mysql_query($query2) or die($query2.'<br />'.mysql_error());
$row2 = mysql_fetch_array($res2);
if(empty($row2[avatar]) || ($row2[avatar]=="http://")){ echo("<img src=\"images/sansavatar.gif\" width=\"80\" height=\"80\" alt=\"Sans avatar\" title=\"Sans avatar\" />");
}else{
$avatar = str_replace(" ","%20",$row2['avatar']);
@list($width, $height, $type, $attr) = getimagesize("$avatar");
echo("<img src=\"$avatar\" alt=\"Avatar de $row2[pseudo]\" title=\"Avatar de $row2[pseudo]\" ");
if($width<=80){ echo("width=\"$width\" "); } 
else{ echo("width=\"80\" "); }
if($height<=80){ echo("height=\"$height\" />"); } 
else{ echo("height=\"80\" />"); } }
echo("</div><div class=\"t88g\">
<h3 class=\"commentaires\">$row[titre] - <span class=\"rouge\">$row[note]</span>/10</h3>
<div class=\"dots\"></div>
<span class=\"titre\">Posté par <a href=\"membres-profil-$row[idmembre].html\">$row[membre]</a> le $row[date] à $row[heure]</span>
<p>$message</p>");
if($resultadmin!=0){ echo("<a href=\"comnews-$_GET[id]-editer-$row[id].html\">Editer</a> / <a href=\"comnews-$_GET[id]-supprimer-$row[id].html\">Supprimer</a>"); }
echo("</div>
<div class=\"spacer\"></div>
</div>"); }

// Début page par page
echo("<p class=\"pages\">");
$nbpages=ceil($row3[0]/$limite);
if($debut>0){
$debutp=$debut-$limite;
if($debutp<0) $debutp=0;
echo("<a href=\"news-".$_GET[id]."-$debutp.html\">Précédente</a> | ");}
$pagecourante=ceil($debut/$limite)+1;
for($j=1;$j<=$nbpages;$j++){
if($j==$pagecourante) print(" <span>$j</span> | ");
elseif(($j<=3)||($j>=$nbpages-2)||($j==$pagecourante-1)||($j==$pagecourante+1)){
$debutp=($j-1)*$limite;
echo("<a href=\"news-".$_GET[id]."-$debutp.html\">$j</a> | "); }
elseif(($j==4)&&(($pagecourante<4)||($pagecourante>5))) print(" ... | ");
elseif(($j==$nbpages-3)&&(($pagecourante>$nbpages-3)||($pagecourante<$nbpages-4))) print(" ... | "); }
if($pagecourante<$nbpages){
$debutp=$debut+$limite;
if($debutp>$row3[0]-1) $debutp=$row3[0]-1;
echo(" <a href=\"news-".$_GET[id]."-$debutp.html\">Suivante</a>"); }
echo("</p>");
// Fin page par page

}
// --
 }
}
// Fin de l'affichage des news une par une ---------------------------------------------------------------------------------

Merci de votre aide :?
 
WRInaute impliqué
Euh... un peu la flemme de me taper le code à déchiffrer.

Essaie d'isoler une partie du code et de le faire tourner. Tu vas finir par isoler le code qui t'embête.

Sinon une bonne optimisation, c'est de construire ta chaine html et de ne faire un echo qu'à la fin de ta page.
Ne mets que du php dans ta page. quand tu veux du html tu l'écris dans une variable
au lieu de faire:
Code:
$message = $row[news];
$message = bb_code($message);
// Fin appel de la fonction bb_code

?>
<h1 class="titre"><? echo("$row[titre]"); ?></h1>
<div class="dots"></div>
<? echo("<span class=\"titre\">Posté par <a href=\"membres-profil-$row[idmembre].html\">$row[membre]</a> le $row[date] à $row[heure] dans la rubrique $row[cat], lues $row[nbvues]</span>"); ?>
<p><? echo("$message"); ?></p>
fait plutôt:
Code:
$message = $row[news];
$message = bb_code($message);
// Fin appel de la fonction bb_code
$chaine='<h1 class="titre">'.$row[titre].'</h1>';
$chaine.='<div class="dots"></div>';
$chaine.='<span class="titre">Posté par <a href="membres-profil-'.$row[idmembre].'.html">'.$row[membre].'</a> le '.$row[date].' à .'$row[heure].' dans la rubrique .'$row[cat].', lues .'$row[nbvues].'</span>';
$chaine.=$message.'</p>';

echo $chaine

Cela évite au serveur de balancer au client, exécuter du serveur, balancer au client, etc...

Ensuite moi je n'ai jamais aimé inclure les variables directement dans les chaine de caractères: on se perd un peu les pédales:
Code:
<a href=\"membres-profil-$row[idmembre].html\">$row[membre]</a>
On ne sait plus trop où est le code serveur du code client...
 
WRInaute occasionnel
Moi à mon avis en dehors des détails du fonctionnement du script, je pense que c'est mal codé... rien qu'en regardant une des premières lignes, quand je vois if($_GET[id]="$_GET[id]"){, je me dis que il y a un problème. Quand je regarde le reste du code... au niveau sécurité j'espère que le script ne constitue pas toute la page : pas de filtrage des variables en paramètres, pas de précaution au réaffichage, etc.

Pour le reste, d'accord avec le message ci-dessus, pas de séparation contenu/mise en forme, html et PHP mélangé (pas top pour relire et comprendre et pas optimisé niveau vitesse), etc.
 
WRInaute impliqué
Ah oui.... sinon, les commentaires dans le code n'ont aucune raison de le faire planter.
Tu peux en mettre autant que tu veux, ils ne sont pas interprétés.
 
WRInaute impliqué
10 $ que t'as un bleme d'accolade...
Vraiment pas clair ce code, il faut aérer aussi, avec une indentation des accolades, pour s'y retrouver plus facilement...
 
WRInaute impliqué
Ta page c'est une usine à gaz avec des requêtes imbriquées ! Tu m'étonnes que tu aies des timeout (en gros ton script tourne plus de 30secondes !!).

je suis en train de te faire un petit épurage de tout ce bazar ...
 
WRInaute impliqué
Hop voici la version corrigée (mais pas testée). C'est pas parfait mais ça sera déjà mieux que ce que tu as présenté là.

Code:
<?php
// Début de l'affichage des news une par une ---------------------------------------------------------------------------------
if( isset($_GET['id']) )
	{
		$_GET['id'] = intval($_GET['id']);
		$res = mysql_query("SELECT id,cat,membre,idmembre,titre,news,date,heure,nbvues,valide "
							"FROM news ".
							"WHERE valide='oui' AND id={$_GET['id']} ".
							"LIMIT 1;") or die(mysql_error());
		$row = mysql_fetch_array($res);
		mysql_query("UPDATE news SET nbvues=nbvues+1 WHERE id={$_GET['id']} LIMIT 1;");
	}

//pas d'ID de news, pas de résultat
if( !isset($_GET['id']) || empty($row) )
	{
		//ce que tu veux faire si jamais y'a pas de news retournée (redirection ou autre sinon bonjour le duplicate content)
		// ........
		
		die();
	}

// Début appel de la fonction bb_code
$row['news'] = bb_code($row['news']);
// Fin appel de la fonction bb_code
?>
<h1 class="titre"><?php echo $row['titre'];?></h1>
<div class="dots">&nbsp;</div>
<?php echo '
<span class="titre">Posté par <a href="membres-profil-'.$row['idmembre'].'.html">'.$row['membre'].'</a> le '.$row['date'].' à '.$row['heure'].' dans la rubrique '.$row['cat'].', lues '.$row['nbvues'].'</span>';?>
<p><?php echo $row['news'];?></p>

<?php
	if( $resultadmin != 0)
		{
			echo '<p><a href="admin-news-editer-'.$_GET['id'].'.html">Editer</a></p>';
		}
?>

<h2 class="commentaires">Commentaires (<a class="addcommentaire" href="comnews-<?php echo $row['id'];?>.html">Ajouter un commentaire</a>)</h2>
<div class="dots">&nbsp;</div>
<?php
$limite = 10;
$_GET['si'] = isset($_GET['si']) ? intval($_GET['si']) : 0;

//on compte le nombre de commentaires
// >>> pourquoi une limite vu qu'après tout est affiché ?
$res = mysql_query("SELECT COUNT(*) AS nb ".
					"FROM commentaires ".
					"WHERE sid={$_GET['id']} AND type='1' ".
					"/*ORDER BY id DESC ".
					"LIMIT {$_GET['si']}, {$limite}*/;") or die(mysql_error());
$comm = mysql_fetch_array($res);

//si on a des commentaires
if( $comm['nb'] > 0 )
	{
		
		// Pagination
		// On va stocker ça dans une chaine pour pas avoir à recalculer un 2° coup la même chose !
		// $comm['nb'] : nombre total de commentaires pour CETTE news
		$pagination = '';
		
		$nbpages = ceil( $comm['nb'] / $limite );
		$pagecourante = ceil( $_GET['si'] / $limite) + 1;
		
		$pagination .= '<p class="pages">';
		//page précédente ?
		$tmp = $_GET['si'] - $limite
		## PAS SUR DU TOUT DE CA ##
		$tmp = $tmp < 0 ? 0 : $tmp;
		$pagination .= '<a href="news-'.$_GET['id'].'-'.$tmp.'.html">Précédente</a> | ';
		

		for( $j = 1; $j <= $nbpages; $j++)
			{
				if( $j == $pagecourante)
					{
						$pagination .= $j.' | ';
					}
				elseif( $j<=3 || $j>=$nbpages-2 || $j==$pagecourante-1 || $j==$pagecourante+1 )
					{
						$tmp = ($j-1)*$limite;
						$pagination .= '<a href="news-'.$_GET['id'].'-'.$tmp.'.html">'.$j.'</a> | ';
					}
				elseif(($j==4)&&(($pagecourante<4)||($pagecourante>5)) || ($j==$nbpages-3)&&(($pagecourante>$nbpages-3)||($pagecourante<$nbpages-4)))
					{
						$pagination .= '... | ';
					}
			 }
			 
		if( $pagecourante < $nbpages )
			{
				$tmp = $_GET['si'] + $limite;
				## PAS SUR DU TOUT DE CA ##
				$tmp = $tmp >= $comm['nb'] ? $comm['nb'] : $tmp;
				$pagination .= '<a href="news-'.$_GET['id'].'-'.$tmp.'.html">Suivante</a>';
			}
			
		$pagination .= '</p>';
		echo $pagination;
		// Fin page par page

		// On affiche les commentaires de la page, donc on les sélectionne vu qu'on les a compté avant (autant faire dans l'ordre)
		$res = mysql_query("SELECT commentaires.*, ".
							"m.pseudo, m.avatar "
							"FROM commentaires ".
							"	LEFT JOIN membres m ON (m.id = commentaire.idmembre) ".
							"WHERE sid={$_GET['id']} AND type='1' ".
							"ORDER BY id DESC ".
							"LIMIT {$_GET['si']}, {$limite};") or die(mysql_error());
		while($row = mysql_fetch_array($res))
			{
				// Début appel de la fonction bb_code
				$row['commentaire'] = bb_code($row['commentaire']);
				// Fin appel de la fonction bb_code
				
				echo '<div class="commentaires"><div class="t12g">';
				
				//avatar ?
				if( !$row['avatar'] || $row['avatar'] == 'http://' )
					{
						echo '<img src="images/sansavatar.gif" width="80" height="80" alt="Sans avatar" title="Sans avatar" />';
					}
				else{
						$row['avatar'] = str_replace(' ', '%20', $row['avatar']);
						
						@list($width, $height, $type, $attr) = getimagesize($row['avatar']);
						//calcul des largeurs/hauteurs max
						$width = $width <= 80 ? $width : 80;
						$height = $height <= 80 ? $height : 80;
						
						//affichage
						echo '<img src="'.$row['avatar'].'" alt="Avatar de '.$row['pseudo'].'" title="Avatar de '.$row['pseudo'].'" width="'.$width.'" height="'.$height.'" />';
						unset($width, $height, $type, $attr);
					}
				echo '</div>
				<div class="t88g">
				<h3 class="commentaires">'.$row['titre'].' - <span class="rouge">'.$row['note'].'</span>/10</h3>
				<div class="dots">&nbsp;</div>
				<span class="titre">Posté par <a href="membres-profil-'.$row['idmembre'].'.html">'.$row['membre'].'</a> le '.$row['date'].' à '.$row['heure'].'</span>
				<p>'.$row['commentaire'].'</p>';
				
				//ADMIN
				if($resultadmin != 0)
					{
						echo '<a href="comnews-'.$_GET['id'].'-editer-'.$row['id'].'.html">Editer</a> / <a href="comnews-'.$_GET['id'].'-supprimer-'.$row['id'].'.html">Supprimer</a>';
					}
					
				echo '</div>
				<div class="spacer"></div>
				</div';
			}

			// Début page par page
			echo $pagination;
			unset($pagination);
			// Fin page par page

	}
// Fin de l'affichage des news une par une ---------------------------------------------------------------------------------

?>
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut