Bienvenue sur PEBKAC.fr, le site qui recense les anecdotes où l’on se moque des utilisateurs ne maîtrisant pas l’outil informatique. PEBKAC est un acronyme signifiant « Problem Exists Between Keyboard And Chair ».
Le problème se situe entre la chaise et le clavier : soumettez vos histoires, donnez votre avis !
Ce site n'est pas le site original pebkac.fr. Je publie ici la liste des PEBKAC que j'ai pu sauvegarder avant que le site original ne soit mis hors ligne.
Sur un forum, un utilisateur demande comment remplacer une boucle foreach par une boucle for en PHP, car le résultat ne fonctionne pas sous IE 9.

Ce serait bon de revoir les notions client/serveur, ça éviterait de passer pour un… PEBKAC.
PEBKAC #9739 proposé par Link le 04/04/2014 | 25 commentaires | 👍🏽 👎🏽 +225
Pour sa défense, s'il n'a que IE9, il a peut-être une vieille version de windows, et une vieille version de PHP locale et donc...

Bah non en fait, BEDP
Commentaire #136819 écrit par baudouin le 04/04/2014 à 08h46 | 👍🏽 👎🏽 +1
Tu as oublié les balises <avocatdudiable> !
Commentaire #136824 écrit par Kelgarath le 04/04/2014 à 09h05 | 👍🏽 👎🏽 +1
Je ne sais pas si c'est la notion de client serveur qui pose problème. Beaucoup pensent que php est exécuté sur le client et s'étonne de ne pas voir leur code dans le code source de la page ou ne s'étonne pas de le voir quand ça chie.

BEDP
Commentaire #136830 écrit par but2ene le 04/04/2014 à 09h29 | 👍🏽 👎🏽
du coup oui, c'est la notion client/serveur le problème que tu décris :P
Commentaire #136840 écrit par yomama le 04/04/2014 à 09h54 | 👍🏽 👎🏽
Pour l'anecdote, le navigateur a à voir sur le comportement du PHP*.

Il y a quelques semaines, j'ai dû mettre en place un système de verrou pour qu'une instance d'un script PHP ne puisse pas être lancée si une autre est déjà en cours d'exécution. Pour cela je crée un fichier que je verrouille avec un flock. Si le fichier est déjà verrouillé, le flock est supposé retourner une erreur, et donc j'annule l'exécution de la nouvelle instance. Voila pour la théorie.

En pratique, ça marche pas : quand j'ouvre deux instances avec Chrome, la première s'exécute, et la seconde attend que la première ait terminée pour se lancer, alors qu'elle devrait s'arrêter immédiatement. Je cherche dans les docs de flock les différents paramètres... ça change rien. Dans le doute, j'essaie avec IE : ça marche, la seconde instance est immédiatement stoppée. Et dans le cas où c'est lancé en ligne de commande, ça marche aussi. Je ne sais toujours pas comment le navigateur influe la dedans, si quelqu'un ici a la solution je le remercie !

* (peut être que si chrome doit ouvrir deux onglets avec la même url il attend que le premier soit chargé pour lancer le second ? donc le serveur (et le PHP) ne rentre pas en compte)
Commentaire #136850 écrit par Link le 04/04/2014 à 10h25 | 👍🏽 👎🏽
IE et Firefox fonctionne de la même manière, les instances ne sont pas séparées, même en ouvrant deux Firefox, c'est la même instance. Chrome ouvre des instances indépendantes. Mais cela ne devrait pas avoir d'influence sur le code serveur. Le flock fait un flop.
Commentaire #136857 écrit par spidermoon le 04/04/2014 à 10h53 | 👍🏽 👎🏽
On demande capitaine pasdéveloppeur en caisse 3, s'il vous plaît.
Commentaire #136885 écrit par Bourriks le 04/04/2014 à 12h05 | 👍🏽 👎🏽
Je penche plus pour un bug du serveur web (Apache, je suppose) que de PHP. À mon avis Chrome peut influencer la façon dont Apache "thread" ses connexions. Comme flock est extrêmement "sensible" à son environnement cela peut avoir un rapport.

Cela dit je n'ai aucune explication véritable. As-tu essayé d'encapsuler ton flock dans une classe comme ici #111984" rel="external nofollow" class="outbound">http://fr2.php.net/manual/fr/function.flock.php#111984 ?

Tu peux aussi essayer d'utiliser LOCK_NB comme masque du second argument, pour voir si cela change quelque chose, même s'il y a de forte chances que non (ex. : LOCK_EX|LOCK_NB )

Si tu n'arrives pas à résoudre le problème il faudra peut être te faire ton propre verrou maison. Perso je prendrais exemple sur la classe lock évoquée dans le lien au-dessus avec création/vérification de l'existence d'un fichier vide pour le verrou, effacement de celui-ci pour déverrouiller.
Afin que ce ne soit pas bloquant tu peux imaginer un système de date limite du fichier (ce qui devra ou non déconnecter les sessions existantes).
Commentaire #136888 écrit par aDev le 04/04/2014 à 12h26 | 👍🏽 👎🏽
Capitaine pasdéveloppeur ? Tu devras te contenté de moi, je suis l'Amiral de la flotte Pasdéveloppeur.

<Analogie de merde>
Le mec demande qu'on lui change son démarreur parce que sa bagnole prends du super alors qu'il veut du Gasoil.
</Analogie de merde>

En fait, il dit que sa boucle "foreach" fonctionne pas sous IE9, sauf que le "code" est exécuté coté serveur et que le navigateur te donne juste "le rendu". Ce n'est pas le "coté client" (IE9) qui est en cause pour le coup, si j'ai bien compris ce que Link à voulu dire dans son PEBKAC.
Commentaire #136891 écrit par Fox le 04/04/2014 à 12h42 | 👍🏽 👎🏽
/Finch place une flaque d'huile

Cette personne devrait essayer d'utiliser cette fonction while(1) il n'aurait alors plus aucun problème avec ses instances.
Commentaire #136895 écrit par H. Finch le 04/04/2014 à 12h54 | 👍🏽 👎🏽
heu non la notion client serveur ne se limite pas à JS vs PHP ou au web. Ne pas savoir où tel service s'exécute c'est orthogonal à ne pas connaitre la notion de service distant qu'un client va la consommer.
Commentaire #136899 écrit par but2ene le 04/04/2014 à 13h00 | 👍🏽 👎🏽
Le sujet en question est ici : http://fr.openclassrooms.com/forum/sujet/foreach-remplacer-par-for

En gros, il se sert du foreach pour afficher des éléments HTML. Ça marche sur IE9 (contrairement à ce que j'ai dit dans le pebkac), mais pas sur les versions antérieures. Il met donc le problème sur le dos du PHP (coté serveur), alors que le problème vient du client.

Pour faire une analogie plus claire que celle de Fox (ou pas), il met en cause le facteur pour les fautes d'orthographe dans le courrier qu'il a envoyé.
Commentaire #136906 écrit par Link le 04/04/2014 à 13h13 | 👍🏽 👎🏽
Je fais un flock($fp, LOCK_EX | LOCK_NB) (où $fp est mon fichier de lock). Il marche très bien, sauf quand je le lance deux fois avec Chrome.
Commentaire #136908 écrit par Link le 04/04/2014 à 13h15 | 👍🏽 👎🏽
Alors tu es un while(1)? Je t'aurais plutôt cru for(;;)
Commentaire #136934 écrit par Millman le 04/04/2014 à 15h04 | 👍🏽 👎🏽
Merci les gars !
Commentaire #136942 écrit par Bourriks le 04/04/2014 à 16h13 | 👍🏽 👎🏽
ERRATUM : je n'avais pas vu que mon lien avait merdé, je parlais du 2eme commentaire sur cette page http://fr2.php.net/manual/fr/function.flock.php (celui de metamarkers)
Commentaire #136944 écrit par aDev le 04/04/2014 à 16h15 | 👍🏽 👎🏽
Sinon, pour un tableau assocatif (sinon c'est pas drôle), une réponse possible est :
for (($v=reset($tab)) + ($k=array_search($v,$tab)); $v!==false; $k = array_search(($v=next($tab)), $tab) )
 {
 // traitement
 }


Nous passerons sur les inconvénients multiples pour nous attarder uniquement sur les 2 avantages :
- Ça fonctionne exactement comme un foreach et toutes les instructions permettant de boucler sont dans le for
- Ça fera probablement peur à l'utilisateur en question si tu lui réponds ça.
Commentaire #136948 écrit par aDev le 04/04/2014 à 16h36 | 👍🏽 👎🏽
Pour donner un aperçu concret, il te suffit de faire le raccourci clavier ctrl + u pour afficher le code source de cette page.
Tout ce que tu vois s'afficher sur ton PC client, c'est quasi que du HTML (donc du langage descriptif) qui t'a été envoyé par le serveur. Le code PHP qui a servi à générer ce HTML reste sur le serveur de pebkac.fr : il n'y a pas ici de boucles, conditions ou autres bizarreries de développeur.
Commentaire #136956 écrit par Voynich le 04/04/2014 à 18h00 | 👍🏽 👎🏽
</avocatdudiable>

Et la W3C-compliance, mon jeune ami ?
Les balises sont <div class="avocat" client="lediable"></div>.
Commentaire #136962 écrit par Geist le 04/04/2014 à 18h42 | 👍🏽 👎🏽
Plus exactement, il met en cause son secrétaire pour le fait que le destinataire du courrier qu'il lui dicte est analphabète.
Commentaire #136964 écrit par Geist le 04/04/2014 à 18h48 | 👍🏽 👎🏽
client n'est pas un tag des RFC W3C.
Commentaire #136965 écrit par Cartman34 le 04/04/2014 à 19h53 | 👍🏽 👎🏽
@Geist: Je me disais que l'analogie de Link manquait un peu de précision et tu as trouvé exactement celle que je cherchais ^^
Commentaire #136985 écrit par Shadam le 05/04/2014 à 18h11 | 👍🏽 👎🏽
il n'y a pas ici de boucles, conditions ou autres bizarreries de développeur.

Dites donc restez poli jeune homme !
Commentaire #136986 écrit par Shadam le 05/04/2014 à 18h12 | 👍🏽 👎🏽
ok 5 personnes confondent internet et web. XD
Commentaire #137019 écrit par but2ene le 07/04/2014 à 14h47 | 👍🏽 👎🏽
<div class="rattrapage">Emm... W3C tout en le défendant, le troll ultime.</div>
Commentaire #137027 écrit par Geist le 07/04/2014 à 20h51 | 👍🏽 👎🏽