[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...
sans ajax ni aucun jQuery le bug persiste,
sans ajax ni aucun jQuery le bug persiste, j'ai retirer tout les scripts afin de tester avec du html uniquement mais idem.... je pense pas chercher du coté du javascript surtout que le javascript aussi est le meme en local et fonctionne très bien... pas de probleme avec les preventDefault donc
et justement si la requete est appelée en ajax j'ai pas de double requetes....
le double traitement c'est que la page est appelée 2 fois : la première fois du début à .... je sais pas où mais le traitement ne va pas jusqu'à la fin .... comment déterminer où il s'arrete ? ah je vais essayer de remplir un fichier de log au fur et à mesure de l'execution du script ..
rien en echo de la première requete
les echos n'affichent rien dans le nav enfins seuls ceux de la seconde requete apparaissent....
un fichier de log me montre que les le script appelé deux fois s'éxécutent deux fois du début à la fin mais byzaremment la première requete n'écrit rien en base de données....
pfffff ... j'ai l'impression d'être maudit .... c'est quoi ce délire ?
.....
...... yyyyyyyyaaaaaaaaaaaaaaaaaaaaa !!!!!!!!!!!! j'ai trouvé !!!!
c'était bien un comportement navigateur : certains d'entre eux semble ignorer l'absence de balise pour favicon et se dise "attends il est pas déclaré je vais le chercher tout seul " ... enfoiré .... en plus il ne te le dit pas, il affiche rien .... alors qu'il génére une erreur que mon code est censé afficher proprement ....
j'ai fini par mettre dans un fichier de log tout le contenu de la page générée a chaque appel pour m'en rendre compte ....
Big merci à toi speedev pour ton aide et ton soutien, tu m'as bien aiguillé et rien que la sensation de pas être tout seul, ça force la motivation ;-)