Beiträge von cottton

    http://de1.php.net/manual/de/mysqli.query.php
    mysqli_query() gibt einfach false zurück, weil die db "nichts gefunden hat". (hat ja wolf schon gesagt)

    In solchen Fällen immer die Query ausgeben und in (zB) phpMyAdmin testen.

    PHP
    echo "SELECT
        *
    FROM
        `autority`
    WHERE
        LOWER(`benutzername`) = '" .mysqli_real_escape_string( $conid, $benutzername ). "' AND
        `passwort` = '" .mysqli_real_escape_string( $conid, $passwort ). "' AND
        `aktiviert` = 1";

    Nein.
    Aber jede Tabelle sollte einen eindeutigen Ident besitzen.
    Normalerweise ist das ein Feld:

    Code
    `id` UNSIGNED INT NOT NULL AUTO_INCREMENT PRIMARY KEY


    und nochmal zur besseren Übersicht:

    Code
    `id`  -- name der spalte
    UNSIGNED  INT  -- integer (ganze zahl) (UNSIGNED bedeutet keine vorzeichen - also "kein minus", nur positive zahlen)
    NOT NULL -- kein datensatz darf in diesem feld den wert NULL (nicht gesetzt) besitzen
    AUTO_INCREMENT -- ~"zähle diesen wert automatisch hoch"
    PRIMARY KEY -- dieses feld ist der primäre schlüssel, also eine eindeutige id

    "ON DUPLICATE KEY UPDATE" greift hier immer dann, wenn Du ein INSERT auf eine `id` versuchst, die es bereits gibt.
    Aber auch
    wenn Du zB ein Feld `name` auf den Index-Type "UNIQUE" (einzigartig) stellst.

    Ja, geht. Nennt sich "ON DUPLICATE KEY UPDATE".
    Bsp:

    SQL
    INSERT INTO
        `tbl_name`
    SET 
        `col_name` = 'abc',
        `col_name_2` = 'x'
    ON DUPLICATE KEY UPDATE -- wenn ein einzigartiger (unique) schlüssel schon existiert, dann update
        `col_name_2` = 'x'

    EDIT:
    Dabei ist aber zu beachten, dass eine evtl `id` AUTO_INCREMENT "trotzdem" hochgezählt wird.
    Heißt:
    angenommen
    `id`(PRIMARY KEY , AUTO_INCREMENT) ist momentan bei 1
    und du schickst diese Query ab:

    SQL
    INSERT INTO
        `tbl_name`
    SET 
        `id` = '1',
        `col_name` = 'value'
    ON DUPLICATE KEY UPDATE
        `col_name` = 'value'


    dann wird beim nächsten INSERT (einem wirklich neuem Datensatz) die `id` 3 sein.
    Denn mysql Server behandelt dieses Statement wie 2 Anfragen:
    ein INSERT und ein UPDATE.

    Dabei geht er in etwa so vor:
    - starte INSERT auf `id` 1
    - zähle AUTO_INCREMENT +n (normalerweise +1)
    - INSERT auf `id` 1 schlug fehl - Schlüssel existiert bereits
    - UPDATE auf `id` 1

    der "interne" AUTO_INCREMENT (-Wert) für den nächsten einzufügenden Datensatz ist also schon um 1 erhöht,
    auch wenn er bei der letzten Anweisung nicht genutzt wurde.

    Zu dem Thema findet man einiges im Netz - Stichworte "mysql id gaps on duplicate key update"

    Das kannst Du bei der Verkettung machen.

    PHP
    $headers = 'From: ' . $_POST['Vorname'] . ' ' . $_POST['Nachname'] . ' ' . $_POST['Email']. "\r\n" .

    nochmal an einem anderen Bsp:

    PHP
    $var = 'text ' . // mit punkt verkettet
        ' ' .  // ein leerzeichen, und wieder der punkt zum verketten
        ' text text ' . ' ' . ' noch mehr text ' . $bsp_var;


    Kann verwirren. Du könntest ein Leerzeichen auch in eine Variable packen:

    PHP
    $leerzeichen = ' ';
    $headers = 'From: ' . $_POST['Vorname'] . $leerzeichen . $_POST['Nachname'] . $leerzeichen . $_POST['Email']. "\r\n" .

    "From" ist der Sender, also der Absender, der Server.
    Wenn Du also ein Kontaktformular hast, welches den Inhalt zu Dir selbst schickt,
    dann ist der Absender "From" der Server.

    // am Beispiel #2 von http://php.net/manual/de/function.mail.php

    oO?

    Wo wir gerade das wieder oben haben:
    nutze seit einiger Zeit mein "Bettel-Script". Der Sinn dahinter soll sein, den Nutzer dazu zu bewegen den Adblock zu deaktivieren.
    Die Zahlen zeigen mir seit rund 2 Monaten, dass mehr Nutzer als gedacht darauf positiv reagieren - sprich: den Adblock deaktivieren.

    Hier das simple Script:
    (kein HickHack - free for use/change/what ever ... Verbesserungsvorschläge erwünscht)
    (die ad ist ~deaktiviert, aber zum Testen reichts -- wenn Adblock an, dann Meldung)

    Eine selbstgebaute Seite ist besser für dein Ego


    Japp :D

    CMS oder Framework, oder "Mini-CMS-Framework" oder was auch immer ...
    Das beste für Dich selbst ist, wenn Du Dir ansiehst wie es (richtig) geht, und dann selbst schreibst.

    Bsp Dateiupload:
    Du siehst Dir an, was alles beachtet werden muss, schreibst Dir ein Tool (Funktion oder Klasse) und weißt dadurch
    - wie es geht
    - dass Du es nicht immer wieder komplett von null schreiben musst
    - dass Du keine (wie The Scout schon sagte) "Standardfehler" nutzt
    - keiner auf Anhieb weiß, ob oder wo Du evtl Sicherheitslücken hast

    Ich hoffe das war einigermaßen verständlich


    Ja, doch =)
    mit ner anonymen Funktion ist es mMn dann am sinnvollsten. Denn wenn this in der Methode "auf einmal" der Button ist, verwirrt das nur unnötig :D

    Falls es jemand noch mal testen möchte:

    Das funktioniert schon mal :D Danke.
    Verstehe aber nicht, warum this.button.onclick nicht funktioniert.
    EDIT: ich Depp - habs ja nicht kopiert, sondern durch die Klammern () ausgeführt.


    Und bekommt man denn nicht irgendwie this (das Objekt von MyClass) in die Methode?
    Hab das bisher auch immer mit direktem Name angesprochen, aber das muss doch in JS möglich sein.

    Das hier funzt leider nicht:

    JavaScript
    this.button.addEventListener('click', this.change(this), false); // this an change() übergeben
    // ...
    change:function(obj) // this als obj entgegen nehmen
    {
        //alert(this.textfield.value)
        /*this.container.innerHTML = this.textfield.value;*/
        obj.container.innerHTML = obj.textfield.value;
        return;
    }

    Moin, irgendwie steh ich aufm Schlauch.
    Ich komm nicht dahinter, wieso die onclick Funktion nicht mach, was sie soll:


    Wie bekomm ich denn das onclick da "rein" oO?

    "versteckt.php"
    mach sowas nicht. Sowas wird Verschleierung genannt und ist nicht sicher.
    Sicher ist, wenn es "egal" ist, ob es jemand kennt, aber trotzdem keiner "ran" kommt.

    Angenommen Du hast
    - index.php
    - admin.php
    - login.php
    - logout.php

    Dann ruft Nutzer beim Aufruf der URL (http://deine-seite.de) die index.php auf.
    Da drin hast Du Deine Navigation
    "Startseite | Bilder | Admin".

    Auf der Startseite braucht niemand eingeloggt zu sein. Die Bilder darf auch jeder sehen.
    Aber die Seite Admin braucht einen Login.
    Hinter dem Admin-Button ist ein Link zu "admin.php".

    In der admin.php kommt nun eine Prüfung, ob Nutzer eingeloggt ist. Wenn nicht: umleiten zum Login
    admin.php


    Wie The Scout schon sagte: Skript beenden, damit nichts passiert, falls header versagt.
    Aber auch wenn header() funktioniert, wird das Script durch header() nicht beendet.
    Also nach header() immer exit() (sehr selten will man, dass es weiter läuft).

    Der Nutzer landet in der login.php und muss sich anmelden.
    Dort sollte man auch gleich prüfen, ob denn Nutzer schon eingeloggt ist.
    Denn er kann ja die Seite auch manuell aufrufen. Wenn er also schon eingeloggt ist,
    dann kann man zB eine Meldung ausgeben wie: "Du bist schon angemeldet".
    login.php

    Jetzt der Logout-Button:
    Hinter dem Logout-Button ist ein Link zu "logout.php".
    logout.php

    Das wäre ein einfacher Login.
    Jetzt zum Timout:

    In der admin.php baust Du The Scout´s check ein:
    admin.php

    EDIT:
    in der bilder.php (und allen anderen Seiten) musst Du den Zeitstempel "last_action" auch aktualisieren:
    bilder.php

    PHP
    session_start();
    // die last_action setzen zwecks timeout:
    $_SESSION['last_action'] = time(); 
    
    
    
    
    // ...

    seitens PHP:

    $_COOKIE
    oder
    $_SESSION
    (oder Datenbank, oder Memory).

    Du musst Dir halt irgendwo hinschreiben, wann die letzte Aktion war.
    Dann prüfst Du, ob die letzte Aktion länger her ist, als von Dir gewünscht.
    zB

    PHP
    if( $_SESSION['last_active']+10 < time() ) // wenn *letzter aufruf* + 10 sek kleiner ist als *jetzt*
    {
        // letzer aufruf zu lange her
    }