Beiträge von Tobse

    Das ist rein Programmiertechnisch nur ueber JavaScript loesbar. Wenn du in einer HTML-Seite irgendwas anklickst, dann geht der Focus darauf. Ist das einfach ein leerer Bereich oder Text, passiert garnichts. Ist es ein Link, bekomt dieser quasi "mitgeteilt" : "hey, DU hast den Fokus". Was dazu fuert, dass der "Link" ein neues Fenster mit deinem Impressum aufmacht, sich selbst anders darstellt, um dem Benutzer aufzuzeigen: "HIER ist der Focus". Um das geoeffnete Fenster kuemmert sich der Link dann nichtmehr.
    Fazit, irgendwer muss dem Link "mitteilen", dass der Fokus weg ist. Das geht in JavaScript ueber x.blur(); Da das aber dein Impressum ist, sollte es nicht von JS abhengen.

    HTML
    <a href="impressum.html" target="_blank" onload="link=this;this.href='void()';this.target='';this.onclick=function(){var w=window.open('impressum.html');w.onclose=function(){link.blur();}}">Impressum</a>

    Was machst du denn da fuer rechnerreien fuer r?!?

    HTML
    <textarea name="bla" rows="2" cols="40" onkeydown="if (keypress(event)=='enter')adjust(this);"></textarea>
    Code
    function adjust(element) {
        var br=element.value.split("\n").length;
        if (br>2) element.rows++;
    }


    Ich habe es nicht getestet, sollte aber funktionieren.

    Schon gewusst, das wenn man am Sylverterabend rote Unterwäsche trägt alle deine Wünsche in Erfüllung gehen ?
    Einige behaupten sogar, das gerade die erotischen Wünsche besonders gut in Erfüllung gehen *grins
    In diesem Sinne und wünscht euch für das neue Jahr mit der roten Unterwäsche alles das, was ihr gerne mit eurem jetzigen oder zukünftigen Wunschpartner gerne machen würdet.


    Einbildung ist auch eine Bildung ^^

    Ich benutze das @ garnicht. Mir faellt leider momentan kein genaues Beispiel ein, wann man das @ wirklich sinnvoll einsetzen kann, um einen unnoetigen Fehler zurueckzuhalten. Aber es gibt ja vieles, aber im grossen und ganzen stimme ich mit Pion ueberein.

    Was mir jetzt aber neu ist, dass es nur 3 Fehlermeldungen gibt.

    Nicht böse gemeint, aber diesen Beitrag "Tutorial" zu nennen, ist heftig überzogen.


    Nein, natuerlich gibt es mehr. Aber ein E_NOTICE zu falsch zu bearbeiten ist recht schwierig.

    Keine gute Idee, wenn man aus irgendeinem Grund eine Injection zulässt, bekommt ein Angreifer so das Tabellenformat wesentlich schneller raus…


    Oh, danke das dus sagst. Ich editier den Post gleich und fuege noch was an.


    Außerdem sollte man sich auch um E_NOTICE kümmern, das sind echte Performance-Bremsen, auch wenn man sie ignoriert. Aus dem Grund auch das @ nur benutzen, wenn es keine andere Möglichkeit in PHP gibt.


    Im ersten Code-Tag steht doch im kommentar, dass durch E_ALL viel Zeugs durchkommt, dass man in der Live-Version nicht brauchen kann und daher auf jeden fall unterdruecken sollte, aber beim Programmieren und Debuggen unbedingt beachten muss. E_NOTICE sind meistens wichtige dinge, ja, auch auf den Programmierstil bezogen wie "undefined Variable".

    THX fuer das gute Feedback.

    @Unregistriert: Ja, ich uebe noch, ich versuchs aber noch zu verbessern ;)

    Da in letzter Zeit öfters Code von TS's gepostet wurde, der Fehlermeldungen ausgespuckt hat, zusammen mit der Frage, was falsch ist, habe ich dieses Tutorial erstellt. Kritik ist willkommen, aber bitte Konstruktiv.

    Fehlerbehandlung in PHP
    Um immer alle Fehler zu sehen, sollte man folgendes an den Anfang seiner PHP-Dateien setzen:

    PHP
    error_reporting(E_ALL);
    ini_set("display_errors", "true");

    Hier werden evtl. viele NOTICE-Errors kommen. Daher sage ich zu denen auch noch was:
    Ein E_NOTICE kommt meistens durch Unstimmigkeiten im Programmcode zustande. z.B.:

    PHP
    <?php
    error_reporting(E_ALL);
    echo $a*5;
    ?>

    Hier wird mit einer nicht-definierten variable gerechnet. Die Zählt PHP normalerweise als Null,
    aber wenn alle Errors an sind, erhält man eine Fehlermeldung.

    Zitat


    Notice: Undefined variable: a in foo.php on line 3

    Hier könnte z.B. eine falsch geschriebene Variable der Grund für ein falsches Ergebnis sein, für das man evtl. seine Rechnung verantwortlich macht.
    Der simpelste Fehler ist der Syntax-Error. Jedoch sind die Meldungen von PHP da nicht immer ganz eindeutig.

    PHP
    <?php
    echo "Hello World;
    ?>

    Das hier ergibt folgende Fehlermeldung:

    Zitat


    Parse error: syntax error, unexpected $end, expecting T_VARIABLE or T_DOLLAR_OPEN_CURLY_BRACES or T_CURLY_OPEN in /users/cptest/www/foo.php on line 3

    PHP sagt uns hier, das Script hört unerwarteterweise auf. Warum? da gibt es doch ein ?>.
    In PHP kann man beliebig viele Zeilenumbrüche in einen String packen. daher parst PHP den Code bis zum >, weil der String nicht geschlossen wurde. Aber beim > hört das Script auf und das ergibt die Fehlermeldung.

    PHP
    <?php
    echo "Hello World";
    ?>

    Hier parst PHP nur bis zum zweiten " und gibt den String aus, kein Fehler.

    Eine komplexere Form des Syntax-Errors wäre z.B. das hier:

    PHP
    <?php
    $foo="DeFbArxYZ";
    if (strToLower(htmlspecialchars(mysql_real_escape_string(substr($_GET['bla'], 3, 4))) == strToLower(substr($foo, 3, 3))) {
     echo "Ja";
    } else {
     echo "Nein";
    }
    ?>

    Und hier verliert man leicht die Übersicht. Da hilft natürlich erstmal ein Editor mit Syntaxhighlighting, der die Klammern hervorhebt. ;)
    Jedenfalls, PHP meckert hier:

    Zitat


    Parse error: syntax error, unexpected '{' in /users/cptest/www/foo.php on line 3

    Da hilft es, zumindest gedanklich die Bedingung auseinanderzunehmen, denn einfach irgendwo eine Klammer setzen macht keinen Sinn.

    Und man erkennt ziemlich schnell, das strToLower im ersten teil der Bedingung nicht geschlossen ist.
    Btw: Wenn das script mit einer Datenbank verbunden ist, ist die Ausgabe: Nein

    Die Fehlermeldung des Typs "Warning" sind ähnlich zu behandeln, sie betreffen aber eher weniger den Code an sich. Ein typischer Fehler dieser Art ist dieser:

    Zitat


    Warning: Cannot modify header information - headers already sent by (output started at foo.php:3) in /users/cptest/www/foo.php on line 4


    Das tritt immer dann auf, wenn man bereits eine Ausgabe gemacht hat, und dann die Funktion header() benutzt. Hier hilft es, das Script von vorne durchzugehen und die erste Ausgabe zu suchen.
    Und weiter zum Tod jedes Scripts, zum Fatal-Error. Der kommt in den meisten Fällen bei Datenbankabfragen, daher nehme ich das im Beispiel.

    Das fuehrt zu einem Fatal-Error bei $query->fetch_array().

    Zitat


    Fatal error: Call to a member function fetch_array() on a non-object in /users/cptest/www/foo.php on line 5

    Da gibts 2 moeglichkeiten, das Problem zu loesen.
    1. Die mysql_* Funktionen benutzen und in diesem Fall nur ein Warning anstadt einem Error zu erhalten\
    2. Pruefen, ob das Query durchgegangen ist und nur dann fetch_array() aufrufen.

    Es ist wohl offensichtlich, dass hier 2. die bessere Idee ist.

    Und damit kommen wir zum 3. Punkt, die Fehler bei SQL-Statements.
    Nun kommt schonmal keine Fehlermeldung mehr, aber wissen, wo das Problem steckt, weis man immernoch nicht. Dazu steht die variable $error im mysqli-Object bzw. die mysql_error() funktion bereit.
    Von den beiden erfahren wir naemlich immer, was gerade falsch lauft.
    Wenn man also von einer If-Abfrage erfaehrt, dass der Query fehlgeschlagen ist, dann immer

    PHP
    echo mysql_error();
    // b.z.w.
    echo $db->error;

    EDIT:
    Hier empfiehlt es sich jedoch, um SQL-Injector Angreiffern das Leben schwerer zu machen, diese Funktion zu benutzen:

    Im allgemeinen: Bitte ALLE Fehlermeldungen GENAU anschauen, mit dem Code abgleichen und dann verbesern ;)

    Ich finde auch, dass es abnimmt, bin aber mom. auch im Urlaub, aber FH ist daheim sogar meine Startseite. Muss mich da auch sejuma anschliessen. Man muss aber auch die Positive Seite sehen:
    In den Zeiten, in denen die Registrierten wenig Zeit haben (d.h., viele andere ja auch) sind es sogar 159 Gaeste. Das sieht fuer mich nicht wirklich nach "untergang" sondern eher nach uebergang zum nachschlagewerk aus.

    Hehe, ja, der IE... Das ist halt MS. vor Jahren haben die Open-Source'ler JS eingefuehrt und JS ist sofort im Netscape, Opera und bla. Deswegen war MS gezwungen, JS einzubauen, um Webseiten weiterhin anzeigen zu koennen, fuer eine eigenentwicklung wars zu spaet. Aber da MS ja alles andere als fuer open source ist, ham sie warscheinlich die JS-Funktionen abgeaendert, ich glaub, um JS unattraktiv zu machen, weil alle aufn IE aufpassen muessen xD. Hat aber nich geklappt...

    Zitat

    Es war auch eher als Denkanstoß gedacht. Habe noch ein wenig daran rumgebastelt, vielleicht schreib ichs auch als jQuery plugin um, was sich treffen würde, da ich ja jQuery verwende.


    Joa, evtl scheib ich auch mal eine jQuery-Version, hatte ich auch mal vor. Hatte vor langer zeit mal ein jQuery Kontextmenue geschrieben, ist aber nicht so ausgereift.

    Wie system zu aendern? So wie ich das sehe hast du in der valid_user.php das problem, gib uns mal bitte den kompletten quellcode von valid_user.php. Und sag uns bitte auch, was in der action vom formular steht, mit dem du dich einloggst. Von der datei bitte auch den kompletten quellcode.

    Aehm, ok, ich konnte das jetzt nicht testen aber so wie es aussieht fehl da der platz wo die momentane auswahl drin steht. Das ganze ist glaub noch etwas verbeserungswuerdig. Gut qaere es auch, wenn du es als jQuery plugin-in schreiben koenntest, dann kann man dein plugin auch mit css-selektoren einsetzen, wie z.b. $(".jsCombobox").combobox({opti:ons});

    Alles in allem find ichs aber gut, dass du dir die muehe gemacht hast, mich nerven diese standard-dropdowns auch immer xD

    @Alle, die das verwenden:
    Vergesst nicht, auch fuer die user ohne js die funktionalitaet zu erhalten.

    Mein problem mit der db ist halt folgendes:
    Sowas wie Sprachelemente sind total common. Das wird bei jedem Seitenaufruf verwendet. Das mit der Datei spart meiner ansicht nach einfach zeit und kann evtl. bei einer seite die sonst keine Datenbankverbindung brauchen wuerde diese sparen. Hier ein Bsp:
    Das CMS dass ich mom. fuer ein Projekt verwende hat folgende funktionen:
    Templates, eines fuer jede seite
    Seiten in der DB-Speicherbar
    Seiten als PHP-Objekt
    Navigation auch ueber die DB steuerbar (Die navi wird vom Template erzeugt)
    Plugins als PHP-Objekt, aktive in der DB eingetragen
    Seitenlayout (spalten) in der DB
    Dadurch kommen insgesammt (pro Seitenaufruf) 7 Querys zusammen. Da ich ja nichts ueber eine HTML-GUI steuern koennen muss, hab ich durch das schreiben von nem eigenen template, dass weder spalten noch die Navi aus der DB liest nurnoch 1 query, den fuer die Seite. Und den unterschied hat man beim benutzen eindeutig gemerkt.

    Und wie machst du das auf fileebene? Wuerde man eine Tabelle fuer alle Texte anlegen, dann braeuchte man noch zusaetslich eine spalte, um zu speichern, auf welcher seite die angezeigt werden, also

    Code
    schluessel|page (primary)|englisch|deutsch


    und dann im konstruktor das dann damit abfragen:

    PHP
    "SELECT schluessel, english FROM language_items WHERE page='CURRENT_PAGE'"


    Was aber, wenn ein text fuer mehrere bereiche verfuegbar sein soll? Doppelt eintragen ist da wohl ein no-go. Im Dateisystem kann man einfach alle dateien laden, die man braucht und spart sich die page-spalte.

    P.S.: Ich habe das nur so ausgefuehrt, um dem TS die Moeglichkeit aufzuzeigen.

    Angenommen, die methode get(String key) saehe so aus:


    Dann glaub ich nicht, dass das kuerzer ist, als es aus einem array rauszuhohlen, dass aus einer datei entstanden ist. Zumal, soweit ich weis, php dateien auch cached.