« SPARQL Protocol and RDF Query Language/Travail pratique/PHP avec MySQL » : différence entre les versions

Contenu supprimé Contenu ajouté
Page créée avec « {{ébauche informatique}} {{Travail pratique | titre = MySQL | titre_leçon = La programmation PHP | idfaculté = informatique | leçon = [[SPARQL Protocol a... »
 
Aucun résumé des modifications
Ligne 13 :
 
== Introduction ==
Dans ce TP, nous allons enregistrer nos CV dans la base de données MySQL que nous avons créé dans le [[SPARQL Protocol and RDF Query Language/Travail pratique/Initiation à MySQL|TP Initiation à MySQL]]
Dans ce TP, nous allons acquérir quelques bases de programmation PHP.
 
Ce TP a pour objectif de pouvoircomprendre traitercomment desune base données plusest facilementutilisée par laun langage comme PHP pour pouvoir appliquer cette méthode avec suiteSPARQL.
 
=== Durée du TP ===
Ligne 25 :
 
== A savoir pour commencer ==
Pour rappel:
*le code HTML ne sert qu'à l'affichage.
*Le code PHP sert à créer un HTML dynamique
 
Cependant, PHP n'a pas le "pouvoir" de mémoriser des données entre deux chargements de page
en dehors de celles que vous transmettez à chaque fois d'une page web à l'autre, via un formulaire HTML !...
 
Si vous voulez conserver sur la durée les données entrées par les visiteurs de votre site via votre formulaire, de façon automatique et sans plus vous occuper de rien, il va falloir intégrer des notions des bases de données.
 
Pour ce TP, nous allons voir :
*
Ligne 30 ⟶ 39 :
Nous allons rapidement aborder chacun de ces points.
 
==TP Base de données==
 
De même que PHP vous permet de créer un langage HTML plus dynamique et personnalisé, il permettra aussi de créer vos requêtes SQL de façon à automatiser l'alimentation de vos bases.
 
Pour le démontrer, nous allons créer un formulaire qui permettra de stocker les CV dans votre BDD.
 
===Connexion===
 
====Configurer la connexion====
On met les paramètres de connexion dans une fonction dans un fichier fonction par exemple :
<source lang="php">
<?php
function connectMaBase(){
$base = mysql_connect ('localhost', 'root', 'VOTRE_MOT_DE_PASSE');
mysql_select_db ('moncv', $base) ;
}
?>
</source>
*Remplacer VOTRE_MOT_DE_PASSE par votre mot de passe.
*$base prépare la commande de connexion à votre base avec
**le nom du serveur (ici localhost),
**le nom de l'utilisateur (ici root qui signifie administrateur de votre propre base locale)
**Et enfin le mot de passe.
*La ligne suivante lance la commande de sélection de votre base (où l'on entre donc le nom de votre base), puis on reprend la variable qui contient toute la commande de connexion...
 
====Ouvrir la connexion====
Pour convoquer la fonction, il vous faudra
#sur form.php faire un include du fichier fonctions.php,
#lancer la fonction au moment opportun par la ligne suivante :
<source lang="php">
<?php
connectMaBase()
</source>;
 
====Fermer la connexion====
Quand on rédige une commande SQL via PHP, on procède ainsi :
#On se connecte à la base (en utilisant notre fonction de connexion).
#On prépare la commande sql en la stockant dans une variable PHP du type $sql
#On l'exécute.
#On ferme la connexion avec la commande suivante
<source lang="php">
<?php
// on ferme la connexion
mysql_close();
?>
</source>;
 
===Insérer des données===
Dans le fichier php qui traite un formulaire, on écrit une insertion :
<source lang="php">
<?php
//On récupère les valeurs entrées par l'utilisateur :
$pseudo=$_POST['pseudo'];
$age=$_POST['age'];
$sexe=$_POST['sexe'];
//On créée une variable date du jour grâce à la fonction date() de PHP
$today = date("d.m.y");
//On se connecte
connectMaBase();
//On prépare la commande sql d'insertion
$sql = 'INSERT INTO Utilisateurs VALUES("","'.$pseudo.'","'.$sexe.'","'.$age.'","'.$today.'")';
/*on lance la commande (mysql_query) et au cas où,
on rédige un petit message d'erreur si la requête ne passe pas (or die)
(Message qui intègrera les causes d'erreur sql)*/
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
// on ferme la connexion
mysql_close();
?>
</source>
 
La partie la plus complexe pour vous est probablement la création de la requête SQL :
<source lang="php">
<?php
//On prépare la commande sql d'insertion
$sql = 'INSERT INTO Utilisateurs VALUES("","'.$pseudo.'","'.$sexe.'","'.$age.'","'.$today.'")';
?>
</source>
*La première valeur est laissée en blanc car c'est l'ID auto-incrémenté...
*Si vous l'oubliez, ce blanc, il vous renverra un message d'erreur sql disant que le nombre de données insérées ne coïncident pas avec le nombre de champs...
*Ensuite il faut gérer au sein des guillemets simples (apostrophes) tout ce qui est PHP
*au sein des guillemets doubles tout ce qui est sql...
*On place les guillemets au sein des apostrophes pour les afficher dans le sql, on place les variables 'nues' dans PHP.
 
'''Exercice :''' SANS COPIER COLLER, vous allez :
*Reprendre votre projet Eclipse pour que le CV soit enregistré dan votre nouvelle BDD.
*Pour récupérer l ’ID généré après un insert SQL utiliser la fonction : mysql_insert_id()
*N’oubliez pas tester, tester, tester...après chaque ajout dans le code.
*Si vous ne trouvez pas l’erreur, utilisez les commentaires et le débuggeur
{{solution|contenu=
Avec la nouvelle fonction connectMaBase, voici le fichier fonctions.php :
<source lang="php">
<?php
function connectMaBase(){
$base = mysql_connect ('localhost', 'testuser', 'mSBGJGxVDv7SmzQV');
mysql_select_db ('moncv', $base) ;
}
 
function createArrayExperiences($arrayExperiences){
//Crée le tableau où chaque ligne sera une expérience
$nbExperience = count($arrayExperiences['poste']);
$newArray = array();
for($i = 0; $i < $nbExperience; $i++){
$newExperience = array();
foreach($arrayExperiences as $index=>$subarray){
if ($index!='valider'){
$newExperience[$index] = $subarray[$i];
}
}
$newArray[] = $newExperience;
}
return $newArray;
}
 
function afficheExperiences($arrayExperiences){
//Affiche les expériences
foreach ($arrayExperiences as $experience){
afficheExperience($experience);
}
}
 
function afficheExperience($arrayExperience){
//print_r($arrayExperience);
if ($arrayExperience['poste_actuel'] == 'on'){
echo '<b>Depuis le '.$arrayExperience['date_debut'].'</b>';
}else{
echo '<b>Du '.$arrayExperience['date_debut'].' au '.$arrayExperience['date_fin'].'</b>';
}
echo ' : ';
echo '<b>'.$arrayExperience['poste'].' ('.$arrayExperience['societe'].')</b><br/>';
echo '<b>'.nl2br($arrayExperience['description']).'</b><br/>';
echo 'Mots clés : <b>'. implode(', ',explode(' ',$arrayExperience['mots_cles'])) .'</b><br/><br/>';
}
 
</source>
 
Et voici les modification du fichier monCV.php pour l'enregistrement des CVs :
<source lang="php">
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title>Mon CV</title></head>
<body>
<?php
include('functions.php');
//Initialisation des variables
if(isset($_POST['valider'])){
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$adresse = $_POST['adresse'];
$code_postal = $_POST['code_postal'];
$ville = $_POST['ville'];
$telephone = $_POST['telephone'];
$arrayExperiences = array();
$arrayExperiences['date_debut'] = $_POST['date_debut'];
$arrayExperiences['date_fin'] = $_POST['date_fin'];
$arrayExperiences['poste'] = $_POST['poste'];
$arrayExperiences['societe'] = $_POST['societe'];
$arrayExperiences['description'] = $_POST['description'];
$arrayExperiences['mots_cles'] = $_POST['mots_cles'];
$arrayExperiences['poste_actuel'] = $_POST['poste_actuel'];
// On crée le tableau d'expériences
$experiences = createArrayExperiences($arrayExperiences);
 
//On se connecte
connectMaBase();
//On prépare la commande sql d'insertion pour la table CVs
$sql = 'INSERT INTO `CV`.`CVs` (`ID`, `nom`, `prenom`, `adresse`, `code_postal`, `ville`, `telephone`)
VALUES (NULL, "'.$nom.'", "'.$prenom.'", "'.$adresse.'", "'.$code_postal.'", "'.$ville.'", "'.$telephone.'")';
 
/*on lance la commande (mysql_query) et au cas où,
on rédige un petit message d'erreur si la requête ne passe pas (or die)
(Message qui intègrera les causes d'erreur sql)*/
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
//récupére la clé du CV pour l'associer aux expériences
$last_CV_ID = mysql_insert_id();
foreach ($experiences as $experience){
$posteactuel = $experience['poste_actuel'] == 'on';
//On prépare la commande sql d'insertion pour la table Experiences
$sql = 'INSERT INTO `CV`.`Experiences` (`ID`, `ID_CV`, `date_debut`, `date_fin`, `poste`, `societe`, `description`, `mots_cles`, `poste_actuel`)
VALUES (NULL, "'.$last_CV_ID.'", "'.$experience['date_debut'].'", "'.$experience['date_fin'].'", "'.$experience['poste'].'", "'.$experience['societe'].'","'.$experience['description'].'", "'.$experience['mots_cles'].'", "'.$posteactuel.'")';
/*on lance la commande (mysql_query) */
mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
}
// on ferme la connexion
mysql_close();
}
//affichage
?>
<b><?php echo $nom.' '.$prenom; ?></b><br/>
<b><?php echo $adresse; ?></b><br/>
<b><?php echo $code_postal.' '.$ville; ?></b><br/>
Tel : <b><?php echo $telephone; ?></b><br/>
<br/>
Expériences : <br/>
<hr/>
<?php
//print_r($arrayExperiences);
afficheExperiences($experiences);
?>
</body>
</html>
</source>
}}
 
===Afficher des données===
On a déjà utilisé la syntaxe sql d'une simple requête pour récupérer des données dans un TP précédent:
<source lang="sql">
SELECT * FROM CVs WHERE nom= "Toto"
</source>
*pour récupérer tous les CVs concernant Toto par exemple.
 
Pour chaque CV, PHP va nous envoyer plusieurs infos (l'ID, le prénom, l’adresse...). Chaque enregistrement récupéré de ma base sera dans un tableau pour PHP.
 
On va utiliser la fonction PHP destinée à mysql :
<source lang="php">
mysql_fetch_array($TrucRecupereSurSql)
</source>
 
'''On récupère un tableau associatif qui a pour indice: le nom de chaque champ.'''
 
Voici la méthode pour afficher des données depuis une base de données :
#On se connecte à la base (en utilisant une fonction de connexion).
#On prépare la commande sql en la stockant dans une variable PHP du type $sql (pour langage sql).
#On la lance, en récupérant le résultat dans une variable que nous appellerons $req (pour requete sql et qui pourra être un tableau si le résultat dépasse un élément).
#Si c'est un tableau : On scanne $req avec une boucle while (car on ne sait pas toujours le nombre de champs, ni d'enregistrements envoyer par notre base de données)
##A chaque itération la fonction mysql_fetch_array($req) instancie la variable $data
##chaque champ de l'enregistrement est accessible via la commande : $data['champ']
#Maintenant qu'on a tout récupéré dans des variables PHP, on libère la mémoire sql mobilisée par cette requête.
#On ferme la connexion sql.
 
Exemple :
<source lang="php">
 
<?php
include("fonctions.php");
?>
<html><body>
<?php
connectMaBase(); //On se connecte
$sql = 'SELECT * FROM utilisateurs WHERE sexe="F"'; // On prépare la requête
// On lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
//on organise $req en tableau associatif $data['champ']en scannant chaque enregistrement récupéré
echo'<h2>TOUTES LES FILLES INSCRITES :</h2>';
while ($data = mysql_fetch_array($req)) { //boucle
// on affiche les résultats
echo 'Pseudo : <strong>‘. $data['Pseudo'] .'</strong><br />';
echo 'Son âge : '.$data['Age'].'<br />';
echo 'Sa date d\'inscription : '.$data['DateInscription'].'<br /><br/>';
}
//On libère la mémoire mobilisée pour cette requête dans sql $data de PHP lui est toujours accessible !
mysql_free_result ($req);
//On ferme sql
mysql_close ();
?>
</body></html>
</source>
 
===Rechercher des données===
Vous souhaitez laisser à l'utilisateur le choix de son critère de recherche :
*Un utilisateur entre dans un formulaire les critères choisis, et votre code fait le reste.
 
Cela signifie que l'on veut obtenir une variable $sql du type :
<source lang="php">
$sql = 'SELECT * FROM utilisateurs WHERE '.$champ.' ="'.$critere.'"';
</source>
*Il faut pouvoir proposer un formulaire où l'utilisateur entrera son choix de champ et de critère...
*Il faut donc construire la liste de champs sous forme de liste déroulante en "tapant" dans la base une première fois : car l’utilisateur n'est pas censé connaître la BDD
 
<source lang="php"><!-- Commentaires HTML
On construit une liste déroulante ( un select et plusieurs options)
Chaque option sera remplie par une donnée SQL récupérée par notre requête PHP
-->
<form method="post" action="admin.php">
<select name="champ">
<?php
connectMaBase(); //On se connecte
$sql = 'Show fields from utilisateurs'; //On prépare la requête SQL qui récupère les champs
/* On lance la requête (mysql_query) et on impose un message d'erreur si la requête ne passe pas (or die) */
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
//On scanne le résultat et on construit chaque option avec
while($data = mysql_fetch_array($req)){
echo '<option name="'.$data['Field'].'">'.$data['Field'].'</option>'; // on affiche chaque champ
}
mysql_free_result ($req); //On libère mysql de cette première requête
?>
<!-- On ferme le select -->
</select>
Entrez votre critère de sélection sur ce champ : <input type="text" name="critere"/>
<input type="submit" name="Valider" value="OK"/>
</form>
<!-- On ferme le formulaire -->
</source>
 
Exercice : Vous allez maintenant faire une page pour rechercher un CV. Dans une page PHP index.php, vous allez :
*Faire le formulaire :
<source lang="text">
Rechercher dans [liste champs]|V| [________] [Chercher]
[liste champs]|V| est un champ Select qui contient la liste des champs de la table Expériences.
[________] est un champ texte
[Chercher] bouton pour lancer la recherche
</source>
*Vous afficherez les résultats en dessous du formulaire sous forme de lien pour afficher le CV correspondant
**Pour faire une recherche dans un texte vous devrez utiliser non pas une égalité en SQL mais la fonction LIKE comme ci-dessous :
<source lang="php">
$sql = 'SELECT * FROM Experiences WHERE '.$champ. ' LIKE "%'.$critere. '%"';
</source>
 
{{solution|contenu=
Voici le fichier index.php :
<source lang="php">
<html>
<head>
<title>Mon CV</title>
</head>
<body>
<a href="formMonCV.html">Créer un nouveau CV</a><br/>
<h2>Chercher un CV :</h2>
<form method="post" action="index.php">
Rechercher dans
<select name="champ">
<?php
include('functions.php');
connectMaBase(); //On se connecte
$sql = 'Show fields from Experiences'; //On prépare la requête SQL qui récupère les champs
/* On lance la requête (mysql_query) et on impose un message d'erreur si la requête ne passe pas (or die) */
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
//On scanne le résultat et on construit chaque option avec
while($data = mysql_fetch_array($req)){
if(! preg_match("/ID/",$data['Field']) )
echo '<option name="'.$data['Field'].'">'.$data['Field'].'</option>'; // on affiche chaque champ
}
mysql_free_result ($req); //On libère mysql de cette première requête
 
 
?>
<!-- On ferme le select -->
</select>
<input type="text" name="critere"/>
<input type="submit" name="valider" value="Chercher"/>
<br/>
</form>
 
<?php
//Initialisation des variables
if(isset($_POST['valider']) && $_POST['critere'] != ''){
$champ = $_POST['champ'];
$critere = $_POST['critere'];
$sql = 'SELECT DISTINCT CVs.ID, nom, prenom FROM CVs, Experiences WHERE CVs.ID = Experiences.ID_CV AND Experiences.'.$champ.' LIKE "%'.$critere.'%"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
//On scanne le résultat et on construit la liste des candidats
echo 'Liste des candidats :<br/>';
while($data = mysql_fetch_array($req)){
echo '<a href="javascript:alert(\'Faire : Afficher un CV !\')">'.$data['ID'].' '.$data['nom'].' '.$data['prenom'].'</a><br/>';
}
mysql_free_result ($req); //On libère mysql de cette première requête
}
//On se deconnecte
mysql_close();
?>
 
 
</body>
</html>
</source>
}}
 
[[Catégorie:SPARQL Protocol and RDF Query Language]]