Posts Tagged ‘expert’

Dans une fonction, en PHP, on peut accéder aux variables externes à la fonction en utilisant le mot-clef global, ou le tableau $GLOBALS. Ces variables sont alors passées par référence : les modifier dans la fonction revient à les modifier dans le script appelant la fonction.

Publicités

Pour les requêtes préparées, avec PDO, on peut mettre en place, lors du binding des arguments, un filtrage sur le type attendu.

La documentation donne des exemples pour les méthodes

/* Exécution d'une requête préparée en liant des variables PHP */
$calories = 150;
$couleur = 'rouge';
$sth = $dbh->prepare('SELECT nom, couleur, calories
    FROM fruit
    WHERE calories bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':couleur', $couleur, PDO::PARAM_STR, 12);
$sth->execute();

Que se passe-t-il lorsque j’envoie un mauvais type ?

PDO s’occupe de caster les variables pour qu’elles correspondent au type attendu.
avec PARAM_INT, si on propose une chaîne, elle devient la valeur 0
avec PARAM_STR, 15 (longueur max de chaîne), la chaîne est tronquée à 15 caractères.

En PHP5, avec l’amélioration de la POO, on a la possibilité de mettre en place des constantes de classe.

Ces constantes permettent d’enregistrer une valeur qu’on réutilise et qui n’est pas modifiée. Ces constantes ne sont accessibles que de manière statique, depuis la classe, et non pas depuis une instance de la classe.


classe Tarte{

const NB_PARTS = 8;

}

//pour y accéder, je dois le faire en statique

echo Tarte::NB_PARTS;

PCRE, à quoi sert l’option ‘e’ ?

L’option ‘e’ n’est disponible qu’avec la fonction preg_replace(). Quand on regarde dans la documentation sur php.net, la liste des options pour les expressions régulières est donnée, dont le fameux ‘e’, PREG_REPLACE_EVAL.

Avec cette option, preg_replace() effectue la substitution normale des références arrières dans la chaîne de remplacement, puis l’évalue comme un code PHP, et utilise le résultat pour remplacer la chaîne de recherche. Les simples quotes, les doubles quotes, les anti-slashes et les caractères NULL sont échappées avec des anti-slashes (\) dans les références arrières substituées.

Seule preg_replace() utilise cette option. Elle est ignorée par les autres.

Ce qui entre en jeu ici, est que la capture va être remplacée et évaluée en tant que code PHP.

$email = "ilia@php.net";
 $new_email = preg_replace('!([^a-z]{1})!ie', "'&#'.ord('\\1').';'", $email);
    var_dump($new_email);

Durant une formation, on s’est retrouvé face à une particularité assez fine de MySQL, alors qu’on cherchait à tester PDO en PHP.

Voici la requête préparée qu’on avait mise au point :

SELECT nom, prenom
FROM auteur
WHERE nom = ?;

En lieu et place du nom, nous avons voulu insérer un zéro

Cela donnait donc

SELECT nom, prenom
FROM auteur
WHERE nom = 0;

En ce cas, MySQL transtype tous les noms de champs en entier, de la même manière que PHP, à savoir :
‘abc’ donne 0
‘3 euros’ donne 3

Dans cette requête, le WHERE comporte une égalité, donc MySQL transtype les membres de l’égalité pour la réaliser. Il transtype donc le champ nom en entier, et notre requête devient :

SELECT nom, prenom
FROM auteur
WHERE 0 = 0;

Mais ce qui est encore plus fort, c’est d’utiliser FALSE. Le SQL comprend FALSE comme valeur, mais lors d’une requête, le même transtypage, évoqué ci-dessus, s’opère et FALSE devient 0 en tant qu’entier.

Donc la requête

SELECT nom, prenom
FROM auteur
WHERE nom = FALSE;

renvoie les mêmes résultats que celle déjà citée avec le WHERE 0=0

Etonnant, non ?