MySQL: Wie Profilbild in Datenbank abbilden?

_hq_

Grünschnabel
Hallo,

ich arbeite an einer kleinen Website, auf welcher es angemeldeten Benutzern möglich ist Kommentare abzugeben. Als neues Feature möchte ich, dass Benutzer ein kleines Profilbild hochladen können. Das Upload-Script inklusive Bildprüfung habe ich generell fertig, allerdings weiß ich nicht, wie ich das Profilbild in meiner Datenbank abbilden soll:

/*****Tabelle "benutzer" (vereinfacht)*****/
create table benutzer (
benutzer_id int unsigned not null auto_increment primary key,
benutzer_name char(20) not null unique,
vorname char (40) not null,
nachname char (40) not null,
email char(40) not null unique,
passwort char(40) not null
);

Ich könnte die Bilder beim Upload automatisch nach der benutzer_id benennen (z.B.: 125.jpg für den Benutzer mit der ID 125) und in einer neuen Spalte abbilden, ob ein Profilbild vorhanden ist oder nicht. Allerdings möchte ich nicht, dass die Benutzer ihre IDs kennen. Hat jemand eine Idee?

Vielen Dank!
 
Generiere eine Zufallszahl als File-Name und speichere diese in eine Spalte. Ist eine Zahl vorhanden, hat der User auch in Bild.
 
Das ging aber schnell, danke! Soll ich diese Zufallszahl (zb. 349384 für 349384.jpg) in einer eigenen Tabelle speichern?

create table profilbild (
benutzer_id int unsigned not null primary key references benutzer(benutzer_id),
benutzer_bild int unsigned not null
);

Oder ist eine neue Spalte - die auch NULL sein kann - in der Tabelle benutzer sinnvoller?
 
Nimm einfach einen Hash der Benutzer ID. Dann brauchst du keine besondere Tabelle oder sonstiges und der Nutzer kennt seine ID nicht.


PHP:
hash_hmac('sha256', 'ID des Benutzers', 'ein geheimer Schlüssel');
 
Ich hätte dasselbe vorgeschlagen wie CPoly. Du musst aber auf jeden Fall ein neues Feld hinzufügen, im Falle, dass es unterschiedliche Dateiendungen gibt. Wenn du z.B. nur .png zulässt, könntest du sogar darauf verzichten, insofern du eine einheitliche Namensgebung hast. Du müsstest dann nur prüfen, ob eine Datei mit dem Hashcode der ID vorhanden ist und es dann ausgeben.
Ansonsten gibt es noch mehrere Möglichkeiten:
1) ID + aktuellen Timestamp zusammenrechnen
2) ID mit dem aktuellen Timestamp multiplizieren
3) ID zum Quadrat nehmen
4) aktuellen Timestamp verwenden (unwahrscheinlich, dass zwei Benutzer gleichzeitig ein Avatar hochladen) - gegebenen Falls bisschen mit ihm spielen

bisschen erfinderisch sein. :) Sollten halt keine mega langen Namen entstehen... ist aber Geschmackssache!
 
Das ging aber schnell, danke! Soll ich diese Zufallszahl (zb. 349384 für 349384.jpg) in einer eigenen Tabelle speichern?

create table profilbild (
benutzer_id int unsigned not null primary key references benutzer(benutzer_id),
benutzer_bild int unsigned not null
);

Oder ist eine neue Spalte - die auch NULL sein kann - in der Tabelle benutzer sinnvoller?

Neue Spalte.
 
Nimm einfach einen Hash der Benutzer ID. Dann brauchst du keine besondere Tabelle oder sonstiges und der Nutzer kennt seine ID nicht.


PHP:
hash_hmac('sha256', 'ID des Benutzers', 'ein geheimer Schlüssel');

Das ist eine gute Idee. Ich habe deinen Vorschlag soeben probiert, allerdings bekomme ich jetzt Dateinamen mit 64 Zeichen. Gibt es einen Algorithmus mit einer kürzeren Ausgabe und nach Möglichkeit nur mit Ziffern?

Wenn du z.B. nur .png zulässt, könntest du sogar darauf verzichten, insofern du eine einheitliche Namensgebung hast. Du müsstest dann nur prüfen, ob eine Datei mit dem Hashcode der ID vorhanden ist und es dann ausgeben.

file_exits() ist dann wohl das Mittel der Wahl. Ich nehme - deinem Schreiben nach zu Urteilen - an, dass es keine Nachteile gegenüber einer Datenbankabfrage gibt. Danke auch für die restlichen Vorschläge.


Danke für den Hinweis. Mir gefällt die Idee mit dem Hash Wert der ID etwas besser, da ich nicht wie bei einer Zufallszahl erst überprüfen muss, ob der Wert bereits vorhanden ist.
 
Zuletzt bearbeitet:
Die HASH-Funktionen liefern wohl alle einen alphanumerischen Wert zurück.

Wenn aber deine ID ein rein numerischer Wert ist, dann erstelle dir einfach eine "geheime" Formel wie z.B.: "id + 5 * 2 - 9 + 53" und mit dieser Formal bildest du dann den Dateinamen.

Oder du wandelst die einzelnen Ziffern der id mit ORD widerum in Zahlen um und bildest daraus den Dateinamen.

PHP:
<?php

$id = 12345;
$name = "";

$array = str_split($id, 1);

for ($a = 0; $a < count($array); $a++) {
	$name .= ord($array[$a]);
}

// ergibt dann 4950515253
echo $name;
?>
 
Danke für die Hilfe, ich habe mir jetzt Folgendes überlegt:

PHP:
<?php

	// Kodierung (nummerisch, 7 Stellen) für IDs bis 986654

	$id = 1;
	
              // "geheime" Formel
	$datei = (986654 - $id) * 8;
	
	// Auffüllen mit führenden Nullen
	$datei = str_pad($datei, 7, '0', STR_PAD_LEFT);
	
	// Neuanordnung
	$datei = $datei{6} . $datei{3} . $datei{1} . $datei{4} . $datei{0} . $datei{2} . $datei{5};
	
	echo $datei;
	
	// 4382792 für ID 1
	// 6382791 für ID 2
	// 8382790 für ID 3
	// ...
	// 2381795 für ID 10
	// ...
	// 6000001 für ID 986652
	// 8000000 für ID 986653
	// 0000000 für ID 986654
	
?>

Ich bin damit grundsätzlich zufrieden. Nach meiner Auffassung dürfte es keine Kollisionen geben. Das Thema markiere ich noch nicht als erledigt, vielleicht hat ja noch jemand eine bessere Idee. Da ich mittlerweile im falschen Forum bin, bitte ich um Verschiebung in den PHP Teil.
 
Zuletzt bearbeitet:
Ich hab nicht umbedingt eine "bessere" Idee, aber eine, die ohne Files auskommt:
Du kodierst die empfangenen Daten mit Base64 und liest sie in ein TEXT-Feld der Datenbank.
Beim Ausgeben verwendest du
PHP:
 echo "<img src=\"data:image/png;base64,$base64_bild\" />";

Das $bild sind die Daten in der TEXT-Spalte, die Encodierung kannst du mit
PHP:
$base64_bild=base64_encode($bild);
bewerkstelligen. Das image/png natürlich je nach format abändern :)

Ich hoffe, ich hab dir geholfen
 

Neue Beiträge

Zurück