logo

Types de blocs supplémentaires (EBT) – Nouvelle expérience de Layout Builder❗

Types de blocs supplémentaires (EBT) – types de blocs stylisés et personnalisables : diaporamas, onglets, cartes, accordéons et bien d’autres. Paramètres intégrés pour l’arrière-plan, la boîte DOM, les plugins JavaScript. Découvrez dès aujourd’hui le futur de la création de mises en page.

Démo des modules EBT Télécharger les modules EBT

❗Types de paragraphes supplémentaires (EPT) – Nouvelle expérience Paragraphes

Types de paragraphes supplémentaires (EPT) – ensemble de modules basé sur les paragraphes analogiques.

Démo des modules EPT Télécharger les modules EPT

Défilement

Leçons PHP - leçon 3.5 - Travail avec la base de données MySQL. Opérateur JOIN. Téléchargement de fichiers sur le serveur.

05/07/2025, by Ivan

Avant de commencer à écrire cette leçon, j’ai longuement réfléchi à la meilleure façon d’expliquer les requêtes avec l’opérateur JOIN. En effet, l’opérateur JOIN sert à effectuer une sélection à partir de plusieurs tables en même temps. Et comme une table supplémentaire est nécessaire, créons-la. Je propose de créer une table pour les fichiers que nous allons télécharger via un formulaire dans cette leçon. Cela fera une leçon à double orientation : travail avec la base de données et travail avec les formulaires.

Commençons par ajouter un champ pour le téléchargement de fichiers. Pour que le formulaire puisse accepter des fichiers, il faut ajouter un type de formulaire à ses paramètres :

$content .=	'<form action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">'; 

Ainsi, via le paramètre enctype, nous indiquons au navigateur que ce formulaire permettra de télécharger des fichiers. Maintenant que le formulaire est prêt, ajoutons un champ de téléchargement de fichier :

  public function display_admin() { // méthode pour saisir un message
	$content = '';
	
	$content .=	'<form action="' . $_SERVER['PHP_SELF'] . '" method="post" enctype="multipart/form-data">'; 
	$content .=	  '<label for="title">Nom :</label><br />';
	$content .=	  '<input name="title" id="title" type="text" maxlength="150" />';
	$content .=	  '<div class="clear"></div>';
	$content .=	  '<label for="bodytext">Message :</label><br />';
	$content .=	  '<textarea name="bodytext" id="bodytext"></textarea>';
	$content .=        '<input type="file" name="filename">'; // champ de téléchargement de fichier
	$content .=	  '<div class="clear"></div>';
	$content .=	  '<input type="submit" value="Ajouter un message" />';
	$content .=	'</form>';	
	$content .=	'<p><a href="/index.php">Retour à l’accueil</a></p>';

    return $content;
  }

Grâce à l’input de type file, nous allons pouvoir télécharger notre fichier. Si vous sauvegardez les fichiers et rechargez la page d’ajout de message, un champ de téléchargement de fichier devrait apparaître.

Voyons maintenant comment le fichier est transmis dans la requête POST.

  public function write($p) { 
	print_r($p); // affichons le tableau du formulaire
	print_r($_FILES); // affichons le tableau des fichiers
    $sql = 'INSERT INTO Messages (title, bodytext, created) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ')';
    return mysql_query($sql);
  } 

Maintenant, téléchargeons un fichier quelconque et sauvegardons le message. Tous les fichiers téléchargés via le formulaire sont accessibles dans la superglobale $_FILES. J’ai téléchargé un fichier et obtenu les tableaux suivants :

Array ( 
  [title] => asfasdf 
  [bodytext] => asfasdf 
) 
Array ( 
  [filename] => Array ( 
    [name] => ip.txt 
    [type] => text/plain 
    [tmp_name] => Y:\tmp\phpAA.tmp 
    [error] => 0 
    [size] => 13 
   ) 
) 

Maintenant que nous avons le tableau des données et du fichier, créons une table pour les fichiers afin de stocker les fichiers téléchargés. Commençons par créer un dossier files à la racine de notre site et, si vous êtes sous Linux ou sur un hébergement, donnez les droits 777 à ce dossier afin que notre script puisse y enregistrer les fichiers.

Modifions la requête de création des tables dans la méthode buildDB() :

$sql = "CREATE TABLE Messages
(
mid int NOT NULL AUTO_INCREMENT,
PRIMARY KEY(mid),
title varchar(15),
bodytext text,
created  int(11),
file int(11),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
CREATE TABLE Files
(
fid int NOT NULL AUTO_INCREMENT,
PRIMARY KEY(fid),
filename varchar(255),
filepath varchar(255),
filemime varchar(255),
filesize int(10),
timestamp int(10),
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;";

En plus de la nouvelle table, nous ajoutons un champ fid qui sera une clé étrangère vers la table des fichiers. La nouvelle table Files aura les champs suivants :

fid – la clé primaire de la table, l’identifiant du fichier.

filename – le nom du fichier.

filepath – le chemin vers le fichier depuis la racine du site.

filemime – le type MIME du fichier, pour déterminer son extension et son usage (par exemple pour les fichiers texte c’est text/plain, pour les images ça peut être image/jpg, image/png).

filesize – la taille du fichier en octets.

timestamp – la date de téléchargement du fichier.

Écrivons maintenant la sauvegarde du fichier et la requête d’insertion dans la base de données. Vous pouvez créer les champs nécessaires via phpMyAdmin.

 if($_FILES["filename"]["size"] > 1024*3*1024)
   {
     echo ("La taille du fichier dépasse trois mégaoctets");
     exit;
   }
   // Vérifions si le fichier a été téléchargé
   if(is_uploaded_file($_FILES["filename"]["tmp_name"]))
   {
     // Si le fichier a été téléchargé avec succès, on le déplace
     // du dossier temporaire vers le dossier final
     move_uploaded_file($_FILES["filename"]["tmp_name"], "/files/".$_FILES["filename"]["name"]);
   } else {
      echo("Erreur lors du téléchargement du fichier");
   }

Ainsi, nous sauvegardons le fichier dans le dossier files. Maintenant, après un téléchargement réussi, insérons une requête pour ajouter l’entrée dans la table Files :

$sql = 'INSERT INTO Files (filename, filepath, filemime, filesize, timestamp) 
VALUES ("'. $_FILES['filename']['name'] . '",
"files/' . $_FILES['filename']['name'] . '",
"'. $_FILES['filename']['type'] .'",
'. $_FILES['filename']['size'] .',
'. time() . ')';  

mysql_query($sql);   

Maintenant que nous avons inséré l’enregistrement du fichier dans la base, il faut aussi insérer le message. La requête d’insertion du message est légèrement modifiée pour ajouter le champ fid :

   $sql = 'INSERT INTO Messages (title, bodytext, created, fid) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ',LAST_INSERT_ID())';

Notez la fonction last_insert_id(), c’est une fonction MySQL qui retourne le dernier ID inséré dans une quelconque table de la base. Dans notre cas, la dernière requête insérait un enregistrement dans la table Files, donc l’ID retourné provient de la table Files.

Les enregistrements sont maintenant insérés dans les tables, il reste à les afficher avec l’opérateur JOIN. Modifions la requête d’affichage des messages pour afficher aussi le nom du fichier :

  public function display_public() { // méthode d’affichage des messages
    $content = '';
	$sql = 'SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid ORDER BY mid DESC';
	$result = mysql_query($sql) or die(mysql_error());  
...

J’utilise ici l’opérateur JOIN avec LEFT. En effet, il existe différentes façons d’unir les tables pour une sélection, et dans une prochaine leçon nous verrons plus en détail l’utilisation de JOIN. Pour l’instant, retenez que LEFT JOIN affiche toutes les entrées, y compris celles où le champ fid est nul.

Si nous affichons maintenant le tableau de la requête :

  public function display_public() { // méthode d’affichage des messages
    $content = '';
	$sql = 'SELECT * FROM Messages LEFT JOIN Files ON Messages.fid=Files.fid ORDER BY mid DESC';
	$result = mysql_query($sql) or die(mysql_error());  
	while($row = mysql_fetch_array($result)){ // la variable résultat doit être traitée par la fonction mysql_fetch_array()
	  print_r($row);

Nous verrons que les données sont affichées à la fois depuis la table Messages et la table Files. Si un fichier correspondant n’existe pas, les champs associés seront vides. Il faut donc vérifier ces champs avant de les utiliser.

	  if(!empty($row['filename'])){
	    $content .= '<p>Pièce jointe : <a target="_blank" href="/'. $row['filepath'] .'">'. $row['filename'] .'</a></p>';
	  }

Ainsi, avec le message, sera affichée une pièce jointe sous forme de lien vers le fichier téléchargé. Dans la leçon suivante, nous étudierons plus en détail le merveilleux opérateur JOIN qui permet d’afficher les données provenant de plusieurs tables en même temps. Je fournirai aussi un dump actualisé de la base réalisé via phpMyAdmin.