Médiaforma

All posts tagged fonctions

Arrivés à ce point dans la formation, vous utilisez couramment les fonctions du langage PHP. Mais saviez-vous que le langage SQL possède ses propres fonctions ? Ces dernières pourront être utilisées dans des requêtes pour affiner les recherches.

Il existe deux types de fonctions SQL :

  • Les fonctions scalaires. Elles s’appliquent à chacune des valeurs qui lui sont passées. Quelques exemples : UPPER(), LOWER(), LENGTH(), ROUND().
  • Les fonctions d’agrégat. Elles effectuent des calculs sur une table et retournent un résultat. Quelques exemples : AVG(), SUM(), MAX(), MIN(), COUNT().

Voyons comment utiliser ces fonctions sur des exemples précis.

Nous allons convertir en minuscules les valeurs du champ CustomerID et en majuscules les valeurs du champ Country de la table northwind . Voici la table northwind avant et après la conversion :

Pour arriver à ce résultat, vous utiliserez les fonctions scalaires LOWER() et UPPER() :

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Utilisation de fonctions SQL</title>
    <style>
      td { padding-right: 30px;}
    </style>
  </head>
  <body>
    <?php
      try {
        $base = new PDO('mysql:host=localhost; dbname=northwind', 'root', '');
      }
      catch(exception $e) {
        die('Erreur '.$e->getMessage());
      }
      $base->exec("SET CHARACTER SET utf8");
      $retour = $base->query('SELECT LOWER(CustomerID) as CustomerID_min, UPPER(Country) as Country_maj FROM customers');
      echo "<table>";
      while ($data = $retour->fetch()){
        echo "<tr><td>".$data['CustomerID_min']."</td>";
        echo "<td>".$data['Country_maj']."</td></tr>";
      }
      echo "</table>";
      $base = null;
    ?>
  </body>
</html>

Exécutons ce code dans WAMP Server. Le résultat est bien conforme à ce qui était attendu.

Un autre exemple. Supposons que vous vouliez connaître la valeur moyenne du champ Quantity de la table order_details de la base de données northwind.

Vous utiliserez pour cela la fonction d’agrégat AVG() :

SELECT AVG(Quantity) FROM order_details;

Pour saisir facilement cette requête, rien de tel que l’interface d’administration phpMyAdmin. Cliquez sur la base de données northwind dans le volet gauche. Basculez sur l’onglet SQL. Entrez la requête dans la zone dédiée, puis cliquez sur Exécuter. Le résultat est immédiatement affiché dans la partie inférieure de la fenêtre.


Comme nous venons de le voir, la fonction sscanf() permet d’effectuer des recherches dans une chaîne et d’extraire dans des variables des données mises en forme. Les fonctions d’extraction de chaînes ne se limitent pas à la fonction sscanf(). Vous devriez également vous intéresser aux fonctions suivantes :

Fonction Effet
ltrim() Suppression des espaces en début de chaîne
rtrim() Suppression des espaces en fin de chaîne
str_replace() Remplace toutes les occurrences d’une sous-chaîne dans une chaîne
strlen() Longueur d’une chaîne
strpos() Recherche de la première position d’une sous-chaîne dans une chaîne
strrchr() Dernière occurrence d’un caractère dans une chaîne
strrev() Inverse la chaîne spécifiée
strrpos Recherche de la dernière position d’une sous-chaîne dans une chaîne
substr() Extrait une sous-chaîne d’une chaîne
trim() Supprime les espaces en début et en fin de chaîne

 

Pour en savoir plus sur ces fonctions, consultez la page http://php.net/manual/fr/ref.strings.php.


Les variables définies dans le code sont utilisables partout, hormis dans les fonctions.

<?php
  $a = 10;
  function test() {
    echo "Dans la fonction, \$a = ".$a;
  }
  echo "En dehors de la fonction, \$a = ".$a."<br>";
  test();
?>

Voici le résultat de ce code.

Comme vous pouvez le voir, la variable $a est inaccessible dans la fonction. Son utilisation provoque une erreur à l’exécution. Pour corriger ce problème, il suffit de déclarer la variable $a globale à l’intérieur de la fonction. Il est alors possible de lire, mais également de modifier la variable dans la fonction.

<?php
  $a = 10;
  function test() {
    global $a;
    echo "Dans la fonction, \$a = ".$a."<br>";
    $a = 20;
  }
  echo "Avant l'exécution de la fonction, \$a = ".$a."<br>";
  test();
  echo "Après l'exécution de la fonction, \$a = ".$a."<br>";
?>

Exécutez ce code dans Wampserver. Comme vous pouvez le voir, la vatiable globale $a est bien accessible dans la fonction.

Il est même possible de la modifier globalement. La modification est répercutée dans tout le code, y compris en dehors de la fonction.

Une autre solution consiste à utiliser le tableau associatif $GLOBALS[] :

<?php
  $a = 10;
  function test() {
    echo "Dans la fonction, \$GLOBALS[\"a\"] = ".$GLOBALS["a"]."<br>";
    $GLOBALS["a"] = 20;
  }
  echo "Avant l'exécution de la fonction, \$a = ".$a."<br>";
  test();
  echo "Après l'exécution de la fonction, \$a = ".$a."<br>";
?>

Voici le résultat :

Les variables définies à l’intérieur d’une fonction ont une portée limitée à cette fonction.

Examinez ce code :

<?php
  function test() {
    $a = 10;
    echo "Dans la fonction, \$a = ".$a."<br>";
  }
  echo "Avant l'exécution de la fonction, \$a = ".$a."<br>";
  test();
  echo "Après l'exécution de la fonction, \$a = ".$a."<br>";
?>

A l’exécution, deux erreurs sont détectées : une sur la première instruction echo (car la variable $a n’est pas encore définie) et une sur la dernière instruction echo (car la variable $a n’est pas accessible en dehors de la fonction) :

Nous allons en terminer avec la portée des variables en parlant des variables statiques. La portée d’une variable statique est locale à une fonction, mais elle ne perd pas sa valeur lorsque la fonction est à nouveau appelée.

Examinez ce code :

<?php
  function test() {
    static $a = 10;
    echo "\$a = ".$a."<br>";
    $a++;
  }
  test();
  test();
  test();
  test();
?>

La variable $a est définie statique lors de son initialisation dans la fonction. Cette instruction ne sera exécutée qu’une fois. Les quatre appels de la fonction test() affichent donc successivement les valeurs 10, 11, 12 et 13 pour la variable $a :

Essayez de supprimer le mot static. Que se passe-t-il ?

Pour le savoir, exécutons ce code dans Wampserver.

Comme vous le supposiez certainement, la variable $a vaut 10 à chaque exécution de la fonction test.


Définissez une fonction qui calcule les racines d’une équation du second degré du type :

ax² + bx + c = 0

Les valeurs a, b et c seront passées en paramètre de la fonction.

Rappel

Pour résoudre ce problème, calculez :

delta = b*b – 4*a*c

Si delta est négatif, il n’y a pas de solution.

Si delta est nul, il y a une racine unique égale à :

 –b/2*a

Si delta est positif, il y a deux racines égales à :

(-b – racine(delta))/2*a et (-b + racine(delta))/2*a

Maintenant, c’est à vous. Faites une pause dans la vidéo et résolvez le problème. Vous pourrez poursuivre la vidéo pour voir la solution.

 

Solution

<?php

  function racines($a, $b, $c) {
    echo "Recherche des solutions de l'équation $a x² + $b x + $c<br>";
    $delta = $b*$b - (4 * $a * $c);
    if ($delta < 0)
      echo "Cette équation n'a pas de solution.";
    if ($delta == 0)
      echo "Cette équation a une racine double égale à ".-$b/(2*$a);
    if ($delta > 0){
      $racine1 = (-$b - sqrt($delta))/(2*$a);
      $racine2 = (-$b + sqrt($delta))/(2*$a);
      echo "Cette équation a deux racines : $racine1 et $racine2";
    }
  }
  racines(1, 2, 1);
?>

Ce code ne présente aucune difficulté.

On définit la fonction racines qui admet trois paramètres : les trois coefficients de l’équation du second degré.

La variable $delta calcule le discriminant de l’application.

Si $delta est négatif, la fonction affiche un message pour indiquer que l’équation n’a pas de solutions.

Si $delta est nul, la fonction affiche la solution unique.

Enfin, si $delta est positif, la fonction calcule les deux racines de l’équation puis les affiche.

La dernière instruction appelle la fonction racines en lui transmettant trois paramètres.

Exécutons le code avec WAMPServer. Dans cet exemple, l’équation a une solution double égale à -1.

 


Les fonctions sont définies par le mot-clé function :

function nom(param1, param2, … paramN){
  //Une ou plusieurs instructions
  return $valeur;
}

Où :

  • nom est le nom de la fonction ;
  • les paramI sont les éventuels paramètres passés à la fonction ;
  • $valeur, si elle est spécifiée, est la valeur retournée par la fonction.

Par exemple, pour calculer le cube de la valeur passée en paramètre, vous pouvez mettre en place cette fonction :

function cube($nombre){
  return $nombre*$nombre*$nombre;
}

Pour calculer et afficher le cube de 5, vous appellerez la fonction cube() comme ceci :

echo cube(5);