1. Introduction

Jusqu'en 2015, le site des CFF Prosurf permettait de pouvoir connaître les positions exactes de tout leur parc de matériel roulant. Hors, depuis le 1er janvier 2016, ce site a été remplacé par un autre ne permettant plus de réaliser cette fonction. Depuis le début de l'année, je cherchais à créer une sorte de site qui aurait permis une sorte d'équivalent à Prosurf, cela permettant de rendre service aux "spotters" suisses. Malheureusement, n'ayant pas les bases nécessaires en informatique, il m'était impossible de réaliser ce projet. Cependant, grâce à l'OC Informatique, j'ai finalement pu le réaliser.
Mais en quoi consiste-t-il véritablement ?
Il s'agit donc d'un site permettant de réaliser deux actions distinctes.
La première action est l'ajout de données. Lorsqu'une personne voit une locomotive, elle a la possibilité de la recenser, c'est-à-dire de remplir le formulaire sur le site afin d'indiquer précisément le type, le pays, le numéro UIC de la locomotive, le numéro de train (s'il est connu), ainsi que le lieu, le prénom et le nom de l'observateur. Concernant l'heure, elle fonctionne par auto increment, c'est-à-dire, lorsque qu'une personne termine de remplir le formulaire et l'envoie à la base de données, l'heure et la date sont automatiquement remplis. La deuxième fonction est la consultation de données. N'importe qui peut consulter la base de données via le site, cela lui permettant, si un matériel roulant spécifique a été recensé, de pouvoir connaître lequel, où et quand.
Il s'agit en fait d'un site "donnant-donnant", c'est-à-dire que chacun peut aller consulter les données enregistrées par d'autres personnes, mais peut aussi remplir le formulaire afin de renseigner d'autres clients potentiels du site.

2. Matériel et méthodes

2.1 Matériel

Le matériel utile à la réalisation de se projet se limite à un ordinateur ayant accès au terminal afin de pouvoir se connecter au serveur du gymnase et à un compte phpMyadmin qui permet de créer une ou plusieurs bases de données.

2.2 Méthodes

Plusieurs méthodes ont été utilisées pour réaliser ce projet; elles serons décrites ci-dessous.

2.2.1 HTML

Tout d'abord, commençons par la page permettant de remplir les champs par des données qui seront transmises à la base de données. J'ai nommé dans mon site cette page: formulaire.html.
A noter que ci-dessous, seul les informations nécessaire à la création des champs ainsi qu'à l'envoi des données comprises dans les champs seront énoncées. Concernant la mise en place du fichier HTML, ainsi que sont aspect avec CSS, il est possible de consulter les sites suivants qui vous donnerons toutes les informations nécessaires.
Les liens:
Pour le HTML
Pour le CSS

2.2.1.1 Création d'un champ

En premier lieu, il faut créer un ou plusieurs champ. Il sera possible de le remplir par une certaine valeur qui pourra être ensuite inscrite dans la base de données. Le code est le suivant:

<input type="text" name="nom_du_champ_d_insertion" />

On définit ici, dans le langage HTML, un champ de type texte permettant d'envoyer des données à la base de données nom_du_champ_d_insertion.

2.2.1.2 Création du bouton d'envoi des informations

D'une fois que le champ a été créé et que des valeurs peuvent y être remplies, il faut passer à la prochaine étape, soit l'envoi de la valeur ou des valeurs. Pour ce faire, il faut créer un bouton "envoyer". Le code est le suivant:

<input type="submit" value="envoyer" name="envoyer"/> 

Ce code permet donc d'envoyer la ou les données. Hors, aucune page précise n'est définie pour recevoir les informations. C'est pour cela qu'il faut, à l'intérieur même de la balise form (balise permettant de contenir différents champs dédiés aux remplissages de données), insérer une page de référence. Le code est le suivant:

<form method="post" action="pcible.php">

On définit ici la page où l'on enverra les données (action="pcible.php"), puis on utilise la méthode "post" relative à la page de référence pour que les données soient transférées.

2.2.2 php/mysql

Après avoir créé le formulaire avec les différents champs, il faut passer à la création de la page php envoyant les données à la base de donnée et celle permettant de lire les données. Ces étapes seront décrites ci-dessous:

2.2.2.1 Envoi de données

2.2.2.1.1 Connection à la base de données et sélection de la base de données

Tout d'abord, la connection à phpMyadmin (l'hébergeur de la base de donnée) ainsi que la sélection de la base de données est la partie la plus importante du projet car sans celle-ci, impossible d'envoyer et de lire des informations dans la base de données. Mais comment se déroule-t-elle ?
Pour ce faire, il s'agit d'utiliser le code suivant:
Voici le code en langage mysql pour la connection à phpMyadmin:

$db = mysql_connect('localhost', 'identifiant', 'code');

Et voici le code pour la sélection de la base de donnée:

mysql_select_db('base de donnée',$db);

Le $db correspond à la variable db (data base) qui sert à faire le lien entre la connection à phpMyadmin et la selection de la base de données.

2.2.2.1.2 Identification du champ contenant la valeur a inscrire dans la base de données

L'identification se fait grâce à isset, un fonction permettant de contrôler si le champ a bien été rempli. Le code est le suivant:

if (isset($_POST'nom_du_champ_d_insertion')) {
        $nom_du_champ_d_insertion=$_POST'nom_du_champ_d_insertion';
} else {
        $nom_du_champ_d_insertion="";
}

Le code en langage php signifie littéralement: si le champ nom_du_champ_d_insertion contient une valeur, alors écrit dans la base de données: nom_du_champ_d_insertion, sinon, si le champ est vide, laisse vide le champ dans la base de données.

2.2.2.1.3 Contrôle du remplissage du champ

En php, en utilisant simplement un if, il est possible de contrôler si le champ est rempli puis d'envoyer la donnée comprise dans le champ , et s'il ne l'est pas, de bloquer l'envoi. Le code est le suivant:

if(empty($nom_du_champ_d_insertion)) 
    { 
    echo "Les données n'ont pas pu être enregistrées car tous les champs *  n'ont pas été remplis !"; 
    } 
else { ...

Le if contrôle ici si le champ est rempli ou vide avec la fonction empty(vide). Ici, si la fonction empty détecte que le champ est vide, il imprime la phrase suivante: Les données n'ont pas pu être enregistrées car tous les champs * n'ont pas été remplis !. De plus, cette fonction bloque l'envoi de la donnée, ici vide.
Si au contraire le champ est rempli, alors la valeur sera envoyée dans la base de données via le else.

2.2.2.1.4 Envoi des données avec la fonction INSERT INTO

En utilisant la fonction INSERT INTO, cela permet d'envoyer dans la table de données inclues dans la base de données, la valeur du champ nom_du_champ_d_insertion. Le code est le suivant:

$sql = "INSERT INTO `table de donnée` (`nom_du_champ_d_insertion`) VALUES('$nom_du_champ_d_insertion')";

Le code dit littéralement: insert dans la table de donnée, dans le nom_du_champ_d_insertion, la valeur du nom_du_champ_d_insertion.

2.2.2.2 Lecture des données

2.2.2.2.1 Connection à la base de données

Concernant la connection à la base de données, on opère de presque de la même manière qu'au paragraphe 2.2.2.1.1. En effet, $db est remplacé par $rdbms et mysql_connect est remplacé par mysql_select_db, cela permettant d'aller tirer des informations de la base de données.

$rdbms = mysql_connect('localhost', 'identifiant', 'code');
$db = mysql_select_db('base de données', $rdbms); 
2.2.2.2.2 Sélection des champs de la base de données ainsi que l'ordre de l'affichage des données en fonction de la colonne

Pour ce faire, le code suivant est requis:

@@$results = mysql_query('SELECT `nom_base_de_donnée`.`id`, `champ1`,`nom_base_de_donnée`. \
@@`champs1`,`nom_base_de_donnée`. `champ2` FROM `nom_base_de_donnée` \
 ORDER BY `nom_base_de_donnée `.`champ1`.`champ2` ASC', $rdbms);

Dans le SELECT, on sélectionne les différents champs, toujours en fonction de nom_base_de_donnée, ensuite dans le FROM, cela permet d'indiquer d'où on extrait les données et finalement avec le ORDER BY, on définit dans quel ordre on affiche les données issues de la base de données.

2.2.2.2.3 Création du tableau php où les données seront affichées

Pour générer ce tableau, un simple code est utile pour le réaliser.

$lignes = array('');
$colonnes = array('champ1', 'champ2');
#genererTable($lignes, $colonnes);

On sélectionne donc ici avec la fonction array d'abord les en-têtes des lignes (en l'occurrence, ici il n'y en a pas) puis, les en-têtes des colonnes. Ensuite on utilise la fonction #genererTable($lignes, $colonnes); qui nous permet de générer automatiquement un tableau. De plus, étant donné qu'aucune en-tête pour les lignes n'ont été entrées, le tableaux pourra alors imprimer autant de lignes que d'informations disponibles.

2.2.2.2.4 Sélection des champs de la base de donnée ainsi que l'ordre de l'affichage des données en fonction de la ligne

Pour sélectionner ces données, il s'agit d'utiliser le code suivant:

@@$results = mysql_query('SELECT `nom_base_de_données`.`id`, `champ1`,`nom_base_de_données`. `champs1`,`nom_base_de_données`. \
`champ2` FROM `nom_base_de_données`);
'ORDER BY `nom_base_de_donnée`.`champ2` DESC', $rdbms);

Il s'agit à peu de choses près du même code qu'au paragraphe 2.2.2.2.2, hors ici, le ORDER BY ordre les données pour les lignes en fonction du champs 2, de manière descendante; par exemple, si l'on veut ordrer par dates, de la plus récente à la plus ancienne, il fait utiliser cette fonction DESC.
Si dans la base de données, il y a plusieurs nom_base_de_données, il est possible de les faire communiquer en fonction de l'id (donne un numéro à chaque champs rempli dans la base de données). Pour ce faire, le code suivant est requis:

WHERE `nom_base_de_données_1 `.`id`=`nom_base_de_données_2 `.`id` 

Lorsque la base de données comportent deux à plusieurs lignes à afficher, il ne faut pas oublier d'inscrire ce code:

$row = mysql_fetch_assoc($results);

Celui-ci permet de dire au tableau php qu'à chaque fois qu'une nouvelle colonne de donnée doit être affichée dans le tableau, génère une nouvelle ligne. A noter que le $results permet de faire le lien entre la sélection des champs et cette fonction.

2.2.2.2.5 Imprimer les données dans le tableau

Il nous reste à afficher toutes les donnée dans le tableau. Pour ce faire,

print "<table>\n<tr><th>&nbsp;</th>"; 
foreach ($colonnes as $colonne) { 
    print "<th>$colonne</th>"; 
} 
    print "</tr>\n"; 
 
$numeroLigne = 0; 
 
//mysql_num_rows permet d'ajouter le nombre de  lignes en fonction du nombre de recensements 
for ($ligne = 1; $ligne <= mysql_num_rows($results)  ; $ligne++) { 
 
$numeroColonne = 0; 
 
    print "<tr>\n"; 
//sizeof calcule le nombre de colonnes nécessaires en fonction de $colonnes 
for ($colonne = 1; $colonne <= sizeof($colonnes); $colonne++){ 
print("<td>" . $row$colonnes[$colonne-1] . "</td>");   
} 
 
    print "</tr>\n"; 
$row = mysql_fetch_assoc($results);  
$numeroLigne++; 
}  
mysql_close();

Le code se trouvant ci-dessus permet l'affichage des données en lignes et colonnes. D'abord, on indique que la fonction $colonnes correspond à la fonction $colonne afin de pouvoir par suite calculer le nombre colonnes à afficher. Ensuite, on indique avec $ligne = 1; $ligne <= mysql_num_rows($results) ; $ligne++) qu'il faut imprimer autant de lignes qu'il a d'en-tête de champs dans la base de données.
On utilise la même marche à suivre pour les colonnes avec for ($colonne = 1; $colonne <= sizeof($colonnes); $colonne++).
Finalement, une dernière manoeuvre est requise. Il s'agit de fermer la connection mysql, soit la connection à la base de donnée dès lors que les données ont été inscrites dans le tableau.

mysql_close();

3. Résultat

Pour ce qui est du résultat du projet P, je pense que la meilleur façon est de l'observer par la consultation du site.
Lien pour accéder au site
Lien pour accéder au code source

4. Discussion

La réalisation de ce projet s'est très bien passée et c'est déroulée dans les temps. Aucun problème majeur n'a été rencontré lors de la réalisation que ce soit pour la mise en place du formulaire ainsi que pour la mise en place de la lecture des données des informations contenues dans la base de données.
Ce projet pourrait bien-sûr être dans le futur amélioré par l'ajout de nouvelles fonctions comme la visualisation géographique des points de recensements, ou la mise en place de sessions permettant de réduire le nombre de champs à remplir pour le formulaire. Malheureusement, le manque de temps ne m'a pas permis ajouter ces fonctions.
De plus, ce projet peut avoir un très grand nombre d'applications pour différents domaines outre les trains, tel que les voitures, avions mais aussi l'ornithologie. Ce projet n'est donc pas restreint à une seule problématique mais à une infinité, chacune dans un domaine différent.

5. Conclusion

Je pense pouvoir affirmer avoir réussi à réaliser mon projet P. Le site fonctionne en effet très bien.
De plus, ce projet ne risque pas de tomber dans les oubliettes. En effet, il est prévu en test de l'"ouvrir" tout bientôt à la population romande de ferrovipathes. Les fonctionnalités du sites pourront ainsi être testées par un grand nombre d'utilisateurs. Par la suite, il est prévu (si bien-sûr le test fonctionne) de l'"ouvrir" à toute la Suisse et de le traduire dans les trois langues nationales, permettant ainsi d'avoir un réel moteur de recherche et de recensement pour le matériel roulant suisse, cela n'existant pour l'instant pas.