Le script auteurs_liste.php affiche la liste des auteurs sélectionnés d'après les critères saisis dans la page auteurs_cherche.php. C'est la clause WHERE du SELECT sur la table auteurs qui fait cette sélection.
L'utilisateur a le choix entre plusieurs actions.
Le code du script auteurs_liste.php est un peu plus complexe que celui de auteurs_cherche.php, surtout à cause de la gestion à faire des éléments saisis. On commence par traiter les paramètres reçus dans le tableau $_POST avant de générer le code HTML de la page. La partie sélection et affichage des résultats a déjà été vue de nombreuses fois dans les pages précédentes. Quelques commentaires après le code.
Exécuter auteurs_cherche.php puis auteurs_liste.php
Il y a dans ce script 3 nouveautés :
L'opérateur SQL LIKE permet d'effectuer des sélections sur une partie seulement d'un champ alphanumérique. Il permet de définir des modèles de sélection plutôt que des des égalités strictes de chaînes de caractères. La définition de ces modèles se fait avec deux "jokers" :
Exemples :
Pour sélectionner un auteur à modifier, l'utilisateur clique sur un lien (le nom de l'auteur). Ce lien est composé avec un paramètre crypté (l'ID de l'auteur). Le cryptage est fait avec la fonction crypterURL() écrite sur les principes vues dans "Web et PHP", "Les liens". Cette fonction est placée dans notre bibliothéque de fonctions bib_fonctions.php.
/**
* Crypte une valeur pour la passer dans une URL.
*
* @param mixed $val La valeur à crypter
* @return string La valeur cryptée et encodée url
*/
function crypterURL($val) {
$ivlen = openssl_cipher_iv_length($cipher='AES-128-CBC');
$sha2len=32;
if (! isset ($_SESSION['cle_crytage'])){
$_SESSION['cle_crytage'] = base64_encode(
openssl_random_pseudo_bytes($ivlen));
$_SESSION['cle_hachage'] = base64_encode(
openssl_random_pseudo_bytes($sha2len));
}
// -- génération du vecteur d'initialisation
$iv = openssl_random_pseudo_bytes($ivlen);
// -- cryptage de $val
$x = openssl_encrypt($val, $cipher,
base64_decode($_SESSION['cle_crytage']),
OPENSSL_RAW_DATA, $iv);
// -- calcul de la signature de la valeur cryptée
$hmac = hash_hmac('sha256', $x,
base64_decode($_SESSION['cle_hachage']), true);
$x = substr($hmac, 0, $sha2len/2)
.$iv.$x.substr($hmac, $sha2len/2);
$x = base64_encode($x);
return urlencode($x);
}
On a bien sûr aussi écrit la fonction decrypterURL().
**
* Décrypte une valeur cryptée avec la fonction crypterURL
*
* @param string $x La valeur à décrypter
* @return mixed La valeur décryptée ou FALSE si erreur
*/
function decrypterURL($x) {
$ivlen = openssl_cipher_iv_length($cipher='AES-128-CBC');
$x = base64_decode($x);
$sha2len=32;
$hmac = substr($x, 0, $sha2len/2).substr($x, -$sha2len/2);
$iv = substr($x, $sha2len/2, $ivlen);
$x = substr($x, $sha2len/2 + $ivlen, -$sha2len/2);
// calcul de la signature de la chaine cryptée reçue
$hmacCalc = hash_hmac('sha256', $x,
base64_decode($_SESSION['cle_hachage']), true);
if (! hash_equals($hmac, $hmacCalc)){
return FALSE;
}
return openssl_decrypt($x, $cipher,
base64_decode($_SESSION['cle_crytage']),
OPENSSL_RAW_DATA, $iv);
}
Notez, dans la fonction crypterURL(),
la condition
if (! isset ($_SESSION['cle_crytage']))
Son utilisation permet
de générer une paire de clés différente pour chaque utilisateur.