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.
Alors que je suis dans la configuration d'un petit forum (une « machine simple »…) et de quelques mods, je me trouve confronté à un refus du parseur sur les https:// dans la shoutbox. Un petit tour dans le code me montre ceci :

// find links to convert, including the ones with SSL
$length = 7;
$string = 'http://';
if (strstr($msg, 'http://') !== false){
  if (strstr($msg, 'https://') !== false){
    $string = 'https://';
    $length = 8;
  }
}
//…

À première vue, ce code attend donc une chaîne quantique, à la fois =="http://" et =="https://". PEBKAC.
PEBKAC #9063 proposé par blag le 05/12/2013 | 16 commentaires | 👍🏽 👎🏽 +136
Mec, tu n'as rien compris, ceci est une révolution, faut tout dualiser :o
Commentaire #121392 écrit par mini le 05/12/2013 à 17h32 | 👍🏽 👎🏽
Ça marche sur ce lien : `http://parse.moi?parexemple=https://` !

En effet il n'attend pas une chaîne "quantique" comme tu dis mais une chaîne contenant les deux sous chaînes.

Sinon, joli PEBKAC.
Commentaire #121398 écrit par aDev le 05/12/2013 à 17h44 | 👍🏽 👎🏽
Je ne connais pas le langage, mais les if (XXX !== false) ne sont-ils pas eux aussi des PEBKAC ? On attend une valeur true, donc pas besoin de tester l'égalité, non ? A la limite, un test d'égalité avec true pour la lisibilité, mais un test de différence avec false...
Commentaire #121401 écrit par Epok__ le 05/12/2013 à 18h28 | 👍🏽 👎🏽
sauf que quand tu connais pas le langage, un simple tour ici : http://www.php.net/strstr t'aurais montrer que ça renvoi soit une position soit FALSE.
Commentaire #121403 écrit par marcel le 05/12/2013 à 18h54 | 👍🏽 👎🏽
Si je m'en tiens à la page vers laquelle tu envoies Epok__, strstr() ne renvoie pas une position. Il renvoi soit une chaine de caractère soit FALSE.
"Retourne la portion de la chaîne, ou FALSE si needle n'est pas trouvé."
Mais maintenant je ne sais peut-être pas lire la doc d'une fonction, ou cette doc est peut-être erronée ou mal écrite, je ne sais pas...

Epok__ se trompe en effet en proposant de faire un test sur TRUE (en même temps, il pose une question^^). Pour ma part, vu le type de retour de la fonction strstr(), je trouve que le test !== n'est pas nécessaire. Un simple != est tout à fait fiable (si mes antiques notions de PHP ne sont pas trop erronées).
Cela dit, mettre !== n'est toutefois pas un pebkac à mon avis.

Edit:
En fait, un simple if (strstr($msg, 'http://')) aurait suffit je pense.
Commentaire #121405 écrit par Youplà le 05/12/2013 à 19h07 | 👍🏽 👎🏽
Ce n'est pas pour rien que j'ai horreur des langages faiblement / non typés...
Commentaire #121428 écrit par Raizarachi le 05/12/2013 à 21h20 | 👍🏽 👎🏽
@marcel : Comme je ne compte pas apprendre un langage à chaque anecdote, je préfère poser la question...

@Youplà : Merci pour ta réponse, habitué aux langages avec un typage plus fort, je n'avais pas pensé que ce genre de choses était possible (retourner soit une chaîne, soit un booléen). Ce qui répond d'ailleurs de nouveau @marcel : même si j'étais allé voir la page en question, cela ne m'aurait en rien avancé, vu que je ne connaissais pas ce comportement. Par ailleurs, l'EDIT de Youplà semble dire que ce que je proposais est acceptable... Une chaîne de caractère peut-elle être testée en tant que booléen, comme n'importe quel int en C, par exemple, où toute valeur différente de 0 est vraie ?
Commentaire #121429 écrit par Epok__ le 05/12/2013 à 21h24 | 👍🏽 👎🏽
Comme quoi pas PHP c'est définitivement de la merde pas un langage très précis.
Commentaire #121430 écrit par Shadam le 05/12/2013 à 21h40 | 👍🏽 👎🏽
@Youplà : effectivement, mettre !== n'est pas un pebkac, d'ailleurs obligatoire si la chaîne recherchée était par exemple un 0. De toute façon, ici il aurait plutôt du faire if( 0 === strpos($msg, 'http://') ) puisqu'il n'a pas besoin du retour de chaîne de strstr, surtout qu'en plus, sa condition ne prouve pas que la chaîne se trouve bien au début.
Commentaire #121438 écrit par juu le 05/12/2013 à 23h29 | 👍🏽 👎🏽
A force de vous lire, je me vois obligée d'aller chercher sur le net la différence entre = ; == et ===.
J'aurais dû m'arrêter à l'anecdote.
Commentaire #121483 écrit par complexe le 06/12/2013 à 12h46 | 👍🏽 👎🏽
@Juu:
Tu écris "d'ailleurs obligatoire si la chaîne recherchée était par exemple un 0." Mais .... 0 n'est pas une chaine, c'est un chiffre. Si tu lui passes 0 à rechercher, la fonction recherchera une chaine vide (→ caractère correspondant au code ASCII 0). Recherche qui n'a pas beaucoup de sens, donc. Sinon, il faut lui passer "0" en paramètre, et là, j'ose espérer que PHP ne fait pas la confusion entre le caractère "0" et FALSE.

@Raizarachi:
Idem. Je trouve ça tellement pas précis, tellement peu adapté à la rigueur de la programmation ! Malheureusement, c'est avec un langage de ce type que je bosse...
Commentaire #121491 écrit par Youplà le 06/12/2013 à 13h03 | 👍🏽 👎🏽
Malheureusement, 0 == "0" == FALSE ! PHP c'est LE MAL bordel !

Voilà pourquoi il faut le plus possible utiliser des comparaisons STRICTES, même si effectivement ici on peut s'en passer puisque http:// avec ou sans s équivaut à TRUE

Je vous invite à jeter un coup d'œil au tableau nommé Loose comparisons with == sur cette page :
http://www.php.net/manual/en/types.comparisons.php
Commentaire #121496 écrit par aDev le 06/12/2013 à 13h13 | 👍🏽 👎🏽
Malheureusement, 0 == "0" == FALSE ! PHP c'est LE MAL bordel !
~_~
Permalien sauvez-nous !
Commentaire #121536 écrit par Youplà le 06/12/2013 à 16h57 | 👍🏽 👎🏽
Malheureusement, 0 == "0" == FALSE ! PHP c'est LE MAL bordel !

Je suis pas un expert, mais, pour moi, c'est normal que 0 == false. C'est le cas dans tous les langages que je connais. Par contre, pour "0" == false, je ne sais pas (d'ailleurs ça m'étonne un peu. Ça ne devrait pas plutôt donner le chiffre qui correspond au caractère 0 en fonction de l'encodage ?)
Commentaire #121565 écrit par Somadeva le 07/12/2013 à 09h18 | 👍🏽 👎🏽
Somadeva : c'est justement ce que dit aDev, ce n'est pas normal que "0" soit égal à 0 et donc à False, en PHP.

% php -r "var_dump(0 == "0");"
bool(true)
% php -r "var_dump(FALSE == "0");"
bool(true)
% php -r "var_dump(FALSE === "0");"
bool(false)
% php -r "var_dump(0 === "0");"
bool(true)
% php -r "var_dump(0 == md5('PHP c/'est LE MAL bordel'));"
bool(true)

PHP sux.
Commentaire #121575 écrit par n0p le 08/12/2013 à 03h41 | 👍🏽 👎🏽
Je viens de lire sur http://www.php.net/manual/en/types.comparisons.php que php considère le -1 comme true si on utilise == et pas ===.

NON MAIS PHP QUOI.
Commentaire #121580 écrit par Gérard le 08/12/2013 à 08h34 | 👍🏽 👎🏽