Beiträge von Arne Drews

    Erstmal #2 beachten. Sollte #3 stimmen, hätte es einen Fehler geworfen, bei korrektem ErrorReporting.

    Da das aber scheinbar nicht der Fall ist, sollte auch geklärt werden, ob allow_url_fopen in den Einstellungen aktiv ist, da ansonsten file_get_contents() gar nicht mit Remote-Daten umgehe kann/darf.


    Auch das würde einem der ErrorReport aber sagen, also: Bitte #2 beachten.

    Halt Dich nicht an von mir illusionierten Dingen auf. Die Frage bleibt, was bei Dir wirklich passiert.

    Du solltest Dir die Zeit nehmen, das mal im Detail zu erklären, am besten mit Link und/oder Code (produktiver!).


    Ich denke wenn, dann kann man Dir nur so wirklich weiterhelfen.

    Ein HTTP-Request kann auch schon mal ein paar Sekündchen dauern. In einem Zeitraum von 5 Stunden würde es mich nicht wundern, wenn man auf ne Ungenauigkeit von einigen Minuten kommt.


    Angenommen, der User löst durch seine Aktionen in den 5 Stunden 150 Requests aus und jeder Request dauert im Schnitt 2sek. ( kann an externe Abhängigkeiten liegen! ), dann hast Du schon 300s also gute 5 Minuten Ungenauigkeit. Und 150 Requests in 5Std. sind 30 pro Stunde, was nicht unwahrscheinlich ist.


    D.h., ich würde empfehlen, den Weg über Sessions zu gehen, um die User erkennbar zu machen und dann bei jedem Request den aktuellen Timer-Wert mitgeben, der Client seitig dann wieder als neuer Startwert für den JS-Timer genommen wird.


    Auch da ist es nie ganz genau, aber immer noch genauer, als wenn Du Dir etwas im LocalStorage speicherst und durch die Requests Verzug hast, den Du nicht ohne weiteres zur Berechnung heranziehen kannst.

    Das geht viel einfacher, Du speicherst den Zeitpunkt, an dem der User den Link klickt in der Datenbank, am besten als DATETIME und entfernst bei jedem HTTP-Request einfach alle, die älter 5Std. sind, oder wie auch immer Du den Status ausgelogged umsetzt.

    Dazu ist ein Timer gar nicht notwendig.

    Sonst wird ja der Code nicht ausgeführt.

    Naja, die filtern dennoch. Kannst ja mal versuchen, Schadcode darüber einzuwerfen, wird nicht klappen.

    Der Grund ist, weil die totzdem filtern, nur anders wie für ne simple Ausgabe.

    Warum sollte das für einen Code Editor ok sein? Die Basis bleibt ein Formular, dessen übertragenen Werte immer gefiltert werden sollten, sofern es von Benutzern ausgefüllt wird.

    Das ist sicher die gängigste Methode, aber nur als Alternative, um nicht mit Strings arbeiten zu müssen:

    PHP
    1. $x = 201978;
    2. $y = $x - (floor($x/100)*100);
    3. var_dump($y);    // Ausgabe: 78

    funktioniert natürlich nur, in der Kürze, wenn die gewünschte Zahl dahinter immer zweistellig ist.

    Eine Pauschalierung, was guter oder schlechter Codestil in Bezug auf ByValue und ByReference ist, halte ich für Glaubenskrieg.

    Jede Vorgehensweise ist in irgendwelchen Szenarien gerechtfertigt, kommt halt auch auf die Sprache an. In PHP nutze ich Referenzen auch fast gar nicht.

    Okay aber dann wäre PHP auch gefährlicher als JavaScript?

    Kommt auf die Sichtweise an. Mit PHP kannst Du grundsätzlich natürlich auf alles zugreifen, aber auch nur dort, wo PHP installiert ist!

    Und da PHP Server seitig läuft, besteht keine große Gefahr für den Client.


    Also aus meiner Sicht: Nein, für den Endbenutzer ist Java oder auch JavaScript gefährlicher. ;)

    Okay. Von ByValue oder ByReference habe ich noch nie was gehört. Danke für deine Beispiele. Diese haben mir die Funktion beider Übergaben etwas verdeutlicht.


    Eine Referenz ist ja nicht anderes als ein Verweiß auf die Originalvariable.

    Eine Kopie ist in diesem fall, die kopierte Originalvariable die man dann variabel verändern kann, da es ja eine Kopie und kein Verweiß ist.


    Ist dies richtig so?

    Ja, so könnte man das formulieren, denke ich.


    PHP kann übrigens auch Referenzen, so ist das ja nicht, es wird halt nur per default ByValue verwendet.

    Ein Beispiel für eine Referenz sähe bspw. so aus:

    PHP
    1. $sText = 'Hello';
    2. function RefMagic( &$_refvalue ) {    // <-- Referenzübergabe mit &
    3. $_refvalue .= ' World!';
    4. }
    5. RefMagic( $sText );
    6. var_dump( $sText );    // Ausgabe: Hello World!

    Hi,


    Nimm das nicht persönlich, ich schreibe Antworten nicht, um jemandem die Lust zu nehmen oder ihn in irgendeiner Weise nieder zu machen.

    Wer hat nicht auch mal angefangen und musste vieles erstmal lernen. ;)


    Dein Problem bestätigt mir allerdings meine Ansicht, dass es nie eine gute Idee ist, Tools zu verwenden, wenn man die Grundlage und Basis nicht verstanden hat.


    Ich gebe Dir mal ein kleines Beispiel, was ich meine (vielleicht weißt Du das ja schon, aber nur zum Verständnis):

    Gegeben sei folgendes HTML

    HTML
    1. <div class="dates">
    2. <input id="userdate">
    3. </div>

    Um das Element <input> zu selektieren, muss bspw. dieser Pfad verwendet werden .dates #userdate, d.h. in gesprochenen Worten: Element mit der ID(#) userdate, das sich als Kindelement in einem Element mit der CLASS(.) dates befindet.


    In CSS sähe die Selektierung so aus:

    CSS
    1. .dates #userdate { ... }

    JavaScript macht nichts anderes, ganz egal ob nativ oder per Library/Framework.

    Grundsätzlich sähe das in JS in etwa so aus:

    JavaScript
    1. var _dateElement = querySelector( '.dates #userdate' );

    ginge auch direkt über getElementByID('#userdate'); und noch weiteren Methoden, aber bei querySelector() sieht man die Äquivalenz zum CSS-Pfad sehr gut.


    Auch jQuery - was Du verwendest - macht es nicht anders, die haben nur eine Methode zur Verfügung gestellt, die mit $ benannt wurde. Du kannst also querySelector() einfach mit $ ersetzen und hast das selbe Ergebnis:

    JavaScript
    1. $( '.dates #userdate' );

    Da steckt also keine große Magie hinter ;)


    Ok, das war jetzt hoffentlich nicht zu viel zu dem Thema?!

    Was am Ende klar sein sollte, wie man Elemente selektiert, die man ansprechen/verändern möchte.


    Denn wenn das klar ist, sollte auch klar sein, was dieses Script hier macht:

    JavaScript
    1. $(function date(){
    2. $('.dates #user1').datepicker({
    3. 'format':'yyyy-mm-dd',
    4. 'autoclose': true,
    5. }).datepicker("setDate",'now');
    6. });

    Step by Step heißt das:

    $('.dates #user1') selektiert also das Element, wie oben beschrieben. Als Resultat erhalten wir ein HTMLElement-Objekt auf das Du per Chaining ( der . ) eine weitere Methode anwenden kannst, hier die Methode datepicker().

    format und autoclose sind Parameter, die als ein Objekt an die Methode übergeben werden, daher die geschweiften Klammern.


    Was also grundsätzlich fehlt - zumindest in dem von Dir gezeigten Code -, ist das Element .dates #user1.

    Weiterhin denke ich, dass das JS eher so stimmen müsste:

    JavaScript
    1. $(function date(){
    2. $('.dates #user1').datepicker({
    3. 'format':'yyyy-mm-dd',
    4. 'autoclose': true,
    5. });
    6. });

    weiterhin vorausgesetzt, er findet das Element .dates #user1.


    Ich hoffe, das war einigermaßen verständlich?

    Musst Du nicht so machen, ist nur eine Möglichkeit, mit der man gleichzeitig Kontext bezogen das E-V-A Prinzip einhält.

    Der String war auch nur als Beispiel gedacht. Du kannst Deinen Code auch auslagern in eine Datei, Datenbank wäre zwar noch besser, aber der Einfachheit halber bleiben wir mal bei der Datei, dann sähe die ungefähr so aus ( Platzhalter ohne Bezug auf Dein Script ):

    HTML
    1. <section>
    2. <a class="a-modul" href="{target}">
    3. <h4 class="header-tabelle">{headline}</h4>
    4. <figure>
    5. <img class="vorschauIMG" src="{img.path}" alt="{headline}">
    6. </figure>
    7. </a>
    8. <p>{title}{subtext}</p>
    9. </section>

    Das kannst Du für jede <section> mit file_get_contents einlesen und die Parameter ersetzen:

    PHP
    1. echo strtr(
    2. file_get_contents( './tmp/section.html' )
    3. , [
    4. '{target}' => 'arbeiten01.html',
    5. '{headline}' => 'Drifters, 2012',
    6. '{img.path}' => '/mediaordner/web01/preview_images/01-00.jpg',
    7. '{title}' => 'Perfor&shy;mance',
    8. '{subtext}' => '<span>Kunsthalle Münster,</span><span>Speicher II, Münster</span>'
    9. ]
    10. );

    Ergebnis:

    HTML
    1. <section>
    2. <a class="a-modul" href="arbeiten01.html">
    3. <h4 class="header-tabelle">Drifters, 2012</h4>
    4. <figure>
    5. <img class="vorschauIMG" src="/mediaordner/web01/preview_images/01-00.jpg" alt="Drifters, 2012">
    6. </figure>
    7. </a>
    8. <p>Perfor&shy;mance<span>Kunsthalle Münster,</span><span>Speicher II, Münster</span></p>
    9. </section>

    Die Ersetzungen kommen dann natürlich aus Deinem Array, ich habe das hier nur als Beispiel statisch gemacht.


    Damit hast Du u.a. auch den Vorteil, dass Du relativ einfach ausgelagerte Blöcke Deiner Seite ändern kannst, ohne das gesamte Script anzufassen.

    Das ist der erste kleine Grundstein auf dem Weg zum Templating, daher Variante T ;)

    Ich schlage Variante T vor:

    Zunächst mal gibt es das Element .dates #user1 nicht, was soll er also verknüpfen?!

    Da ich davon ausgehe, dass hier mal wieder relevanter Code gekürzt wurde und es heißt, dass es das Element im Original-Code gibt, läuft es auf ein Ratespiel raus.


    Btw., warum macht man das:

    PHP
    1. echo " <td>";?><script type="text/javascript">date();</script><?php echo "</td>\n";

    bleib konsequent in einem Kontext, entweder

    PHP
    1. echo '<td><script type="text/javascript">date();</script></td>';

    oder ausbrechen

    HTML
    1. ...
    2. ?>
    3. <td><script type="text/javascript">date();</script></td>
    4. <?php
    5. ...

    Ausserdem würde ich den Aufruf der Funktion am Ende des DOM machen bzw. in einem entsprechenden load-Event