Beiträge von cottton

    Ich meinte ja nicht, dass es falsch wäre. Hätte mich da besser ausdrücken können =)

    Wegen prepare()
    prepare ist nicht dazu gedacht eine Query mehrfach wieder verwenden zu können. Man muss sie also nicht ~zwischenspeichern o.ä.
    Man kann die einmal angeschickte Query zwar mit anderen Werten wieder verwenden, ohne diese nochmal zu ->prepare´n,
    aber Geschwindigkeit bringt das nicht. (getestet mit tausenden ->prepare() und das Ergebnis lag bei mircosecs)
    Es geht dabei eher um die Vorbereitung der Query (Platzhalter ect).

    Ich bevorzuge auch immer prepare zu verwenden.
    Denn sobald man was im Code (der Query) ändert, KÖNNTE man übersehen, dass man query() anstatt prepare() verwendet hat.
    Man würde zwar in dem Fall einen Error um die Ohren bekommen, weil der SQL-Server mit evtl neu hinzugefügten und unersetzten Platzhalten nicht klarkommt,
    aber ich gehe dabei immer vom (meinem) Prinzip aus: alles was schief gehen könnte gleich ~abfangen

    Du solltest via ajax aber aufpassen, dass Du eine Identifikation des Nutzers vornimmst, wenn nur Registrierte Benutzer voten dürfen.
    Wenn "Gast" voten darf, dann solltest Du klären, wie oft er auf das jeweilige Bild voten darf.

    Vom Sinn her sollten nur Reg. Nutzer voten dürfen.
    Als Gast kann man immer wieder eine Neue Identität annehmen (IP, cookie oder localStorage(-löschen)).

    Wie:
    per PHP erstellst Du di Button (zB wie wolf schon schrieb).
    Dabei hast Du sicherlich festgestellt, ob der Nutzer existiert und eingeloggt ist.

    (jetz kommt was falsches)
    Nun könntest Du die User_id mitgeben, um diese via Ajax an den Server zu identifikation zu senden.
    Aber: via "Bruteforce" könnte jemand sämmtliche möglichen IDs an diese Adresse senden und ... naja.

    (richtig)
    einen ident erstellen, den man nicht "erraten" kann:
    via PHP stellst Du fest: user ist eingeloggt.
    Nun erstellst Du eine Session:


    $ident schreibst Du mit in JS/HTML, dmait es dort verfügbar ist. Via Ajax sendest Du diese id dann mit, damit Du auf der Serverseite via PHP prüfen kannst,
    ob der User existiert - also:

    PHP
    if(isset($_POST['ajax_ident'])and isset($_SESSION['ajax_ident'])and $_POST['ajax_ident'] == $_SESSION['ajax_ident']){
        // ok
    }else{
        // nicht ok
    }

    Besser wäre wohl ein Cookie, denn die SESSION ist ja nach x min Untätigkeit weg.
    (btw: eine SESSION wird bei jedem Ajax-Aufruf erneuert)

    Der (fatale :D) Fehler den Scout gepostet hat
    plus:

    die SQL-Abfrage sollte so aus sehen:

    SQL
    INSERT INTO `eintraege` 
    (`autor`,`titel`,`datum`,`news`) -- du hattest das hier vergessen =)
    VALUES(:autor, :titel, :datum, :news); -- hier habe ich '', weggelassen. es ist unnötig einer auto_increment id einen leeren string mitzugeben

    bei ->bindParam gibts nen Tippfehler bei "news"
    (daher der Fehler, den Du bekommen hast. Denn so ging PHP von 5 Parametern aus: :autor, :datum, :titel, :news und :news: )

    PHP
    $stmt->bindParam(":autor", $autor);
    $stmt->bindParam(":datum", $datum);
    $stmt->bindParam(":titel", $titel);
    // $stmt->bindParam(":news:",  $news); doppelpunkt fehler ":news:"
    $stmt->bindParam(":news",  $news); // richtig

    meine Empfehlung: (ohne bindParam())


    @Scout
    das macht nix.
    Man kann eine Query durch ->prepare jagen, ohne darin einen einzigen Platzhalter zu verwenden. Es ist also nicht falsch.

    btw: ASC und DESC, wie auchTabellennamen ect, kann man nicht mit Platzhaltern einsetzen.
    Und genau das, was iphone hier gemacht hat ist der korrekte weg. (Will das nur noch mal erwähnen, da ich es für wichtig halte)

    PHP
    if ($sort != "ASC" && $sort != "DESC") {
            return -1;
        }


    $sort kann also nur ASC oder DESC enthalten und es ist keine SQL-Injection durch diese angehängte Variable möglich. :thumbup:

    Falls jemand mal ein Array bei Verwendung von Schlüsseln verschachteln muss:

    array array_merge_recursive_bykeys ( array $source , array $para [, bool $check_on_duplicate_key = true, array &$unassigned ] )

    Parameters
    $source
    The input array

    $para
    string [0] => target key
    string [1] => extends key
    string [2] => sort key
    string [3] => create sub level key

    $check_on_duplicate_key
    throw Exception on duplicate key (default true)
    if false the duplicates will be ignored

    $unassigned
    unassigned levels will be pushed into the given array


    Return Values
    An array of values resulted from merging/sorting.

    Examples

    Die Function:

    Die Statements sind ok.
    Allerdings sagt Dir die Fehlermeldung: Unbekannte Spalte `spalte2`
    Warum:

    SQL
    ALTER TABLE -- ändere Tabelle 
        a_gemuese -- Tabellenname
    ADD COLUMN -- füge (eine Spalte) hinzu 
        land -- Spaltenname
    VARCHAR (75) -- vom Typ soundso
    AFTER spalte2; -- nach Spalte `spalte2` *** und diese `spalte2`existiert nicht ***


    `spalte2` muss also existieren, um etwas dahinter anzuhängen
    :)

    Tu Dir das nicht an. Du kannst zwar so viele Spalten anlegen, allerdings geht die Perfermance flöten.
    Unter Umständen geht das soweit, dass Du von dieser Tabelle kein Backup (Sicherung) erstellen kannst.

    Am besten Du nutzt für jede Sprache eine Tabelle.


    So oder ähnlich.

    HTML5 macht das Leben angenehmer. Vor allem für Menschen wie mich, die nicht gerne damit arbeiten wollen :D
    Gehört ja auch audio und video und shadows und canvas ect dazu. Als hat schon was.
    Hab letztens gehört, dass man sogar schon "Klick-Events" abfangen kann.
    Wenn das so weiter geht, dann is nix mehr mit "HTML ist keine Programmiersprache" :D

    Da ich mir gerade C++ ansehe und Referenzen in PHP jetzt besser verstehe wollte ich das hier mal Teilen (PHP ist ja in C/C++ geschrieben):

    Eine Referenz ist ein Alias.
    Die Referenz (also der Alias) zeigt auf die gleiche Adresse im Speicher (RAM).

    Heißt:
    Wenn ich eine Variable in C++ erstelle die vom Typ int ist, dann belegt diese Variable 4 Bytes im RAM.
    Der RAM hat Byte für Byte Adressen - zB 0xfff1.

    Die Referenz ist also keine Kopie.
    Die Referenz geht nicht über Umwege.
    Sondern die Referenz zeigt direkt auf diese Speicheradresse im RAM.

    Das wiederum erklärt, warum Variablen die als Referenz in eine Funktion aufgenommen werden auch Auswirkungen auf draußen haben.
    Die Variable verfällt, sobald die Funktion beendet/verlassen wird.
    Die Änderungen wurden allerdings direkt im Speicher vorgenommen - dort, wo die Daten liegen.

    In wie weit das in PHP umgesetzt wird weiß ich nicht.
    Aber ich schätze das Verhalten wurde simuliert.
    Denn in C++ wird beim Löschen der Variable der Speicher freigeben. Das heißt, dass die Referenz auf nichts zeigt.
    In PHP hingegen:

    PHP
    $var = 1; 
    $ref = &$var; // referenz zu $var herstellen 
    unset($var); // var löschen
    echo $ref; // ausgabe: 1


    In der PHP Doku wir von Bezeichnern gesprochen.
    Logische Schlussfolgerung:
    beim Erstellen der $var werden die Daten im RAM hinterlegt
    PHP erstellt (denke ich) einen Bezeichner, der auf diese Speicheradresse zeigt.
    Der Bezeichner vermittelt dann zwischen PHP-$var und Speicheradresse.
    Wird eine Referenz $ref zu $var erstellt, dann wird wohl der Bezeichner kopiert und Beide - die Bezeichner von $var und $ref - zeigen beide auf die gleiche speicheradresse.

    Code
    inhalt (Speicheradresse)
      |           |
    bezeichner  bezeichner(kopie)
      |           |
    $var   =   &$ref;


    In PHP wird also kein Speicher freigegeben (wenn nicht doch intern geregelt/geklärt).

    Hoffe man kann es verstehen =)


    EDIT:
    PHP gibt doch Speicher wieder frei:

    Als erstes Thema Sicherheit:
    Benutzereingaben maskieren: mysqli_real_escape_string (http://php.net/manual/de/mysqli.real-escape-string.php)
    hier am Bsp:

    PHP
    foreach($felder as $feld)
    {
        $sql .= mysqli_real_escape_string($_POST[$feld]).", ";
    }


    Sonst sind Sql-Injections möglich!

    Prüfung:

    PHP
    if(empty($_POST["angemeldetesgewerbe"]) OR empty($_POST["plz"]) OR empty($_POST["ort"]) OR empty($_POST["email"]) OR empty($_POST["stundenlohn"]) OR empty($_POST["handy"]))


    hier passiert keine wirkliche Prüfung. Es gehört eigtl mehr dazu.
    Bsp:
    $_POST["plz"] ist numerisch. Es lohnt sich also schon mal zu prüfen, ob:

    PHP
    if(is_numeric($_POST["plz"])){ ... }


    BTW:
    Postleitzahlen fangen auch schon mal mit einer 0 an. Außerdem bekommt man via $_POST und $_GET immer Strings, auch wenn im Eingabefeld eine Zahl eingegeben wurde.
    Heißt: Eingabefeld 123 führt zu $_POST/$_GET '123'.
    Die Funktion is_numeric() (oder besser gesagt PHP) kommt damit allerdings klar. Es wird versucht den String '123' als Zahl zu verwenden, was auch funktioniert.
    So ist zum Bsp:

    PHP
    if(is_numeric(02828))


    wahr, also true.
    (Man kann hier auch noch die Länge der PLZ prüfen.)

    Bsp eMail:

    PHP
    if(empty($email) === false and filter_var($email, FILTER_VALIDATE_EMAIL) === true){ ... }


    Usw. Am besten immer nach den Schlagworten via Suchmaschiene suchen. Zb "php email prüfen".

    Was den Rest betrifft: alles Ansichtssache.
    Hier zB wurde das Erstelen des Inputfelds über eine Funktion erledigt:

    HTML
    <td><?php eingabe("selbststaendigseit"); ?></td>


    So lange man Redundanz (zu viel sich wiederholender Code) vermeidet - ok.

    Ist das ein Bug, oder übersehe ich hier was?

    Zustand:
    Klasse besitzt eine Konstante.
    Diese Konstante wird mit dem Inhalt einer global definierten Konstante belegt.
    Die global Konstante ist in "dem Moment" allerdings noch gar nicht definiert.

    Schwer zu erklären, dehalt hier das Bsp:


    Wenn ich die Reihenfolge in der Methode meth() ändere in:

    PHP
    public static function meth()
        {
            self::test(); // hier also erst die testausgabe
            config();
        }


    dann gibts nen Fehler Notice: Use of undefined constant TO_BE_DEFINED - assumed 'TO_BE_DEFINED' in.

    Das heißt ja, dass die Klassen Konstante CONSTANT erst definiert wird, wenn sie das erste mal aufgerufen wird.
    Oder?

    prüfe ich ob in der Variable was drin steht, wenn nicht, dann fülle diese.


    Nein.
    Wenn Du etwas ohne isset() prüfst, dann muss es vorhanden sein.
    Bei der Zuweisung kann es nicht existent sein.
    Der Unterschied:

    PHP
    if($parts[1] === '') // hier soll IN $parts die Ebene 1 geprüft werden, welche nicht existiert. Daher die Meldung
    $parts[1] = 1; // hier würde man etwas zuweisen. $parts und dessen Ebene 1 wird also erstellt (oder überschrieben, wenn schon vorhanden)