Tu peux rattraper un mail que j’ai envoyé par erreur ?
Array_shit()
Pourquoi, quand la doc indique ceci …
Shift an element off the beginning of array @param array array The input array. @return mixed the shifted value, or &null; if array is empty or is not an array.
… on obtient ça :
array_shift() expects parameter 1 to be array, object given
Est-ce que ça signifie que, selon la terminologie de PHP, un objet ce n’est ni “empty” ni “not an array” ?
Alors pourquoi is_array() retourne false quand on lui passe un objet ?
Surtout, pourquoi array_shift() ne renvoie pas juste null comme ce qui est marqué dans la doc, hein ? HEIN ?
On installe un nouveau Drupal, ça ne nous en fera que trois !… On dit Drupals ou Drupaux au pluriel ?
Enum, true : combo !
Suite du billet précédent.
Evidemment c’était beaucoup trop simple.
Le type de colonne déclaré en base de données (MySQL) n’est pas un booléen (type qui n’existe pas chez MySQL et qui se transforme en TINYINT(1) ; passons) mais un ENUM(‘true’, ‘false’).
Et évidemment, la colonne en question n’est pas déclarée comme étant NOT NULL
Voici comment se décompose le contenu de notre table :
- ‘false’ : 12260 occurrences
- ‘true’ : 223394 occurrences
- (vide) : 123382 occurrences
- NULL : 447765 occurrences
D’où sortent ces valeurs vides !?
D’après la doc de ENUM,
If you insert an invalid value into an ENUM (that is, a string not present in the list of permitted values), the empty string is inserted instead as a special error value. This string can be distinguished from a “normal” empty string by the fact that this string has the numeric value 0.
Ah ouais, ok, c’est pour “signaler une erreur spéciale”, désolé, je pensais pas qu’on pouvait volontairement pourrir à la volée les données envoyées pour “signaler une erreur”. J’apprécie également le fait qu’elle soit “spéciale” parce qu’elle “a la valeur numérique zéro”, pour une chaîne vide, c’est vrai que c’est pour le moins spécial.
Autre comportement purement magique de MySQL, toujours à propos des enums :
numbers ENUM('0','1','2')
If you store 2, it is interpreted as an index value, and becomes ‘1’ (the value with index 2). If you store ‘2’, it matches an enumeration value, so it is stored as ‘2’. If you store ‘3’, it does not match any enumeration value, so it is treated as an index and becomes ‘2’ (the value with index 3).
Déjà que PHP est casse-bonbons à pas savoir ce qui est un nombre et ce qui est une chaîne de caractères, si MySQL s’y met aussi on n’est pas rendus !
Et la meilleure pour la fin c’est que la définition de la colonne est “ENUM(‘false’, ‘true’)” ce qui signifie que ‘false’ correspond à la valeur 1 (vous savez, le truc que vaut true quand on lui demande sa valeur numérique) et que ‘true’ correspond à la valeur 2.
Au final, on utilise en PHP un booléen qui est valorisé avec une chaîne “true” qui sera transformée en “0” à l’insertion en base parce que c’est la valeur “true” de l’ENUM qui sert à stocker ce qui est essentiellement un booléen ?
J’ai envie d’être malpoli…
True à deux balles
La classe Fiche a un attribut is_exploitable dont le commentaire JavaDoc indique “@param type $is_exploitable” (évidemment non valide en plus d’être non informatif) et qui est valorisé par défaut à false (le booléen).
Voici comment cet attribut est (systématiquement) valorisé :
$fiche->is_exploitable = 'true';
Vous voyez venir la catastrophe ? Non ? Alors voici un second indice : on enregistre en base de données de la manière suivante…
$datas["exploitable"] = ($this->is_exploitable or $this->is_exploitable=='true')?"1":"0";
Heureusement qu’on ne valorise jamais à ‘false’ parce que ça n’aurait pas vraiment eu, en base, la valeur booléenne attendue.
Panne à quota
Tout est tellement sens dessus-dessous que l’on retrouve des conditions métier dans des éléments où elles ne devraient pas se trouver.
Cas concret : le calcul d’un dépassement de quota.
On envoie des données à des partenaires et ces partenaires ont une periodeQuota (“jour”, “semaine”, “mois”, “aucun”) et un quota (nombre d’envois max sur la période, par défaut à 0).
Pour tester si un partenaire a atteint son quota, on devrait regarder s’il y a une période de quota et le cas échéant regarder si on a fait moins d’envois que le quota…
Mais non, c’est sûrement beaucoup trop simple !
public function isQuotaDepasse() {
return $this->getNbEnvois() > $this->quota;
}
public function getNbEnvois() {
if ($this->periodeQuota = "aucun") {
$this->nbEnvois = 0;
} else {
$this->nbEnvois = 0;
$database = Database::instance();
// (...) accès à la base de données (...)
if (count($db_result)==0) {
return $this->nbEnvois;
} else {
$resultats = $db_result->as_array();
if ($resultats[0]->nb=='') {
$this->nbEnvois = 0;
} else {
$this->nbEnvois= $resultats[0]->nb;
}
}
}
return $this->nbEnvois;
}
Je passe sur l’utilité de valoriser un attribut dans une méthode censée retourner une valeur (une méthode qui met à jour l’attribut + une qui retourne l’attribut, ça éviterait des confusions ou des écrasements de données…), sur l’utilité de faire un else après un return, sur l’intérêt d’avoir pour moitié des return au milieu du code et pour l’autre moitié une attente de la fin de la méthode pour faire le return, sur la beauté des imbrications inutiles …
Le plus important, c’est cette question : quelle a été la première phrase prononcée lors de la première consultation des statistiques d’envoi d’un partenaire sans quota ?
OMGWTF !! ON N’A RIEN ENVOYE A [nom d’un gros client] !!!
No shit, Sherlock !
/** * Renvoie true/false * * @param int $fiche_id * @param string $classname * * @return boolean */
Vu qu’elle retourne un booléen, on se doute… On aurait préféré savoir comment elle décide !
Double facepalm
$destinataires = array('toto@example.com,titi@example.com');
$t3->dest = implode(',', $destinataires);
“Il sert à rien ce implode()! C’était beaucoup plus simple de prendre $destinataire[0]”
Mais comment sort-on si on est déjà dehors ?
Si vous vous demandiez ce qui peut être plus inutile qu’un “break” dans la clause default d’un switch, ne cherchez plus : on vient d’avoir la réponse.
switch ($variable) {
case 'bla' :
bla();
break;
case 'bli' :
bli();
break;
default :
exit();
break;
}
Depuis le mois de décembre j’ai une boite mail un peu capricieuse qui me mets mes mails soit en boite de réception soit en éléments supprimés comme bon lui semble (il n’y a pas de règle).
Tu m’étonnes

