User_Fotoalbum - Anzeige der vorhandenen Bilderanzahl im Profil?

Begonnen von Juliet, 21 August 2004, 20:15:15

⏪ vorheriges - nächstes ⏩

0 Mitglieder und 1 Gast betrachten dieses Thema.

Juliet

Hallo zusammen,

für mein Problem eine passende und aussagekräftige Überschrift zu finden war schon schwer genug, also erklär ich das ganze nochmal genau:

ich hätte gerne, dass im Userprofil angezeigt wird, ob ein User Fotos hochgeladen hat oder nicht.  Sinn der Sache ist es nicht 1000 User-Fotoalben durchklicken zu müssen, sondern direkt im Profil sehehn zu können, dass es zu diesem User Bilder gibt.

User hat X Fotos hochgeladen.

Das ganze soll dann entsprechend verlinkt sein, was ja weniger das Problem ist. Mein Problem ist es eher die Anzahl der Bilder auszulesen, da diese ja nicht in der Datenbank festgehalten werden.

Hat jemand eventuell eine Idee?

Liebe Grüße,
Juliet

jubilee

Hallo !
Hab schon soetwas mal für einen block gebastelt.
Gebe dir hier mal die entsprechenden Funktionen:
Auslesen der Dateien eines Verzeichnisses:
 
Zitatfunction getDirList ($dirName)
{
global $uname;
   $d = dir($dirName); //Handle zum Verzeichnislesen öffnen
   while($entry = $d->read()) //Einträge aus den Verzeichnis auslesen
   {
      if ($entry != "." && $entry != "..") // Wenn Eintrag NICHT . oder ..
      {
         if (is_dir($dirName."/".$entry))
         {
            //wenn Eintrag ein Directory-Name, tue nichts
         }
         else
         {
            $files[]=$entry; //wenn Filename dann ins array schreiben
         }
      }
   }
   $d->close(); //Handle wieder schließen
   return $files; //array zurückgeben
}
 
Diese Funktion in das Script einbauen, wo es gebraucht wird.
Aufruf geschieht mit  $bilder= getDirList("modules/User_Fotoalbum/album");
Damit bekommst Du im array   $bilder alle hochgeladenen Bilder der User.
Jetzt müssen wir noch nach User aufschlüsseln:
 
Zitatfunction countUserbilder($bilder)
{
$ergebnis=0;
if (count($bilder))
{
$imglist = array();
while (list($k,$v) = each($files))
{
if (preg_match("#($uname)([0-9]+)(\.gif|\.jpe?g|\.png)$#i", $v, $matches))
{
$imglist[] = $matches[0];
}
}
$ergebnis= (count ($imglist));
}
return $ergebnis;
}
Auch diese Funktion einbauen.
Aufruf mit   $ergebnis=countUserBilder($bilder);
In der Variablen $ergebnis sollten dann die enstprechende Anzahl an Bilder stehen.
Wichtig ist das der Aufrufparameter in der Klammer dem Rückgabewert aus der ersten Funktion entspricht.
MfG
jubilee

[Editiert am 22/8/2004 von jubilee]

[Editiert am 23/8/2004 von jubilee]

Juliet

Hey Jubilee und herzlichen Dank für die Hilfe.

Hab alles entsprechend eingebaut. Das array $bilder  liest auch wunderbar die files des Verzeichnisses  aus. Allerdings bekomm ich als Ergebnis zu
  $ergebnis=countUserBilder($bilder)  IMMER 0 raus, auch wenn der User Bilder hochgeladen hat.
Habe schon einiges versucht, aber das Ergebnis ist und bleibt immer null.

Eventuell mach ich ja irgendwo was im Aufruf falsch, daher hier mal meine Ausgabe:
 echo "<tr valign=\"top\"><td bgcolor=\"$bgcolor2\"><b>Bilder/Fotos:</b></td><td bgcolor=\"$bgcolor3\">".$ergebnis=countUserBilder($bilder)." Bilder/Fotos im Fotoalbum</td></tr>\n";  

Den Rest habe ich eins zu eins übernommen. Erst die erste Funktion, dann den Aufruf dieser durch $bilder= getDirList("modules/User_Fotoalbum/album");  - die zweite Funktion und dann den Aufruf dieser wie oben stehend.

Irgendwie komm ich da nicht weiter...

jubilee

Hallo !
Sorry, kleine Unterlassungssünde von mir:
Die Funktion countUserBilder();
bitte so anpassen :
alt :
 
Zitatfunction countUserbilder($bilder)
{
$ergebnis=0;
 
neu :
 
Zitatfunction countUserbilder($bilder)
{
global $uname;
$ergebnis=0;
Und : es muss natürlich in der Variablen $uname auch der username drin stehen.
Dann sollte es gehen .
MfG
jubilee

Juliet

Ja, da könnte dann der Fehler liegen. Ich arbeite mit der view.php aus der Userinfo.
Hier wird der Username ja mit $uinfo['uname'] ausgegeben.
Daher bleibt die Variable $uname leer.
Ich habe es aber auch bereits versucht mit der Variable $uinfo['uname'] versucht.
Wenn ich Deine Zeile nehme:
 if (preg_match('#('".$uname."')([0-9]?1)(\.gif|\.jpe?g|\.png)$#i', $v, $matches))

oder eben
 if (preg_match('#('".$uinfo['uname']."')([0-9]?1)(\.gif|\.jpe?g|\.png)$#i', $v, $matches))
kommt er mir aber immer mir einem Parse Error in dieser Zeile, welchen ich beim besten Willen NICHT finden kann!

jubilee

Hallo !
Wenn du die Variable $uinfo['uname'] verwenden möchtest, muss dieser auch in dem globals der funktion drinstehen (dann nicht   global $uname; sonder   global $uinfo['uname'];
deweiteren versuche das dann mal so :
if (preg_match('#('".$uinfo[uname]."')([0-9]?1)(\.gif|\.jpe?g|\.png)$#i', $v, $matches))
OHNE die Hochkommatas innerhalb der eckigen Klammern.
Wenn das nicht geht, alles wieder zurück und VOR dem Aufruf der zweiten Funktion   $uname=$uinfo['uname']; zuweisen.
MfG
jubilee

Juliet

Die erste Variante ging nicht, daher hab ich dann die zweite angewendet. Zumindest ist nun die Variable $uname gesetzt.

Allerdings hab ich weiterhin das Parse Error Problem in Zeile:
if (preg_match('#('".$uname."')([0-9]?1)(\.gif|\.jpe?g|\.png)$#i', $v, $matches))

Nehm ich die Hochstriche web - also so:
if (preg_match('#(".$uname.")([0-9]?1)(\.gif|\.jpe?g|\.png)$#i', $v, $matches))
bekomme ich keine Fehlermeldung mehr, aber das zurückgegebene Ergebnis der Bilder ist WIEDER nur 0.

jubilee

Hallo !
Hat wahrscheinlich etwas mit dem Maskieren von Sonderzeichen zu tun ($). Die Regex bringen mich nochmal um den Verstand.
Änder die Regex mal so ab:
 
Zitatif (preg_match("#(".$uname.")([0-9]?1)(\.gif|\.jpe?g|\.png)$#i", $v, $matches));
Also gar keine einfachen Hochkommata mehr
Damit sollte die Regex dann funktionieren.
MfG
jubilee

[Editiert am 22/8/2004 von jubilee]

Juliet

Also:

Keine Fehlermeldung mehr - aber - es werden nun alle Bilder die in diesem Verzeichnis liegen gezählt und ausgegeben. Nicht nur die, die der User hochgeladen hat. Die Variable $uname enthält den Usernamen, wie gewollt.

*grübel*

jubilee

Ja, ja. ich sags doch.
Diese Regex sind nicht ganz einfach.
Hier mal der geänderte Abschnitt zum korrigieren.
alt:
 
Zitatwhile (list($k,$v) = each($bilder))
{

if (preg_match('#('".$uname."')([0-9]?1)(\.gif|\.jpe?g|\.png)$#i', $v, $matches))
{
$imglist[] = $matches;
}
}

 
neu:
Zitatwhile (list($k,$v) = each($files))
{
if (preg_match("#($uname)([0-9]?1)(\.gif|\.jpe?g|\.png)$#i", $v, $matches))
{
$imglist[] = $matches[0];
}
}
 
So, ich hoffe nun funkts endlich ;)
MfG
jubilee

[Editiert am 23/8/2004 von jubilee]

[Editiert am 23/8/2004 von jubilee]

Juliet

WUNDERBAR - es klappt ...  aber noch eine kleine Korrektur, welche Du im Eifer des Gefechts  wohl übersehen hast:

while (list($k,$v) = each($files)): streiche $files - setze $bilder

DANKE SCHÖN Jubilee!!!  :D  

Juliet

Noch eine kleine Entdeckung hinterher:

Wenn ich nun die Userinfo aufrufe bekomme ich die Bilder richtig ausgezählt.
Ruft der User selber die Your_Account auf bekommt er wieder alle Files des Verzeichnisses ausgezählt.
habe schon versucht die globale 4uname zu übergeben und zu deifinieren. Hat beides nicht funktioniert ...

jubilee

Hmmm...
Nochmal eine Änderung in den regex:
alt:
 
Zitatif (preg_match("#($uname)([0-9] +)(\.gif|\.jpe?g|\.png)$#i", $v, $matches))
neu:
 
Zitatif (preg_match("#($uname)([0-9] ?1)(\.gif|\.jpe?g|\.png)$#i", $v, $matches))
Jetzt zum Fehler :
 
ZitatWenn ich nun die Userinfo aufrufe bekomme ich die Bilder richtig ausgezählt.
Ruft der User selber die Your_Account auf bekommt er wieder alle Files des Verzeichnisses ausgezählt.
 
Es könnte damit zusammenhängen, das im 2. Fall die $uname gar nicht gefüllt ist ?!
ansonsten nochmal zum ausprobieren :
 
Zitatif (preg_match("#($userinfo[uname])([0-9] ?1)(\.gif|\.jpe?g|\.png)$#i", $v, $matches))
Wenn der Effekt hier derselbe ist, liegt es an der Variable, die falsch gefüllt ist.
MfG
jubilee

jubilee

So nochmal !
Hier eine kombinierte Funktion die die beiden einzelfunktionen ersetzen können sollte ;)
 
Zitatfunction getUserPhotos ($dirName, $uname)
{
   $d = dir($dirName); //Handle zum Verzeichnislesen öffnen
   while($entry = $d->read()) //Einträge aus den Verzeichnis auslesen
   {
      if ($entry != "." && $entry != "..") // Wenn Eintrag NICHT . oder ..
      {
         if (is_dir($dirName."/".$entry))
         {
            //wenn Eintrag ein Directory-Name, tue nichts
         }
         else
         {
            $files[]=$entry; //wenn Filename dann ins array schreiben
         }
      }
   }
   $d->close(); //Handle wieder schließen
   if (count($files)) // Hat der User Files gespeichert
   {
      $imglist = array();
      while (list($k,$v) = each($files))
      {
         if (preg_match("#($uname)([0-9]?1)(\.gif|\.jpe?g|\.png)$#i", $v, $matches)) // Images nach Usernamen auswerten
         {
            $imglist[] = $matches[0];
         }
      }
   }
   if ((count($imglist))>0)
   {
      $ergebnis=(count($imglist));
   }
   else
   {
      $ergebnis=0;
   }
return $ergebnis; //Daten zurückgeben
}

 
Aufruf via : $ergebnis=getUserPhotos("modules/User_Fotoalbum/album", $uinfo['uname']);
Imn der Variablen $ergebnis sollte dann die Anzahl der Bildes des Users stehen.
MfG
jubilee

Juliet

Sooo - Dein vorletztes Post mal außer Acht gelassen, denn das klappte beides nicht.

Habe dann die function aus dem letzten post eingebaut., Ging zunächst nicht.
Habe aber dann einfach vor der Funktion $dirName und $uname definiert und als Ausgabe NUR  $ergebnis=getUserPhotos genommen. geht prima.

Dann hab ich noch die zeile
 if (preg_match("#($uname)([0-9]?1)(\.gif|\.jpe?g|\.png)$#i", $v, $matches))
wieder auf
 if (preg_match("#($uname)([0-9]+)(\.gif|\.jpe?g|\.png)$#i", $v, $matches))
geändert.
Hatte ein User nämlich 3 bilder hochgeladen, dann aber wieder das erste Bild gelöscht wurden 0 angezeigt, obwohl 2 da waren. mit dem + statt ?1 funktioniert es jetzt... auch in der Your_Account.


jubilee

Hallo !
 
ZitatGing zunächst nicht.
Habe aber dann einfach vor der Funktion $dirName und $uname definiert und als Ausgabe NUR $ergebnis=getUserPhotos genommen
Normalerweise sollte das aber nicht so sein. dafür ja die Aufrufparameter der Funktion ($dirName, $uname)
Wenn Du beim Aufruf jetzt 2 Parameter angibst ('modules/User_Fotoalbum/album', $uinfo['uname']) werden die ja in die entsprechenden Aufrufvariablen gemappt und stehen der Funktion dann als interne Variablen mit diesem Namen zur Verfügung.
Evt. musst Du aber den Pfad anpassen, evt. musst Du ab dem Verzeichnis rechen von wo diese Script/Funktion gestartet wird.

 
ZitatHatte ein User nämlich 3 bilder hochgeladen, dann aber wieder das erste Bild gelöscht wurden 0 angezeigt, obwohl 2 da waren. mit dem + statt ?1 funktionirt
Upsss.....
Kommt es vor, das die Dateinamen auch 2 Nummern hinter dem Usernamen haben? Denn das ist der Unterschied
([0-9]?1) sagt aus Wertebereich 0-9 einstellig
([0-9]+) sagt aus Wertebereich 0-9 anzahl beliebig.
MfG
jubilee


Juliet

 
ZitatNormalerweise sollte das aber nicht so sein. dafür ja die Aufrufparameter der Funktion ($dirName, $uname)
Wenn ich aber $ergebnis=getUserPhotos ('modules/User_Fotoalbum/album', $uinfo['uname']) nehme bekomm ich erneut einen Parse Error in der Zeile!

 
ZitatKommt es vor, das die Dateinamen auch 2 Nummern hinter dem Usernamen haben?
Nein, da die User maximal 3 bilder hochladen dürfen kommt es nicht zu einer zweistelligen bilderzahl.

edit:
mein Fehler - den Parse Error hab ich selber verbockt. Ok, Ausgabe sieht nun so aus:
 $ergebnis=getUserPhotos('modules/User_Fotoalbum/album', $uinfo['uname'])  
$uname muß trotzdem weiterhin zusätzlich definiert werden ... ansonsten klappt es nun in Your_Account und Userinfo.

Danke jubilee - super Einsatz von Dir. Ganz herlichen Dank von dieser Stelle aus :)

[Editiert am 23/8/2004 von Juliet]

jubilee

Hallo !
 
Zitat$uname muß trotzdem weiterhin zusätzlich definiert werden ... ansonsten klappt es nun in Your_Account und Userinfo.
 
Irgendwas stimmt da noch nicht. Normalerweise kannst Du die Funktion einfach mit den  erforderlichen Parametern aufrufen. dabei müssen die nocht nicht mal als Variable übergeben werden. du kannst Die auch beide als String übergeben--->
getUserPhotos("Hier/Der/Pfad", "HierDerUsername");
oder über Variablen (die natürlich mit den ensprechenden Werten gefülltsein müssen
--->
getUserPhotos($pfad, $username);
...
Mfg
jubilee

Juliet

*mööööp*

Hab heute einen kleinen Bug in der Bildabfrage für das Profil gefunden.

Ein User namens teddy hat vor einiger Zeit 2 Bilder hochgeladen.
Gestern nun meldet sich ein User namens eddy an und bekommt 2 Bilder im Profil angezeigt, hat aber keine hochgeladen. Es werden logischerweise auch keine angezeigt.

Kann man da irgendwas machen, dass er nicht andere Usernamen zerflückt ... sondern genau DEN Usernamen sucht?

jubilee

Ja, das geht.
Anstatt von   preg_match zum auswerten der Regex, musst Du mal mit
  preg_match_all versuchen.
Das sollte dann besser funktionieren.
MfG
jubilee