Exemple de site avec base de données
[Mise à jour, 3 octobre 2012 : le site exemple n'est momentanément plus accessible. Je vais essayer d'y remédier]
Les tables
Fichier photobase-create.sql
DROP TABLE IF EXISTS photobase_users;
CREATE TABLE IF NOT EXISTS photobase_users (
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(256) NOT NULL DEFAULT ''
) DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS photobase_photos;
CREATE TABLE IF NOT EXISTS photobase_photos (
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
upload TIMESTAMP,
owner INT(4)
) DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS photobase_comments;
CREATE TABLE IF NOT EXISTS photobase_comments (
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
photo INT(4),
author INT(4),
comment TEXT
) DEFAULT CHARSET=utf8;
Fichier photobase-insert.sql
INSERT INTO photobase_users (name) VALUES
('alain b'),
('hbl'),
('binto'),
('iciautrement'),
('donkeykong donkeypix'),
('stok'),
('philippineroyer'),
('artyu'),
('mister blast7'),
('bcommebenedicte'),
('or2k'),
('zespinal'),
('ouranos'),
('miloo phototruc'),
('lomosapiens'),
('leprive')
;
INSERT INTO photobase_photos (upload, owner)
VALUES
(20100314, 1),
(20100315, 1),
(20100316193210, 1),
(20100316201403, 1),
(20100401102002, 2),
(20100401102132, 2),
(20100401102345, 2),
(20100401, 3),
(20100401, 3),
(20100401, 3),
(20100402, 3),
(20100403, 3),
(20100310, 4),
(20100313, 4),
(20100322, 4),
(20100322, 4),
(20100403, 4)
;
INSERT INTO photobase_comments (photo, author, comment)
VALUES
(1, 2, 'très jolie photo !'),
(1, 1, 'merci binto lol'),
(5, 1, 'lol'),
(5, 3, 'mdrrrrrrr')
;
A retenir : mysql_query
, mysql_fetch_assoc
.
...
<body>
<?php include 'photobase-menus.php'; ?>
<h1>Bienvenue sur photobase</h1>
<h2>Utilisateurs du service</h2>
<?php affiche_utilisateurs(); ?>
</ul>
</body>
La fonction se fait en trois temps.
1. Récupération des utilisateurs dans la base.
function get_users()
{
global $connexion; // on verra plus tard où est définie cette variable
$request = 'SELECT * FROM photobase_users';
return mysql_query($request, $connexion);
}
La chaîne SELECT * FROM photobase_users est une requête mysql, en langage sql, donc pas en php. Elle est envoyée à la base par la fonction php mysql_query.
2. Récupération des entrées renvoyées par la base
function affiche_utilisateurs()
{
$users = get_users();
echo '<ul id="users">';
while($user = mysql_fetch_assoc($users))
affiche_utilisateur($user);
echo '</ul>';
}
Chaque appel à la fonction php mysql_fetch_assoc extrait une nouvelle entrée dans le résultat renvoyé par la fonction mysql_query, et est évalué à faux quand il n’y a plus d’entrée à lire.
Il ne nous reste plus qu’à écrire la fonction d’affichage d’un utilisateur.
3. Affichage d’un utilisateur
function url_user($user)
{ return "user.php?id=" . $user['id']; }
function affiche_utilisateur($user)
{
echo '<li>'
. '<a href="' . url_user($user) . '">'
. $user['name']
. '</a>'
. "</li>\n";
}
La page d’un utilisateur (user.php
)
Le début du fichier (avant d’écrire quoi que ce soit, y compris le doctype).
Encore mysql_fetch_assoc
.
<?php
require_once 'connect-photobase.php';
if(!isSet($_GET['id']))
header('Location: index.php'); // redirige sur la page d'accueil
else
{
$user_id = $_GET['id'];
$request = "SELECT name FROM photobase_users WHERE id=$user_id";
$res = mysql_query($request, $connexion);
$tab = mysql_fetch_assoc($res);
$name = $tab['name'];
}
?>
Les fonctions pour l’affichage des photos vignettes :
function photo_id_to_tiny_filename($id)
{
return "Img/tiny-$id.jpg";
}
function photolink($id)
{
return
'<a href="photo.php?id='
. $id
. '">'
. '<img src="'
. photo_id_to_tiny_filename($id)
. '" alt="'
. $id
. '"/>'
. '</a>'
;
}
La page elle-même.
A retenir : mysql_num_row
<?php include 'photobase-menus.php'; ?>
<h1>Bienvenue sur la photobase de
<?php
echo $name;
?>
</h1>
<?php
$request = 'SELECT id FROM photobase_photos '
. " WHERE owner=$user_id ORDER BY upload DESC";
// attention à l'espace quand on coupe la chaîne !!
$photos = mysql_query($request, $connexion);
$nb = mysql_num_rows($photos);
echo "<p>$name a $nb photos.</p>\n";
if($nb > 0)
{
echo '<table class="vignettes">';
$done = 0;
while($photo = mysql_fetch_assoc($photos))
{
if($done % 2 == 0) echo '<tr>';
echo '<td>' . photolink($photo['id']) . "</td>\n";
if($done % 2 == 1) echo "</tr>\n";
$done++;
}
echo "</table>\n";
}
?>
Connexion à la base
La variable $connexion est définie dans le fichier connect-photobase
ci-dessous (j’ai bien entendu supprimé les paramètres de ma base). Il doit donc être inclus avant les fonctions qui l’utilisent (par exemple au tout début du fichier, pour pouvoir rediriger sur une autre page en cas d’erreur de connexion).
<?php
define('SERVER', '...');
define('USER', '...');
define('PSSWD', '...');
define('BASE', '...');
$connexion = mysql_pconnect(SERVER, USER, PSSWD);
if (!$connexion) {
echo 'Pas de connexion au serveur.';
exit;
}
if (!mysql_select_db(BASE, $connexion)) {
echo 'Pas d\'accès à la base.';
exit;
}
?>
[Mise à jour, 3 octobre 2012 : j'ai modifié les pseudos de sorte qu'ils ne soient pas directement les pseudos des utilisateurs de Flickr que j'ai pris comme base de départ pour le site]