Bilder
kleines_Blümchen
- php
0 Stephan
Guten Abend euch allen,
hmm wie fange ich an. Ich versuche es einfach mal. Ich habe folgendes vor. Da ich sehr gerne Bilder von Gegenständen, Leuten und so mache habe ich nun überlegt, dass ich die Bilder gerne Online stellen will. Bis jetzt habe ich meine WebSeite soweit fertig nun kommt aber dass ich nicht ganz genau weiß, wie ich das mit den Bilder machen kann.
Ich habe mir mal folgendes überlegt.
Ich habe ja eine MySQL Datenbank zur Verfügung. Dort lege ich eine Tabelle an die z.B. Bilder heißt. Dort kommen nun folgende Spalten rein:
So zur ID muss ich ja nichts sagen. Benuter_Upload da soll dann der Namen rein der die Bilder online gestellt hat. Das wird anhand einer Session erkannt. Datum na ja wenn die Bilder eben gemacht worden sind. Bilder da kommen dann eben die Bilder rein bzw. der Link zu dem Bild in einem Ordner. ID_Gallerie da kommt eine Zahl rein dass man die Bilder dann auch wieder auslesen kann also so eine Art Gallery dann z.B. Privates, Menschen usw. Comments na ja da soll dann eben noch eine Möglichkeit geben, dass ein User dann auch was drunter schreiben kann.
Habe ich das bis jetzt richtig gemacht oder habe ich hier schon was wichtiges vergessen oder wurdet Ihr sagen, dass Ihr das ganz anderes macht, wenn JA dann sagt es mir ruhig und am besten schreibt es doch gleich mal auf wie Ihr das machen wurdet.
Jetzt machen wir mal mit dem weiter wie ich mir das vorstelle. Nun soll es eben dann eine Seite geben die z.B. heißt Bilder.php dort sollen dann die Rubriken so dargestellt werden:
DATUM
Rubrik
Wie viele Bilder sind in dem Ordner
So wenn man dann etwas anklickt dann soll es so aussehen: bilder_auswahl.php?bilderid=1 usw. dann. Wenn man da dann drauf klickt, dann sollte man eben in die Rubrik kommen und da sollen dann erst mal kleine Bilder kommen wenn man da dann drauf klickt dann soll folgendes kommen: bilder_auswahl.php?bilderid=1&bild=1 usw.
Ich weiß es ist viel was ich da will, aber könnte mir da denn nicht jemand helfen dass ich das hin bekomme, das währe echt Mega lieb von euch.
Gruß Blümchen
Hallo Blümchen,
wenn ich das richtig verstanden habe, kann auf Deiner Webseite jeder Bilder hochladen. Oder muss man sich dort erst registrieren?
Gruß,
Stephan
Hallo Stephan,
wenn ich das richtig verstanden habe, kann auf Deiner Webseite jeder Bilder hochladen. Oder muss man sich dort erst registrieren?
Ja und Nein die User können sich net anmelden oder so, das muss ich dann in einer DB selber machen die haben dann eben ein NickName und ein Passwort um Bilder hoch zu laden. Versteht du was ich meine?
Gruß Blümchen
Aha, dann würde ich das Ganze so aufbauen:
Tabelle 1: User
Tabelle 2: Kategorien
Tabelle 3: Bilder
User:
id, name, vorname, ...
Kategorie:
id, name
Bilder:
id, user(id aus der Tabelle User), kategorie(id aus der Tabelle Kategorie), bild(dateiname), ggf. bildname, datum
Da Du die Bilder nach Datum sortieren möchtest, solltest Du für das Datum die Funktion mktime() einsetzen und in der Datenbank speichern. Da wahrscheinlich kein Bild vor dem 1.1.1970 gemacht wurde, kannst Du die Datumseingabe auf Richtigkeit überprüfen und dann mit mktime() eine Zeitmarke erstellen.
Ich würde deshalb eine Tabelle Kategorie anlegen, damit keine Kategorien doppelt eingetragen werden können. Ausserdem kannst Du den Usern die Möglichkeit geben, eine vorhandene Kategorie auszuwählen oder eine neue erstellen zu lassen. Sollte der User eine Neue erstellen, kannst Du gleich einen Ordner anlegen lassen, der die Bilder der Kategorie enthält (wenn Du nicht alle Bilder in einem Ordner halten willst).
Das wäre zumindest erstmal der Anfang.
Gruß,
Stephan
Hallo Stephan,
Ok das habe ich soweit verstanden. Aber ich wurde sagen ich muss das von Anfang an machen. Das mit den Tabellen das ist OK für mich. Aber wie muss ich nun das Formular machen dass ich das auch so in die Tabellen bekomme. Also ich weiß wie man ein Upload Formular erstellen kann aber wie mache ich das dann noch mit dem Ordner und so, und dass er mir das gleich in die DB eintragen kann?
Gruß Blümchen
Also:
es ist nicht so schwer, wie es scheint. Erstelle ein Formular mit den Feldern, die der User ausfüllen muss. Für die Kategorie solltest Du ein Select-Feld für die vorhandenen Kategorie und ein optionales Text-Feld für eine eventuelle neue Kategorie nehmen.
SELECT-FELD:
function holeKategorien() {
//MySQL-Verbindung muss global sein
$sql = @mysql_query("SELECT * FROM Kategorien ORDER BY name ASC");
if (@mysql_num_rows($sql) > 0){
print "<select name="kategorie">";
while($tmp = @mysql_fetch_array($sql)) {
print "<option value="".$tmp[id].""";
if ($_POST['kategorie'] == $tmp[id]) print " SELECTED";
print ">".$tmp[name]."</option>";
}
print "</select>";
}
}
Folgendes passiert:
Der User loggt sich ein, um Bilder hochzuladen. In der Variablen $session[id] hast Du schonmal die Benutzerdaten gespeichert, die Du als hidden-tag im Formular einbinden kannst.
Nun macht der User Angaben zum Bild (Kategorie, Datum, ggf. Bildname). Wenn er auf "hochladen" klickt, kannst Du als erstes überprüfen, ob er eine vorhanden Kategorie gewählt hat (holeKategorien()) oder eine Neue erstellen möchte. Wenn erstes der Fall ist, ist der Ordner der Kategorie ja schon vorhanden und die ID der Kategorie ist in $kategorie gespeichert. Das Bild kann also einfach in den Ordner kopiert werden. Dabei berührt das nur eine Tabelle. Und zwar Bilder:
@mysql_query("INSERT INTO Bilder (user,kategorie,bild,datum) VALUES ('$user_id','$kategorie','$bild','$datum')");
Das Datum musst Du vorher mit mktime() erstellen, damit Du es sortieren kannst.
$bild ist in Deinem Fall $HTTP_POST_FILES['bild']['name']
Gruß,
Stephan
Hallo,
danke für deine Hilfe aber ich verstehe da gerade leider nur Bahnhof und da nicht mal richtig. Hmm gibts denn da eine Anleitung wie ich das machen könnte oder so? Denn so bekomme ich das nie hin :-( ja leider :-(
Gruß Blümchen
Sorry, ich wusste nicht, wie weit Du schon bist. Ich denke, die Tabellen kannst Du erstellen, oder? Wie Du die Tabellen auslesen kannst, weisst Du auch.
In der Datenbank-Programmierung splittet man alles so gut auf, wie es geht. Daraus entsteht die Dynamic. Nehmen wir als Beispiel die Tabelle Kategorien. Natürlich könntest Du, wie Du es anfangs geplant hast, die Kategorie mit in die Tabelle Bilder packen. Aber dort läufst Du dann Gefahr, doppelte Kategorien zu haben.
Genauso bei den Usern. Natürlich könntest Du auch die Userinfos in die Tabelle Bilder mit reinknallen, aber irgendwann ist die Tabelle so vollgestopft (mit Daten, die Du nur selten brauchst), dass MySQL sehr langsam wird. Daher baut man viele Tabellen und verknüpft diese miteinander.
So kann man aus einer Tabelle alle Informationen ziehen, die man braucht, selbst wenn diese in einer anderen Tabelle liegen.
Was Du nun machst, ist einen Bereich programmieren, in den sich ein User einloggen muss. Um den User zu identifizieren, werden seine Daten ja aus der Datenbank ausgelesen und in einer Session gespeichert. Unter anderem die ID des Users. Das ist die Variable $session[id].
Danach schreibst Du ein Formular mit den Feldern für die Kategorie, das Datum des Bildes und die Bilddatei selbst. Die Methode des Formulars ist "POST", somit werden die übermittelten Daten in $_POST-Variablen gespeichert. z.B. $_POST['kategorie']
Ich weiss leider nicht, wie Dein Upload-Script aussieht, aber dort steht auf jeden Fall etwas von $HTTP_POST_FILES. Da Du eine Datei hochladen möchtest, benutzt Du im Formular das Feld INPUT TYPE="FILE". Die übermittelten Daten nach dem Absenden des Formulars werden in der Variablen $HTTP_POST_FILES gespeichert. Den Namen der Datei kannst Du mit $HTTP_POST_FILES['feldname']['name'] auslesen. Das brauchst Du, weil mysql keine Arrays verarbeiten kann (zumindest nicht bei SELECT, INSERT, UPDATE und DELETE). Somit kannst Du den Bildnamen als $bild = $HTTP_POST_FILES['feldname']['name']; definieren und in die Datenbank schreiben.
Kommen wir zum Datum. Du möchtest das Datum gerne absteigend sortieren. Zahlen werden in MySQL nur dann richtig sortiert, wenn der Feldtype INT ist. Da ein Datum aber einen Punkt hat, kannst Du diesen Feldtype nicht verwenden. Du müsstest das Datum also String speichern, aber dann kannst Du es nicht mehr richtig sortieren.
Das umgehen wir, indem wir aus diesem Datum eine Zeitmarke erstellen, die die vergangenen Sekunden seit dem 1.1.1970 darstellt. Sieh Dir dazu mal die Funktion mktime() an. Aus dieser Zeitmarke kannst Du nun alle Infos rausholen, die Du brauchst. Und da dies ein INTEGER (also eine reine, ganze Zahl) ist, kannst Du auch den Feldtype INT verwenden. Und schon kannst Du sortieren.
Kommen wir zur Kategorie. Du kannst theoretisch alle Bilder in einem Ordner speichern, denn die Kategorie wird ja in der Datenbank gespeichert und aus dieser ausgelesen. Das Ganze hat nur den Nachteil, dass, wenn jemand ein Bild mit dem selben Namen hochlädt, das alte Bild gelöscht wird. Wenn Du das umgehen willst, solltest Du das Überschreiben von Dateien unterbinden und eine Fehlermeldung ausgeben, mit dem Hinweis, dass der User den Dateinamen doch bitte ändern möchte.
Wenn Du das nicht willst, musst Du immer dann, wenn eine neue Kategorie erstellt wird, auch einen neuen Ordner erstellen. Das machst Du mit mkdir(). Um aber zu verhindern, dass eine Kategorie doppelt eingetragen wird, solltest Du die neue Kategorie mit den schon vorhandenen Kategorien aus der Datenbank vergleichen. Wenn Du das machen möchtest, muss ich Dir dann helfen, wenn Du soweit bist. Ansonsten wird das jetzt zu spät.
Wie Du die Daten dann in die Datenbank bekommst, weisst Du?
Gruß,
Stephan
Guten Morgen Stephan,
danke dass du mir so ausführlich geantwortet hast. Hmm leider bin ich aber noch gar nicht so weit, das heißt DOCH dass der User erkannt wird und einloggen kann, das habe ich schon. Der User wird bei mir so erkannt:
'" . $_SESSION['be_nutzer_bilder'] . "',
So wie muss ich denn jetzt nun weiter machen? Ich hab hier mal ein Formular. Da weiß ich jetzt aber nicht wo ich da den Code von dir wo du mir gegeben hast rein packen soll. Kannst du mir das mal bitte noch sagen?
Hier mal das was ich bis jetzt habe:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Bilder</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form name="form1" method="post" action="">
<table width="80%" border="0">
<tr>
<td width="20%" scope="col"><div align="left">Benutzername:</div></td>
<th width="80%" scope="col"><div align="left">
<input name="benutzername" type="text" id="benutzername">
</div></th>
</tr>
<tr>
<td scope="col"><div align="left"> Kategorie:</div></td>
<td scope="col"><div align="left">
<input name="kategorie" type="text" id="kategorie">
</div></td>
</tr>
<tr>
<td scope="col">Datum:</td>
<th scope="col"><div align="left">
<input name="datum" type="text" id="datum">
</div></th>
</tr>
<tr>
<td scope="col">Name des Bildes: </td>
<th scope="col"><div align="left">
<input name="name_des_bildes" type="text" id="name_des_bildes">
</div></th>
</tr>
<tr>
<td scope="col"> </td>
<td scope="col"><div align="left">
<input name="bild" type="file" class="chatfields" id="bild">
</div></td>
</tr>
<tr>
<td scope="col"> </td>
<td scope="col"> <input name="upload" type="submit" class="chatfields" value=">>> hochladen"></td>
</tr>
</table>
</form>
</body>
</html>
Den Code bekomme ich dann mit einem Insert Intro in die Db gelle?
Gruß Blümchen
Hallo Blümchen,
so wie ich das sehe, hast Du keinen geschützten Bereich. Das heißt also, ein User kann einfach einen Benutzernamen eingeben und wenn dieser von der Datenbank gefunden wird, Bilder hochladen.
Ich würde an Deiner Stelle einen gesonderten Bereich erstellen. Damit meine ich zwei Seiten - einmal Login mit Benutzernamen und Passwort - und dann die eigentliche Seite, wo die Bilder hochgeladen werden. Weißt Du, wie das geht?
Wo sollst Du den Code reinpacken:
PHP ist eine dynamische Scriptsprache. Das bedeutet, man kann vieles in externe Dateien (Includes) auslagern und dann wieder einbinden, wenn man sie braucht. Das ist erstens übersichtlicher und zweitens bleiben die einzelnen Dateien schlank.
Also würde ich eine Datei machen, wo das Formular drin steht, so wie Du es dort schon hast. Dann eine Datei, wo das Script reinkommt und diese als *.inc.php abspeichern. Diese wird dann am Anfang der Formular-Datei eingebunden. Das sieht dann so aus:
<?php
if (isset($_POST['aktion']) && $_POST['aktion'] == "upload") {
@include('funktionen.inc.php');
}
?>
...
In dieser funktionen.inc.php wird die Datei hochgeladen und die Daten in die Datenbank geschrieben.
Gruß,
Stephan
Hallo Stephan,
danke dass du mir so weit unten nochmals geantwortet hast. Hmm leider muss ich sagen dass ich das gerade gar nicht so verstanden habe.
Könnten wir das mal einfach angehen. Lassen wir mal den Geschützten Bereich weg das heißt dass der Link nur ich kennen wurde. OK wie muss ich dann nun weiter machen.
Ich sollte jetzt erst mal das nochmals genau wissen wie ich das mit dem Einbinden mache und was ich da machen muss?
Gehen wir mal davon aus, dass ich einfach das so haben will wie ich das jetzt schreibe:
Die Bilder sollen dann anschließend immer nach Datum angelegt werden. Gehen wir mal davon aus, dass ich heute ein Bild Uploade:
Ich wähle die Rubrik: Privat lI Das Datum: 16072005 II Bild1 so das lade ich dann hoch. Jetzt kommt dann das andere Bild wie z.B. Rubrik: Leute II Datum 16072005 So nun soll ein Ordner in dem Ordner mit dem Datum 16072005 angelegt werden mit der Bezeichnung Leute verstehst du was ich meine?
Hmm könntest du mir denn da mal helfen, dass ich das alles mal verstehe. Und damit dem Code in eine andere Datei schreiben, das finde ich echt gut dass man das machen kann so behalte ich dann auch den Überblick.
Ich hoffe dass du mir da helfen tust.
Gruß Blümchen
Hallo Blümchen,
so werden wir wohl ewig brauchen, bis wir fertig sind. Schreib mir eine Email, so dass ich Deine Email-Addy habe und ich zeige Dir mal, wie ich das in etwa machen würde. Ich gehe dabei davon aus, dass Du Xampp auf Deinem Rechner installiert hast.
Gruß,
Stephan
Hallo,
ok ich habe dir gerade eine Mail geschrieben!
MFG,
das kleine Blümchen