Interro PHP
Réponse AJAX

Code PHP de base

Pour cette interro, vous partirez du code PHP suivant. Il ouvre un fichier de logs Apache dans lequel chaque ligne donne le détail sur la connexion d'un internaute au serveur Apache (c'est expliqué dans le paragraphe suivant).

Dans cette interro/TP, vous allez devoir faire évoluer ce code PHP.

Enregistrement des logs de Apache dans une BDD
(Expressions régulières, PHP + SQL (INSERT INTO)

Chaque entrée dans le fichier des logs d'accès au serveur Internet Apache (access.log) ressemble à ça :
78.244.122.34 - - [26/Jan/2018:10:48:06 +0100] "GET / HTTP/1.1" 403 302

On peut y voir les informations suivantes :

Donc une entrée ressemblera toujours à ça (en vert, les parties variables, et en noir les parties fixes sur ce serveur) :
78.244.122.34 - - [26/Jan/2018:10:48:06 +0100] "GET / HTTP/1.1" 403 302

###TODO 1### (ligne 6 du code PHP initial) : écrivez l'expression régulière qui permet de capturer (grâce aux parenthèses capturantes) les sept données marquées en vert ci-dessus :

  1. l'adresse IP,
  2. la date,
  3. la commande HTTP utilisée (ici : GET),
  4. le chemin d'accès à la ressource demandée par l'internaute (ce chemin ne peut pas contenir d'espace : les espaces sont systématiquement échappés en %20 : vous pouvez donc supposer que ce chemin d'accès est "tout sauf un espace"),
  5. la version du protocole utilisée : HTTP/1.0 ou HTTP/1.1,
  6. le code renvoyé par le serveur (ici : 403),
  7. la taille en octets de la réponse (ici : 302).
Attention, cette expression régulière est difficile à écrire parfaitement bien. Pour vous simplifier le travail, notez bien :
Votre réponse n°1

On veut écrire les logs dans une base de données. La base est prête et déjà à votre disposition :

Les enregistrements dans la base de données ressembleront à ça :

interro2-bdd.png

### TODO 2 ### (ligne 2 du code PHP initial) : écrivez la commande PHP mysqli_connect avec son paramétrage qui permet de se connecter à cette base de données (avec gestion d'erreur) :

Votre réponse n°2

### TODO 3### : écrivez le code PHP/SQL qui permet d'insérer l'entrée de log dans la base de données :

Votre réponse n°3

Un peu de SQL

Grâce à des requêtes SQL, on veut comparer le nombre de requêtes HTTP qui sont initiées depuis les adresses IP suivantes :

  1. le localhost (127.0.0.1 ou 192.168.0.2 ou 10.53.130.250). Aide : utilisez l'opérateur SQL IN.
  2. le réseau local (10.?.?.? sauf les adresses localhost précisées ci-dessus). Aide : utilisez le comparateur SQL LIKE.
  3. le réseau public (toutes les requêtes HTTP qui proviennent hors du lycée Aubanel). Aide : utilisez le NOT IN (sélectionner les entrées dont les adresses IP sont NOT IN (la liste des adresses IP qui ne nous intéressent pas).

Écrivez la première requête en SQL (vous avez la possibilité de la tester dans phpmyadmin.bts-sio.com) :

Votre réponse n°4

Écrivez la deuxième requête en SQL :

Votre réponse n°5

Écrivez la troisième requête en SQL :

Votre réponse n°6

PHP + SQL

On veut afficher et compter le nombre de résultats de la première requête du paragraphe précédent (nombre de requêtes HTTP initiées depuis localhost).

### TODO 4 ### : écrivez le code PHP qui exécute la requête SQL et affiche les résultats :

Votre réponse n°7

### TODO 4 ### : écrivez le code PHP amélioré qui affiche (n'importe-où) le nombre de résultats renvoyés par la requête(vous avez deux solutions : utiliser la fonction idoine de la librairie mysqli, ou faire un compteur en PHP) :

Votre réponse n°8

Et encore un peu de PHP...

On veut voir les requêtes HTTP coûteuses en bande passante pour le serveur : celle qui transfèrent beaucoup d'octets.

### TODO 5 ### : en PHP cette fois-ci (et non plus en SQL) : affichez les lignes de logs où la taille en octets de la réponse est supérieure à 1000000 octets.

Votre réponse n°9

On veut que l'internaute puisse saisir une adresse IP dans un formulaire. Dans la boucle while, on affichera que les entrées de log correspondant à cette adresse IP.

### TODO 6 ### : en HTML et PHP , effectuez ce formulaire et le traitement associé.

Votre réponse n°10