tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
537
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    _hq_ _hq_ ist offline Mitglied
    Registriert seit
    Jan 2012
    Beiträge
    14
    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!
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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

  3. #3
    _hq_ _hq_ ist offline Mitglied
    Registriert seit
    Jan 2012
    Beiträge
    14
    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?
     

  4. #4
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    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'); 
     

  5. #5
    Avatar von Lime
    Lime Lime ist offline frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    374
    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!
     

  6. #6
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Zitat Zitat von _hq_ Beitrag anzeigen
    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.
     
    ---------------------------------------------------------------------------------------------------
    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

  7. #7
    _hq_ _hq_ ist offline Mitglied
    Registriert seit
    Jan 2012
    Beiträge
    14
    Zitat Zitat von CPoly Beitrag anzeigen
    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'); 
    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?

    Zitat Zitat von Lime Beitrag anzeigen
    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.

    Zitat Zitat von Yaslaw Beitrag anzeigen
    Neue Spalte.
    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)
     

  8. #8
    Avatar von tombe
    tombe tombe ist offline Mitglied Diamant
    tutorials.de Premium-User
    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($id1);

    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.

  9. #9
    _hq_ _hq_ ist offline Mitglied
    Registriert seit
    Jan 2012
    Beiträge
    14
    Danke für die Hilfe, ich habe mir jetzt Folgendes überlegt:

    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($datei7'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.
    Geändert von _hq_ (09.02.12 um 21:34 Uhr)
     

  10. #10
    Aragon0 Aragon0 ist offline Rookie
    Registriert seit
    Feb 2012
    Beiträge
    6
    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-Code:
     echo "<img src=\"data:image/png;base64,$base64_bild\" />"
    Das $bild sind die Daten in der TEXT-Spalte, die Encodierung kannst du mit
    PHP-Code:
    $base64_bild=base64_encode($bild); 
    bewerkstelligen. Das image/png natürlich je nach format abändern

    Ich hoffe, ich hab dir geholfen
     

  11. #11
    Avatar von Lime
    Lime Lime ist offline frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    374
    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...
     

  12. #12
    Aragon0 Aragon0 ist offline Rookie
    Registriert seit
    Feb 2012
    Beiträge
    6
    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.
     

  13. #13
    Avatar von Lime
    Lime Lime ist offline frisch fruchtig
    Registriert seit
    Jul 2011
    Beiträge
    374
    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.
     

  14. #14
    _hq_ _hq_ ist offline Mitglied
    Registriert seit
    Jan 2012
    Beiträge
    14
    @ all

    Nochmals danke für die Hilfe. Ich habe mein Problem mittlerweile wie in Post #9 beschrieben umgesetzt!
     

Ähnliche Themen

  1. [mysql] Newsletter-user aus Datenbank in eine andere Datenbank
    Von Scofields im Forum Relationale Datenbanksysteme
    Antworten: 8
    Letzter Beitrag: 11.06.08, 21:20
  2. Datenbank in XML abbilden
    Von lernen.2007 im Forum Java
    Antworten: 3
    Letzter Beitrag: 07.12.07, 00:43
  3. Problem beim Abbilden auf eine rel. Datenbank
    Von Avarius im Forum Relationale Datenbanksysteme
    Antworten: 25
    Letzter Beitrag: 18.04.07, 12:50
  4. Antworten: 2
    Letzter Beitrag: 06.09.05, 11:23