Bonsoir !

Je crée actuellement un site internet et j'aimerais ajouter les photos de profil. Cependant, je me pose une question, comme je ne veux pas enregistrer les images directement dans la base de donnée, je les enregistre dans un dossier en local. Si par exemple, 10 000 utilisateurs ont une photo de profil, il y aura 10 000 images dans mon dossier, ce n'est pas grave s'il y a autant d'images dans mon dossier ?
Modérateur
Bonjour,

Pourquoi tu ne pourrais pas enregistrer tes photos dans ta base de données ?

Amicalement,

PS: tu as déjà posté plusieurs questions sur ce forum, mais tu n'indiques pas si les réponses qu'on t'a données ont résolu ton problème ou pas. Ce serait bien que tu le fasses
Bonjour,
[quote=parsimonhi]Bonjour,

Pourquoi tu ne pourrais pas enregistrer tes photos dans ta base de données ?

--> Et donc passer par un blob ?
Modérateur
Bonjour,
comar91 a écrit :
--> Et donc passer par un blob ?

On peut en effet stocker les images dans un champ de type "blob" (ou "longblob" si ce sont des grosses images).

On peut aussi les stocker dans un champ de type "text" (ou "longtext") au format data:image + base64 (probablement moins efficace).

Amicalement,
Modérateur
Bonjour,

Voici un exemple.

On suppose que :
- la base s'appelle "test"
- on peut y accéder avec un utilisateur qui s'appelle "test"
- le mot de passe de l'utilisateur "test" est "test"
- la base contient une table "etudiants" avec les champs "nom", "prenom" et "avatar"
- les champs "nom" et "prenom" sont de type varchar(50)
- le champ avatar est de type "blob", dans lequel on met une image png
On remplie la table "test" de la base en utilisant phpmyadmin
On suppose qu'on y a mis au moins un etudiant avec un id valant 5
On enregistre le script dans un fichier appelé "resume.php"
On peut alors afficher dans un navigateur les données relatives à l'étudiant via :
resume.php?id=5

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
img{width:256px;border:1px solid #000;}
</style>
</head>
<body>
<main>
<h1>Profil</h1>
<?php
$ok=false;
function safe_id($id)
{
	if(isset($id)&&preg_match("/^[0-9]+$/",$id)) return $id;
	return -1;
}
$id=safe_id($_GET['id']);
if($id>=0)
{
	$db_sn='mysql:dbname=test;host=localhost';
	$db_user="test";
	$db_pwd="test";
	$db=new PDO($db_sn, $db_user, $db_pwd);
	if($db)
	{
		$query = "SELECT * FROM etudiants WHERE id=?";
		$select = $db->prepare($query);
		if ($select)
		{
			if ($select->execute(array($id)))
			{
				$s = $select->fetch(PDO::FETCH_OBJ);
				if ($s)
				{
					echo $s->nom." ".$s->prenom." !<br>";
					if($s->avatar)
					{
						$img=base64_encode($s->avatar);
						echo "<img src='data:image/png;base64,".$img."'>";
					}
					$ok=true;
				}
			}
		}
	}
}
if(!$ok) echo "Argh!";
?>
</main>
</body>
</html>

Amicalement,
Meilleure solution
Bonsoir,

Merci beaucoup, cependant, les images ne prennent pas trop de place dans la base de donnée ? Si je prends un hébergement, je n'ai pas envie d'atteindre la limite rapidement.
Modifié par heraclys (19 Jan 2021 - 16:12)
Modérateur
Bonjour,

Il faudrait calculer. Tu multiplies la taille moyenne de tes images par ton nombre d'images. Tu compare ça à la place que ton hébergeur t'accorde pour ta base de données. Il n'y a que toi qui peut répondre pour ces questions de tailles consommées versus place disponible !

Si c'est trop gros, retour à la méthode des fichiers. Tu peux en avoir 10000 dans un dossier, mais tu peux aussi répartir tes images dans plusieurs dossiers, par exemple A, B, C ... Z, et tu ranges les photos des gens dans le dossier correspondant à la 1re lettre de leur nom ou de leur pseudo.

Ceci étant, tu peux être aussi (et surtout) limité par la taille disponible sur disque. Tout ça dépend de la solution d'hébergement que tu as.

10 000 images à 100 ko, ça fait quand même 1 Go seulement pour ces images, ce n'est pas petit, que ce soit dans une base de données ou sur disque.

Amicalement,