ERLEDIGT
JA
JA
ANTWORTEN
13
13
ZUGRIFFE
537
537
EMPFEHLEN
-
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.
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
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-Code: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!
-
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
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?
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.Geändert von _hq_ (08.02.12 um 20:11 Uhr)
-
09.02.12 10:53 #8
- Registriert seit
- Sep 2004
- Ort
- Möglingen (BaWü)
- Beiträge
- 3.109
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-Code:<?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;
?>Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.
Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.
-
Danke für die Hilfe, ich habe mir jetzt Folgendes überlegt:
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.PHP-Code:<?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
?>Geändert von _hq_ (09.02.12 um 21:34 Uhr)
-
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 duDas $bild sind die Daten in der TEXT-Spalte, die Encodierung kannst du mitPHP-Code:echo "<img src=\"data:image/png;base64,$base64_bild\" />";
bewerkstelligen. Das image/png natürlich je nach format abändernPHP-Code:$base64_bild=base64_encode($bild);

Ich hoffe, ich hab dir geholfen
-
Naja, Bilder in einer Datenbank zu speichern macht aber nicht wirklich viel Sinn. Das erhöht den Rechenaufwand um einiges und trägt nur wenig zur Performance bei.
Die Bilder als Files abspeichern macht da - bei halbwegs größeren Projekten - schon mehr Sinn. Wenn es nur ein Gästebuch für ein paar Benutzer täglich ist, dann kann man sich da wohl beide Varianten überlegen...
-
Es ist einfach eine alternative Methode, die weniger Fehlerquellen bietet. Und warum erhöht sie den Rechenaufwand? Das Bild muss nur ein einziges Mal base64-Codiert werden. Dann kann man es einfach so verwenden und es müssen keine Hashes mehr gebildet werden. Nebenbei lädt so die Seite schneller, da keine zusätzlichen Requests mehr fällig werden.
-
Für den "Kunden" (Client) ist es nicht mehr Aufwand, das stimmt. Der Server muss aber das Bild erst mal decodieren, damit es zur Verfügung steht. Es gäbe sicher die Möglichkeit, das Bild in einen Cache zu laden, wobei das dann wieder dem alten Prinzip nahe kommt.
-
@ all
Nochmals danke für die Hilfe. Ich habe mein Problem mittlerweile wie in Post #9 beschrieben umgesetzt!
Ähnliche Themen
-
[mysql] Newsletter-user aus Datenbank in eine andere Datenbank
Von Scofields im Forum Relationale DatenbanksystemeAntworten: 8Letzter Beitrag: 11.06.08, 21:20 -
Datenbank in XML abbilden
Von lernen.2007 im Forum JavaAntworten: 3Letzter Beitrag: 07.12.07, 00:43 -
Problem beim Abbilden auf eine rel. Datenbank
Von Avarius im Forum Relationale DatenbanksystemeAntworten: 25Letzter Beitrag: 18.04.07, 12:50 -
Profilbild bestehend aus 5 bildern...hintergrund soll in die bilder laufen
Von Broken Silence im Forum PhotoshopAntworten: 2Letzter Beitrag: 06.09.05, 11:23





Zitieren



Login





