[Smarty] Double exécution script PHP si trop de "echo"
Bonjour,
Petits soucis avec smarty....
Je me suis aperçu que mon script principal index.php était exécuté 2 fois malgré 1 seul appel de page (log apache le confirmant) et ce, selon que je fasse des echos plus ou moins importants.
Pour avoir le coeur net concernant cette double exécution, j'ai fais une requête SQL d'insertion sur une table de test sur mon index.php, j'ai réactualisé ma page et j'ai remarqué 2 insertions à chaque fois dans ma table.
Après un debugging, j'arrive au constat suivant :
Si je fais un ...
Code:
1 2 3 4 5 6
| <?php
echo (float)microtime(true)-$deb;
// ou même un
echo "test tout bête";
// en somme un echo assez court
?> |
...il n'y a jamais double exécution.
Mais si je fais un ...
Code:
1 2 3 4
| <?php
echo (float)microtime(true)-$deb;
echo "kjlkjkljlzeklfjkzlejfkzlejklfzjeklfzjeklfjkzlejfkzljefjzlekfjkzlejfkzlejfklejkl";
?> |
...il y a toujours double exécution.
Selon le nombre de echos et leur importance en nombre de caractères affichés, le script est exécuté une ou deux fois.
De ce que j'ai pu débuggué ce n'est à priori par lié à la compilation smarty ni au cache...
J'ai cherché à droite et à gauche et j'arrive pas à expliquer ça.
Help...
Le responsable est là mais où ?!!
Aaah, toujours quelqu'un depuis 2009 pour suivre :D
Bien, alors j'avais déjà vérifié, je n'ai aucun attribut src="" donc ce n'est pas ça... Et sur ma page, j'ai des liens avec des onclick mais sans propriété href car c'est sur des boutons (tiens j'en ai 3 d'ailleurs... ??! Y aurait-il un lien ? Je vais vérifier mais je ne verrai pas le rapport. M'enfin c'est tellement bizarre que va savoir !)
Pour résumer, je fais un appel SQL avec LIMIT pour afficher x nombre de posts par page et aller aux posts plus récents / plus anciens. Quand ce nombre de posts par page est à 1 tout va bien. Ça donne ça en enlevant quelques détails encombrants (requête différente si recherche par année, par tag etc.) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
$posts_par_page = 4;
$page = $_GET['page'];
// Affichage du bon nombre de posts par pages - 1) on compte combien de posts à afficher au total selon la requête
$select_count = "SELECT COUNT(*) FROM ma_table WHERE statut='online'";
$select_count_res = mysql_query($select_count) or die('Erreur SQL !<br>'.$select_count.'<br>'.mysql_error());
$count_data = mysql_fetch_array($select_count_res);
$NombrePostsOnline = $count_data['0'];
// Affichage du bon nombre de posts par pages - 2) préparation des liens prev/next
if (!isset($page)) {$page = 0;}
$posts_prev = $page+1;
$posts_next = $page-1;
$page = $page*$posts_par_page;
// Posts plus récents : si première page pas de liens vers "posts + récents"
if ($page == 0) {
$next_posts_link = '';
} else {
$next_posts_link = "<a href=\"blog.php?page=$posts_next&tag=$label&search=$search&year=$search_year\" class=\"ancre\">Plus récents <img src=\"img/next_posts.png\" align=\"absmiddle\" alt=\"\"></a>";
}
// Posts plus anciens : si dernière page pas de lien vers posts + anciens
if ($page+$posts_par_page >= $NombrePostsOnline) {
$prev_posts_link = '';
} else {
$prev_posts_link = "<a href=\"blog.php?page=$posts_prev&tag=$label&search=$search&year=$search_year\" class=\"ancre\"><img src=\"img/prev_posts.png\" align=\"absmiddle\" alt=\"\"> Plus anciens</a>";
}
// on prépare la requête d'affichage des post en fonction du type d'affichage (complet, par tags, par date...)
$select_posts = "SELECT * FROM ma_table WHERE statut='online' ORDER BY id DESC LIMIT $page,$posts_par_page"; // affichage de l'intégralité des posts (default) |
Voila ensuite je fais ma requête pour retrouver les infos des différents posts à afficher (titre, contenu, date etc.) et pour afficher :
Code:
1 2 3 4 5 6 7 8 9
|
for ($i=0;$i<count($title);$i++) {
echo '<div class="blog">';
echo '<div class="title">'.$title[$i].'</div>';
echo $post[$i];
echo "<div class=\"date\">$dateD[$i] $dateM[$i] $dateY[$i]</div><div class=\"comments\">$commentaires[$i]</div>";
if ($i != count($title)-1) {echo '<hr style="width:50%;text-align:left;margin-left:0px"><br>';}
echo '</div>';
} |
Donc si je vire cette boucle for() ou que je met $posts_par_page = 1 là plus de problèmes...
Merci ! Je vais essayer d'enlever un de mes 3 boutons voir si ça ne s’exécute plus que 2 fois par ex.
comportement navigateur ?
Bonjour,
j'ai essayé tout ce qu'il y a dans cette page.... qui synthétise la plupart des posts que j'ai pu trouver sur le sujet....
Dans mon cas le meme code en local ne déclenche pas de double requete, j'ai désactivé tout le javascript encore double requete j'ai veillé à aucun attribut vide quel qu'il soit (hormis alt et value) mais là encore echec...
je cherche des pistes sur le fonctionnement des navigateurs, en fait sur mac je dispose de chrome, opéra, firefox et safari, et il n'y a que safari qui ne déclenche pas de double requete ? le pourquoi de cette question pourrait-il m'aider à résoudre mon probleme ? et puis cette donnée me laisse penser que cela ne vient pas non plus de mon serveur ....
les requetes xhr ne déclenchent pas de doubles requetes, ça aussi c'est une piste, mais je comptais pas coder toutes mes interfaces en ajax....
mon probleme à moi c'est que cette double requete trompe mon systeme de clé par page qui justement veille à ne pas executer un script deux fois par erreurs (rechargement d'une page contenant un formulaire)....
j'ai pas l'habitude de poster sur les forums d'habitude j'y trouve ce dont j'ai besoin et j'ai de nombreux favoris qui pointent sur votre site ^^, mais là je sèche...
merci de votre attention...