# Utiliser PHP

Cette section regroupe plusieurs erreurs pouvant survenir lors de l'écriture de scripts PHP.

1. Je ne me rappelle pas de l'ordre des paramètres dans les fonctions PHP, sont-ils aléatoires ?
2. J'aimerais écrire un script PHP générique qui pourrait traiter les données provenant de tout formulaire. Comment savoir quelles variables de la méthode POST sont disponibles ?
3. Il faut que je convertisse tous les guillemets simples (') en un antislash suivi d'un guillemet simple (\'). Comment le faire avec une expression régulière ? J'aimerais aussi convertir " en \" et \ en \\.
4. Quand je fais ce qui suit, l'affichage se fait dans le mauvais ordre : <?php function mafonction($argument) { echo $argument + 10; } $variable = 10; echo "mafonction($variable) = " . mafonction($variable); ?> que se passe-t-il ?
5. Hey, où sont mes nouvelles lignes ? <pre> <?php echo "Ceci est ma première ligne."; ?> <?php echo "Celle-ci devrait s'afficher en dessous de la première."; ?> </pre>
6. J'obtiens le message 'Warning: Cannot send session cookie - headers already sent...' ou 'Cannot add header information - headers already sent...'.
7. J'ai besoin d'accéder à des informations dans l'en-tête de requête directement. Comment puis-je le faire ?
8. Quand j'essaye d'utiliser l'identification avec IIS j'obtiens 'No Input file specified'.
9. Windows: Je ne peux pas accéder aux fichiers partagés sur un autre ordinateur utilisant IIS
10. Comment mélanger XML et PHP ? PHP se plaint de mes balises <?xml !
11. Où puis-je trouver une liste complète des variables prédéfinies que je peux utiliser dans mes scripts PHP ?
12. Comment puis-je générer des fichiers PDF sans utiliser les bibliothèques non libres PDFLib ? J'aimerais une façon gratuite et qui ne requiert pas de bibliothèques PDF externes.
13. Certaines directives PHP peuvent prendre des noms littéraux, et pas seulement des valeurs entier. Quels sont tous les raccourcis disponibles ?

Je ne me rappelle pas de l'ordre des paramètres dans les fonctions PHP, sont-ils aléatoires ?

  PHP rassemble des centaines de bibliothèques externes et ça peut paraître parfois déroutant. Cependant, une règle simple à retenir :

  Les paramètres concernant les fonctions sur les tableaux sont dans l'ordre "needle, haystack" tandis que les paramètres sur les fonctions gérant les chaînes sont exactement à l'opposé "haystack, needle".

  À partir de PHP 8.0, les arguments nommés permettent de passer les arguments par nom de paramètre, rendant l'ordre des paramètres moins important.

J'aimerais écrire un script PHP générique qui pourrait traiter les données provenant de tout formulaire. Comment savoir quelles variables de la méthode POST sont disponibles ?

  PHP fournit plusieurs variables pré-définies, comme la superglobale $_POST. Il est possible de boucler sur $_POST puisque c'est un tableau associatif de toutes les valeurs envoyées par la méthode POST. Par exemple, bouclons dessus simplement avec `foreach`, vérifions les valeurs vides et affichons-les.

      <?php
      $empty = $post = array();
      foreach ($_POST as $nomvar => $valeurvar) {
          if (empty($valeurvar)) {
              $empty[$nomvar] = $valeurvar;
          } else {
              $post[$nomvar] = $valeurvar;
          }
      }

      echo '<pre>';
      if (empty($empty)) {
          print "Aucune valeur POSTée n'est vide, postées :\n";
          var_dump($post);
      } else {
          print "Nous avons " . count($empty) . " valeurs vides\n";
          print "Postées :\n"; var_dump($post);
          print "Vides :\n";  var_dump($empty);
          exit;
      }
      echo '</pre>';
      ?>

Il faut que je convertisse tous les guillemets simples (') en un antislash suivi d'un guillemet simple (\'). Comment le faire avec une expression régulière ? J'aimerais aussi convertir " en \" et \ en \\.

  Si l'on suppose que c'est pour une base de données, utiliser le mécanisme d'échappement fourni avec la base de données. Par exemple, utiliser la fonction mysql_real_escape_string() avec MySQL et pg_escape_string() avec PostgreSQL. Il y a également les fonctions génériques comme addslashes() et stripslashes(), qui sont plus communes avec l'ancien code PHP.

  Échapper manuellement les valeurs est sujet aux erreurs et dépend du contexte. Il est préférable d'utiliser les API de base de données qui supportent les instructions préparées et la liaison de paramètres au lieu de construire des requêtes en concaténant des chaînes échappées.

Quand je fais ce qui suit, l'affichage se fait dans le mauvais ordre :

    <?php
    function mafonction($argument)
    {
        echo $argument + 10;
    }
    $variable = 10;
    echo "mafonction($variable) = " . mafonction($variable);
    ?>

que se passe-t-il ?

  Pour pouvoir utiliser le résultat d'une fonction dans une expression (comme le concaténer avec une chaîne comme dans cet exemple), il faut retourner la valeur avec return, et non pas l'afficher avec echo.

Hey, où sont mes nouvelles lignes ?

    <pre>
    <?php echo "Ceci est ma première ligne."; ?>
    <?php echo "Celle-ci devrait s'afficher en dessous de la première."; ?>
    </pre>

  En PHP, la fin d'un bloc de code est soit "?>" ou "?>\n" (où \n signifie une nouvelle ligne). Donc dans l'exemple plus haut, les phrases affichées le seront sur une seule ligne, car PHP oublie les nouvelles lignes après la fin du bloc. Cela signifie qu'il faut insérer une nouvelle ligne de plus après chaque bloc de code PHP pour la lui faire afficher.

  Pourquoi PHP fait-il cela ? Car lors du formatage du HTML, cela simplifie les choses car cette nouvelle ligne n'est pas souhaitée, mais il faudrait créer de très longues lignes ou rendre la source brute de la page illisible pour arriver à cet effet.

J'obtiens le message 'Warning: Cannot send session cookie - headers already sent...' ou 'Cannot add header information - headers already sent...'.

  Les fonctions header(), setcookie(), et les fonctions de session doivent ajouter des en-têtes au flux de sortie, mais ceux-ci ne peuvent être envoyés qu'avant le reste du contenu. Il ne doit y avoir aucun affichage avant d'utiliser ces fonctions, comme le HTML par exemple. La fonction headers_sent() vérifiera si le script a déjà envoyé des en-têtes. Voir aussi les fonctions de bufferisation de sortie.

J'ai besoin d'accéder à des informations dans l'en-tête de requête directement. Comment puis-je le faire ?

  La fonction getallheaders() le fera si PHP est exécuté en tant que module Apache. Le code suivant affiche tous les en-têtes de requête :

      <?php
      $headers = getallheaders();
      foreach ($headers as $nom => $contenu) {
          echo "headers[$nom] = $contenu<br />\n";
      }
      ?>

  Voir aussi apache_lookup_uri(), apache_response_headers() et fsockopen().

Quand j'essaye d'utiliser l'identification avec IIS j'obtiens `'No Input file specified'`.

  Le modèle sécuritaire de IIS est en faute. C'est un problème commun à tous les programmes CGI fonctionnant avec IIS. Une alternative est de créer un fichier HTML (non exécuté par PHP) comme page d'entrée dans le dossier où il faut s'identifier. Utiliser alors une balise META pour rediriger vers la page PHP, ou encore proposer un lien vers celle-ci. PHP reconnaîtra alors l'identification correctement. Cela ne devrait pas non plus affecter d'autres serveurs NT. Pour plus d'informations, voir : » http://support.microsoft.com/kb/q160422/ et la section du manuel concernant l'identification HTTP.

Windows: Je ne peux pas accéder aux fichiers partagés sur un autre ordinateur utilisant IIS

  Il faut modifier le service `Go to Internet Information Services`. Localiser le fichier PHP et éditer ses propriétés. Se placer sur l'onglet `File Security`, `Edit -< Anonymous access and authentication control`.

  Il est possible de résoudre ce souci soit en décochant la case `Anonymous Access` et en laissant la case `Integrated Window Authentication` cochée, soit en cochant la case `Anonymous Access` et en éditant l'utilisateur qui ne doit pas avoir les droits d'accès.

Comment mélanger XML et PHP ? PHP se plaint de mes balises <?xml !

  Pour inclure <?xml dans le code PHP, il faut désactiver les short tags en configurant la directive PHP short_open_tags à `0`. Il n'est pas possible de modifier cette directive avec ini_set(). Que short_open_tags soit à on ou off, il est toujours possible de faire ceci : `<?php echo '<?xml'; ?>`. La valeur par défaut pour cette directive est `On`.

Où puis-je trouver une liste complète des variables prédéfinies que je peux utiliser dans mes scripts PHP ?

  Consulter la page du manuel qui concerne les variables prédéfinies vu qu'elle présente une liste partielle des variables prédéfinies disponibles dans un script. Une liste complète des variables disponibles (et beaucoup d'informations) peut être vue en appelant la fonction phpinfo(). Consulter la section du manuel traitant des variables non-issues de PHP, elle décrit des scénarios communs pour les variables externes, comme celles issues d'un formulaire HTML, d'un cookie, et de l'URL.

Comment puis-je générer des fichiers PDF sans utiliser les bibliothèques non libres PDFLib ? J'aimerais une façon gratuite et qui ne requiert pas de bibliothèques PDF externes.

  Il y a quelques alternatives écrites en PHP tel que » FPDF et » TCPDF.

Certaines directives PHP peuvent prendre des noms littéraux, et pas seulement des valeurs entier. Quels sont tous les raccourcis disponibles ?

  Les options disponibles sont K (pour kilooctets), M (pour mégaoctets) et G (pour gigaoctets), et sont insensibles à la casse. Toute autre syntaxe est supposée représenter des octets. `1M` équivaut à un mégaoctet ou `1048576` octets. `1K` équivaut à un kilooctet ou `1024` octets. Ces notations abrégées peuvent être utilisées dans le fichier php.ini et dans la fonction ini_set(). Il est à noter que la valeur numérique est transtypée en entier ; par exemple, `0.5M` est interprété comme `0`.

  > Note: kilooctet contre kibioctet

  > La notation PHP décrit un kilooctet comme étant égal à 1024 octets, alors que le standard IEC considère ça comme un kibioctet. En bref: k et K = 1024 octets.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open