Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   Sammelthema, mein Weblog (https://boardunity.de/sammelthema-weblog-t2253.html)

MrNase 12.08.2004 14:23

Sammelthema, mein Weblog
 
Hallo,

Für ein Projekt dessen Domain ich mir gestern gesichert habe bin ich grad dabei ein Weblog zu programmieren.

Nase geht ja mit der Zeit und so versuche ich Klassen und Funktionen einzusetzen.

Da ich nicht ganz so die grosse PHP-Leuchte bin tauchen sicherlich Fragen auf die ihr hier in diesem Thema sammeln werde damit ihr mit kompetent wie immer zur Seite stehen könnt :)

Momentan ist das Weblog relativ simpel, über ein Admincenter kann ein Beitrag angegeben werden der dann in der Datenbank gespeichert wird. Das besondere daran ist, dass gleichzeit eine index.html erstellt wird die alle Beiträge enthält (in meinem Fall die letzten 15). Die alte index.html wird ins Archiv verschoben und umbenannt. Auf diese Weise bekommt jeder Besucher eine fertig generierte Seite präsentiert und PHP arbeitet nur im Backend. Die Archivseite liest das Verzeichnis 'archiv' aus und präsentiert den Inhalt zum einfachen Betrachten älterer Beiträge.


Nun ist meine erste konkrete Frage wie ich innerhalb der Klassen agieren kann..
Wenn ich z.B. eine Klasse namens 'core' hab, dann noch die Klasse 'templates' und die Klasse 'database', wie kann ich dann Funktionen aus der Klasse 'template' in Funktionen der Klasse 'core' verwenden?

codethief 12.08.2004 18:11

Normalerweise geht das über den Namen der Klasse selbst:

PHP-Code:

class test
{
   function 
blubb
   
{
       
//...
   
}
}

class 
test2
{
   function 
blubb
   
{
       
test::blubb();
   }


Oder du machst das Objekt der einen Klasse in der Funktion mit 'global' verfügbar und greifst darüber auf die Methode zu:

PHP-Code:

class test
{
   function 
blubb
   
{
       echo 
"bla";
   }
}

class 
test2
{
   function 
blubb
   
{
       global 
$obj;
       
$obj->blubb();
   }
}

$obj = new test();
$obj2 = new test2();

$obj2->blubb(); 


Meiner Meinung nach hast du das Archiv noch nicht genau durchdacht, da du dann ja mit jedem neuen Eintrag eine neue Archivdatei hast, wobei sich Einträge im Archiv wiederholen würden, da ja immer die letzten 15 angezeigt werden.
Ich fände es besser wenn du jedes Mal eine Extra-Archivdatei generieren lassen würdest (die alle Einträge beinhaltet).
Evtl. würde ich sogar soweit gehen noch eine Seitenaufteilung über mehrere Dateien einzubauen.


code

Patrick Gotthardt 12.08.2004 19:19

Ich schätze mal, dass Singleton die richtige Strategie für dich sein dürfte.

PHP-Code:

<?php
 
class Core {
     function &
getInstance() {
         if(isset(
$GLOBALS['Singleton.Core.class'])) {
             return 
$GLOBALS['Singleton.Core.class'];
         } else {
             
$GLOBALS['Singleton.Core.class'] = &new Core();
             return 
$GLOBALS['Singleton.Core.class'];
         }
     }
     
     function 
render() {
         
$tpl Template::getInstance();
         return 
$tpl->get('core_main'$this->data);
     }
 }
 
 class 
Template {
     function &
getInstance() {
         if(isset(
$GLOBALS['Singleton.Template.class'])) {
             return 
$GLOBALS['Singleton.Template.class'];
         } else {
             
$GLOBALS['Singleton.Template.class'] = &new Template();
             return 
$GLOBALS['Singleton.Template.class'];
         }
     }
 }
 
?>

Alternativ kannst du dir die Variante von X-Mentor ansehen oder die entsprechenden Klassen als Instanz in einer Variable der Klasse speichern und diese dann entweder per Konstruktor (oder Methode) übergeben oder im Konstruktor anlegen.

Ich habe übrigens bewusst auf das static-Keyword verzichtet... bei mir hat es bislang noch nie funktioniert.

MrNase 13.08.2004 13:47

Hallo und Guten Morgen,

Mittlerweile stehe ich vor einem ganz anderen Problem *g*

Ich habe eine XML-Datei, die, dank exe, geparsed wird und aktuelle Wetterinformationen aus meiner Umgebung liefert.

Leider darf das Script maximal einmal pro 15 Minuten aufgerufen werden, sodass ich die Daten zwischenspeichern muss.

Ich hatte mir da folgendes Überlegt:

Code:

$time = file_get_contents('time.txt');
 
 if(time() >= ($time+(60*15))) {
 // XML-Datei wird geparsed
 // Datenbank wird gefüttert
 // time.txt wird mit aktuellem Timestamp gefüllt
 }
 else {
 // Datenbankabfrage
 }

Hat da jemand nen anderen Vorschlag zu?

TRS 13.08.2004 13:57

Cronjob, aber du kannst es dir noch einfacher machen bei deinem Script.

1. Daten auslesen, paren und in als fertiges HTML in eine Cachedatei schreiben.
2. Cachedatei via include einfügen.
3. Bei jedem Aufruf prüfst du das Erstellungsdatum der Datei mit filemtime(), und wenn die Datei 15 Minuten alt ist, wird der die Cachedatei neu erstellt.

MrNase 13.08.2004 14:03

Cronjobs hat mein Packet leider nicht :(

Das Problem bei einer fertigen Seite ist, dass ich dann ja keine Variablen mehr zur Verfügung habe. Die brauche ich aber, damit sie in der fertigen Seite in den Templates verwendet werden können.

TRS 13.08.2004 19:34

Axo, das war ja reines HTML. Ich erinner mich... Das macht es natürlich etwas schwieriger, dort etwas dynamisches reinzubauen.

MrNase 13.08.2004 21:36

So, jetzt hab ich ein Problem bei dem ich an mein Latein stosse..

Code:

while($row = $db->fetch($result))
          {
                  echo '<div />';
          }

Und damit lese ich Einträge aus der Datenbank aus. (ganz offensichtlich ;))

Da ich damit eine Bildergalerie generieren will brauch ich nach 4 Durchläufen ein <br /> und dann soll es mit <div /> weitergehen. Sodass ich am Ende sowas wie

<div /><div /><div /><div /><br /><div /><div /><div /><div /><br />
<div /><div /><div /><div /><br /><div /><div /><div /><div />

habe.

Wie muss ich die Schleife verändern?

TRS 13.08.2004 21:41

Zitat:

21:39 >> <Reimer`away> nase: Mit zählen: $i=0; in der Schleife $i um eins erhöhen; if i==4 echo <br />
Siehe IRC :D

MrNase 14.08.2004 00:23

Zitat:

[21:44] <nase_> http://paste.calitrix.de/29 ?
;)

Nun ein anderes Problem. Die Einträge habe ich ausgelesen, gut und schön. Nun möchte ich aber z.B. alle Einträge vom Mai unter der Überschrift 'Mai' haben damit es wie folgt aussieht:

laufender Monat
| Eintrag | | Eintrag | | Eintrag | | Eintrag |

Juli
| Eintrag | | Eintrag | | Eintrag | | Eintrag |


Wie muss ich da vorgehen? Brauche ich da mehr als eine Abfrage? Wie muss ich die While-Schleife verändern?

Patrick Gotthardt 14.08.2004 08:42

Du speicherst ja das Datum, an dem du den Eintrag erstellt hast, also kannst du dir mit Date einfach den Monat als Zahl wiedergeben lassen.

Beispiel:
PHP-Code:

<?php
 $result 
$db->query('SELECT * FROM entries ORDER BY posttime DESC LIMIT 25');
 
$lastMonth 0;
 while(
$entry $result->next()) {
     
$month date('n'$entry['posttime']); // n = "Numeric representation of a month, without leading zeros"
     
if($month != $lastMonth) {
         
$lastMonth $month;
         echo 
'<h1>'.getGermanMonth($lastMonth).'</h1>';
     }
     
// [...]
 
}
 
?>

Die Funktion "getGermanMonth" müsstest du noch implementieren, im Idealfall sollte sie den deutschen Namen des übergebenen Monats wiedergeben. ;)

MrNase 14.08.2004 13:41

Hallo,

Verstanden wie du es meinst habe ich es. Nur leider bekomme ich es nicht zusammengeschustert. Hier mal mein Code, vielleicht kannst du es ja zusammenbringen?!
PHP-Code:

  $Tarchiveintrag = new Template("./templates/archiveintrag.html");
  
  
$result   $db->query('SELECT * FROM eintrag ORDER BY id DESC LIMIT 1,40');
  
  
$i 0;
  
$lastMonth 0;    
  
  while(
$row $db->fetch($result)) {
      
  
$month date('n'$row['zeit']); // n = "Numeric representation of a month, without leading zeros"
      
if($month != $lastMonth) {
          
$lastMonth $month;
          
$monat '<h1>'.$lastMonth.'</h1>';
      }
      
$row['ueberschrift'] = chopstring($row['ueberschrift'],15);
     
$code "<div class=\"thumbnail\"><img src=\"bild.php?filename=".$row['bild']."&size=menu\" width=\"125px\" /><br />".$row['ueberschrift']."</div> \n\n";
      
      if(
$i == '4') {
          
$code '<br />';
          
$i 0;
      }        
          
      
$i++;
      eval(
$Tarchiveintrag->GetTemplate('ARCHIV'));
  } 

Hinterher soll es dann z.B. so ausehen:

laufender Monat
| Eintrag | | Eintrag | | Eintrag | | Eintrag | <br />
| Eintrag | | Eintrag |

Juli
| Eintrag | | Eintrag | | Eintrag | | Eintrag | <br />
| Eintrag | | Eintrag | | Eintrag | | Eintrag | <br />
| Eintrag | | Eintrag |

MrNase 15.08.2004 11:09

Guten Morgen,

Dank einer schlaflosen Nacht und MaMo der es gestern geschafft hat mir zu helfen bin ich nun schon was den eigentlichen Code angeht ziemlich weit vorgeschritten. :)

Zum generieren der Bilder verwende ich die gdlib, Bilder werden über die Datei 'bild.php' ausgegeben (z.B. <img src="bild.php?filename=pic_d36cac6cd40764fa7fd0496 bf2f89855&size=large" />)
Nun ist die bild.php relativ ungesichert und die GDLib geht ja ganz schön auf die Serverperformance. Deswegen möchte ich die bild.php gerne vor aufrufen von Aussen schützen.

Wie stelle ich es geschickt an? Eine htaccess -Datei die rausfindet ob die Anfrage von meiner Domain kommt und wenn nicht ein Fehlerbild ausgibt? Wenn ja, wer kennt weitere Quellen bzw. hat was zur Hand?

MrNase 18.08.2004 18:43

Huhu,

Ich schieb es mal nach oben in der Hoffnung doch noch ne Antwort zu bekommen :)

TRS 18.08.2004 22:06

Mit htaccess und Mod_Rewrite ist das relativ einfach möglich: www.trafficklau.de

MrNase 18.08.2004 22:42

Da hab ich schon geschaut.. Das Script soll nur ausgeführt werden, wenn z.B. die Seite

http://www.blatest.de/index.php die Datei http://www.blatest.de/bild.php als Bild einbindet. Da kann ich nicht mit einer htaccess-Datei arbeiten. Zumindest habe ich dort keine Funktionierende Lösung gefunden :(

codethief 08.09.2004 21:37

Hast du inzwischen die Lösung gefunden?
Wenn nicht:
Du könntest ja theoretisch die Grafikdatei mit einer PHP-Datei laden.
Sodass es dann in etwa so aussieht: <img src="pic.php?file=bild.jpeg" ... /> .
Die Bilddatei selber könntest du dann mit .htaccess schützen, da PHP .htaccess AFAIK umgeht und .htaccess somit keinen Einfluss hat.

PS: Kannst du mir eigentlich mal die URL deines feinen Weblogs geben? :)

exe 08.09.2004 21:57

Zitat:

Zitat von MrNase
Da hab ich schon geschaut.. Das Script soll nur ausgeführt werden, wenn z.B. die Seite

http://www.blatest.de/index.php die Datei http://www.blatest.de/bild.php als Bild einbindet. Da kann ich nicht mit einer htaccess-Datei arbeiten. Zumindest habe ich dort keine Funktionierende Lösung gefunden :(

Du könntest anhand der Refererangabe sowas in der Art basteln. Dabei müsstest du in der bild.php prüfen ob im Referer deine Domain steht. Sowas in der Art:
PHP-Code:

<?PHP
$myDomain 
'http://'.$_SERVER['SERVER_NAME'];
$referer  = isset($_SERVER['HTTP_REFERER']) ? substr($_SERVER['HTTP_REFERER'], 0strlen($myDomain)) : '';

if(
$referer != $myDomain) {
    die(
'Hau bloss ab ...');
}
?>

Allerdings ist das keine sehr sichere Methode da der Referer vom Client angegeben wird und daher auch beliebig gefälscht werden kann.

Eine sichere Methode gibt es da nicht da ein serverseitiges Script nicht feststellen kann ob der Client die Anfrage nach dem Bild aufgrund eines HTML-Befehls stellt oder nicht.

codethief 09.09.2004 07:18

Hm, ich hab bei mir die Möglichkeit übersehen, dass der User das Bild direkt über pic.php?file=wasweißich aufruft.

Nach langem Suchen habe ich doch noch den Artikel gefunden, den ich vor einiger Zeit gelesen habe:
http://aktuell.de.selfhtml.org/artik...ages/index.htm

Du könntest evtl. also so vorgehen:
<img src="<?php include('pic.php?file=bla'); ?>" ... />
Wobei pic.php den Inhalt der Bilddatei lädt.
Ich bin mir jetzt allerdings nicht sicher, ob man der zu includierenden Datei einen Parameter angeben darf. Ggf. musst du vor das include() noch ein $file = "datei.jpeg"; schreiben, wobei du dann in der pic.php auf diese Variable zugreifst.


Ich weiß es ist umständlich, aber immernoch besser, als sich aufwendige Grafiken klauen zu lassen und dann mit TrafficKlau leben zu müssen. ;)


Bis dann,

codethief


[EDIT]: Ich hab gerade bemerkt, dass diese Variante nicht überall funktioniert:
Zitat:

Zitat von SelfAktuell
Das funktioniert bei Netscape 4.x, aber leider nicht beim MS Internet Explorer 4.x - 5.x.



Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25