Beiträge von cottton

    Nein, wieso. Wenn &page nicht reinkommt, dann will/soll Nutzer doch sicherlich auf die Seite 1 von guestbook.

    Ja, hab da nicht aufgepasst und das and ... in isset() geschrieben :D

    Zitat

    Das gibt doch einen Fehler, wenn da kein int steht?


    oO? Wo steht kein int?

    Ja, das ist PDO. Ich komme manchmal durcheinander wer waqs hatte und nutze ... =)
    mysqli_ ist ja "auch PDO" -- genauer: mysqli_ baut auf der von PHP vordefinierten Klasse PDO:: auf
    (...und verwirrt nur unnötig mMn mit vielen vielen Funktionen und ... egal - nicht das Thema hier :D )

    Zitat

    Ist es nicht sonst auch eigentlich eher unnötig?


    Naja ... wenn Du mich fragst: nein :D
    Sobald Du den Code updaten willst, und dort auf einmal einen Platzhalter brauchst, dann schreibst Du wieder alles um.
    Aber - wie immer - Ansichtssache.

    Zitat

    brauche ich denn auch noch ein or die()


    Nein, das die() wird doch meistens nur in Beispielen verwendet.
    Allerdings wird echo '' . $e; nicht funktionieren.
    Wenn Du eine Exception (in diesem Fall eine Erweiterte Exception mit dem Namen "PDOException") fängst,
    dann hast Du ein Object.
    Du kannst ja zB mal beim Login der db mit Absicht ein Fehler einbauen (zB falsche pw) und dann fängst Du die Exception (PDOException)
    und gibst sie mit var_dump($e) aus. Dann siehst Du, was da drin steckt.
    Siehe auch: http://php.net/manual/de/class.pdoexception.php
    So bekommst Du zB die Fehlermeldung:

    PHP
    {
    ...
    }
    catch(PDOException $e)
    {
        echo $e->getMessage(); // $e ist ein objekt der klasse "PDOException" und wir rufen dessen methode ->getMessage() auf
    }
    getMessage


    ->prepare() wirft (im Normalfall) keine Exception.
    Aber:

    Mach mal ein
    console.log(data)
    in der success function (am Anfang).
    console.log() ist Benutzerfreundlicher als alert(). Wenn Du zB ein Array dort ausgibst (ich gehe von FF oder Chrome aus), dann stellen die Browser das dort auch komplett dar.
    (Rechtsklick auf die Seite, "element untersuchen", console)

    Per Ajax Login musst Du via Javascript alles machen, was Du sonst per PHP ($smarty->) gemacht hast.
    Soll heißen: $smarty kannst Du in dem Moment vergessen :D


    JavaScript
    if(
    data // einfach art um festzustellen, ob data nicht "undefined" ist (in etwa das gleiche wie in PHP:  if($data){} )
    && data["login"] // das gleiche mit data[ebene "login"], denn wir wissen ja noch nicht, was data ist (typ) und ob eine ebene "login" existiert
    && data["login"] == true // die eigentliche prüfung (würde ja === nutzen, aber weiß nicht ob jquery ein bool rausrückt)
    )

    Zu Link: ja.

    Zu else if:
    oO?

    PHP
    $site = isset($_GET["page"]and (int)$_GET["page"] > 0) ? (int)$_GET["page"] : 1;  // mysql_real_escape_string lass ich absichtlich weg =)


    Ich glaube das wolltest Du erreichen - dass site nicht kleiner als 1 sein kann?

    Zu PDO
    Mir fällt gerade ein - ich glaub Du hattest mysqli_... genutzt.
    Dann wird das anders gehandhabt.
    bsp mysqli_

    PHP
    // http://php.net/manual/de/mysqli-stmt.bind-param.php
    $stmt = $mysqli->prepare("SELECT ... LIMIT ?,?"); // mysqli_ kann nur mit "?"-platzhaltern umgehen
    $stmt->bind_param('ii', $start, $entrysAPage); // "ii" gibt an, dass 2 integer an stelle der platzhalter eingefügt werden
    // info: jedes zeichen zählt für den jeweiligen platzhalter.
    // bsp: 
    $stmt->bind_param('isd', $integer, $string, $double_which_if_also_float);


    bsp PDO::


    Es geht hier als nicht um den Typ, den die Variable hat, sondern darum,
    als was für ein Typ der Wert der Variable an die Stelle des Platzhalters geschrieben wird.

    Wenn Du nun mysqli_ nutzt, dann sollte man egtl "i" fpr integer nutzen, wenn man eine Ganzzahl zuweisen will.
    (Man muss, wenn man LIMIT mit Platzhaltern nutzt)

    Zu dem Schreibweisen:
    japp, es gibt (gerade in PHP) viele Varianten - viele Schreibweisen. Jeder macht es anders.


    Zu fetchAll:
    ich würde anstatt ->query ->prepare und Platzhalter nutzen =)
    http://php.net/manual/de/mysqli.prepare.php
    (
    musst nicht. aber ich find es "richtiger", wenn man
    a) immer die gleiche Art nutzt (also prepare/execute)
    b) wenn gnadenlos alle Werte per Platzhalter in Queries gesteckt werden
    )
    Aber auf jeden Fall die Fehler abfangen.
    Beim connecten können Fehler auftreten,
    beim preparen, und beim executen.
    (kommt natürlich auf die Variante an - also mysqli_ oder PDO::)

    HTML/CSS ist dann in der Tat nicht mein Ding.
    Ich kenne es, mag es aber nicht :D

    Zitat

    Sollte der dann nicht auch eigentlich oben beim Absenden stehen?


    Du meinst sicherlich die action="" in der Form.
    Die wird ja gar nicht genutzt, denn Du nutzt doch

    JavaScript
    event.preventDefault();


    Also wird das absenden verhindert, damit Du per JS damit arbeiten kannst.

    Zitat

    Jetzt kriege ich auch wieder die Meldung, das der ajax Aufruf erfolgreich war aber die Weiterleitung und die Anzeige, das der Login erfolgreich war kommt immer noch nicht.


    Die weiterleitung per PHP greift ja auch nicht mehr.
    Die musst Du nun per JS anstupsen.

    Zum Verständnis hier mal der Ablauf:
    (erster Seitenaufruf)
    - Server (PHP) übergibt Seite an Browser
    - Nutzer sieht Seite
    - Nutzer klickt auf [SENDEN] in der Form
    - per JS verhinderst Du, dass die Form wirklich abgeschickt wird, damit Du damit arbeiten kannst
    - per JS sendest Du eine Request (Ajax) an den Server (PHP)
    - Server (PHP) führt das aufgerufene PHP-Script aus (Browser wartet geduldig =)
    - über die url hatten wir den Key "ajaxLogin" mitgegeben -> echo json_encode(...) und exit; (PHP ENDE)
    - Browser bekommt Daten (Ajax Antwort)
    - per JS stellst du fest: Nutzer Login === true -> muss Nachricht anzeigen und weiter leiten (ENDE)

    Was kann schief gehen:
    Ajax. :D
    Du hast recht - es gibt in jquery noch die Funktionen, die die Fehler abfangen.
    Aber mit jquery hab ichs nicht so. Steht aber alles im Tut: Tutorial jQuery AJAX

    Zitat

    Einen link zur ersten Seite des GB's muss man doch nicht unbedingt mitschicken? Ich habe ja auch schließlich das am Anfang stehen:
    ...
    von daher ist das doch sonst nicht unbedingt nötig oder liege ich da jetzt falsch?


    Versteh ich nicht , also verstehe dir Frage nicht :D

    Wegen negativ Wert: ja, Du ziehst ja glaub ich ab ( - einträgeProSeite), da kann das bei Seite 1 passieren.

    Zitat

    Gibt es eigentlich bei der Kurzschreibweise ein else / else if, sodasss man das oben in den Teil einfügen kann?


    Versteh ich auch nicht ganz :D
    meinst Du:

    PHP
    $var = ($wenn <= 0) ? $dann : $sonst /* und hier noch ein else if ? */; 
    // else if gibts in der schreibweise nicht, aber man kann (einigen wird das evtl nicht gefallen =)
    $var = ($wenn <= 0) 
        ? $dann 
        : (                   
            ($wenn > 0)
                ? $dies
                : $das
        );


    Ich nenne das die traurigen :D

    Zu PDO:
    auf jeden Fall BindParam nutzen. (int) muss nicht, da über bindParam(, PDO::PARAM_INT) ein integer an die Stelle des Platzhalters "gesetzt" wird.

    Zitat von http://php.net/manual/de/pdo.constants.php

    PDO::PARAM_INT (integer)
    Stellt den Datentyp SQL INTEGER dar.


    Auch deswegen bindParam, weil über die "normale" Art und Weise (also ohne bindPara) ein String an die Stelle gepackt wird.
    Dann käme sowas raus:

    SQL
    SELECT ... LIMIT '1', '21';


    ... was ja invalid ist.
    Behalt Dir einfach immer im Hinterkopf: ohne bind wird ein String an die Stelle geschrieben.

    Zu goto:
    Ich dachte Du kennst das evtl.
    Das war ein Bug bei Apple, bei dem:

    Code
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) // hier keine klammern genutzt, also NUR die nächste anweisung zählt
            goto fail; // <--- das hier sollte so sein (springt zu einem punkt der den namen fail bekam)
            goto fail; // <--- copy/paste fehler oder shortcut fail für "dupliziere zeile" ? -- jedenfalls wird das hier ausgeführt


    Mit klammern hätten beide in den Klammern gestanden -- nix wäre passiert.

    Code
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0){
        goto fail;
        goto fail;
    } // würde man zB durch copy/paste die Klammer "wegkopieren, dann gäbe es einen fehler beim compilieren/ausführen (fatal error)
    // klammern ^= mehr sicherheit

    Zum letzten Bsp:
    Nich teinfach weglassen.
    Ich versuchs mal zu erklären:

    Zitat

    Wie könnte man es eigentlich erreichen, das nur die nächsten 10 Seiten von der aktuellen ausgehend angezeigt werden?


    Du meinst wenn es 100000 Seiten wären, dass nicht alle über dir Nav angezeigt werden?
    Also
    [ANFANG][1][2]...[10001][10002][ENDE]
    Das bekomme ich heute nicht mehr hin :D

    Da wird kein key "guestbook" in der url sein, wenn der switch dort nicht reinspringt.
    siehe:

    PHP
    $page = $i + 1;   
        if($site == $page) // If user is on that page, print no link
        {
            echo " $page ";
        }
        else // If user is not on that page, create link
        {
            echo " <a href="?page=$page">$page</a> ";
        }


    beim letzen echo sollte sowas rauskommen:

    Zitat


    {host}?page=2


    probier mal das hier:

    PHP
    $page = $i + 1;   
        if($site == $page) // If user is on that page, print no link
        {
            echo " $page ";
        }
        else // If user is not on that page, create link
        {
            echo " <a href="?site=guestbook&page=$page">$page</a> "; // beachte das & zeichen
        }


    natürlich auch überall, wo du einen link anbietest der zum GB führen soll.

    Hinweis:
    Du nutzt PDO, schreibst dann aber doch wieder $vars in die Query.
    Auch wenn Du mysql_realy_esc ....() nutzt.
    Irgendwann - bei nem update o.ä. - schleicht sich ein Schusselfehler ein und in die Query wird eine unmaskierte $var geschrieben.
    Lösung:
    - nutze Platzhalter, wie es die PDO - Prepared Statements vorsieht,
    - im Fall LIMIT nur Ganzzahlen zulassen: "SELECT .... LIMIT " . (int)$start . ", " . $entrysAPage . ";"
    Selbst verständlich ersteres empfohlen =)

    Noch ein Hinweis:
    falls Du doch mal $vars in die Query schreiben musst (dynamsch tablenames - können ja nicht mit Platzhaltern genutzt werden),
    dann die maskierung (mysql_real_esc..., (int), oder was auch immer) direkt in oder über der Query.
    Andere und du selbst brauchen dann nicht in anderen Files/Zeilen suchen, um zu erfahren ob die $var bereits behandelt wurde.

    EDIT:
    Hinweis 3

    PHP
    if(isset($_GET['page']))    
                $site = 'guestbook?' . $_GET['page'];


    "Kann man machen, muss man aber nicht".
    Nicht Klammern nutzen ist nicht cooler als Klammern nutzen. Aber Klammern nutzen ist sicherer.
    Letztes Populäres Bsp war "apple goto bug"

    Code
    // code 1ster google treffer: http://opensource.apple.com/source/Security/Security-55471/libsecurity_ssl/lib/sslKeyExchange.c
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
            goto fail;
            goto fail;
        if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)


    EDIT: Du kannst bei kuzen Sachen natürlich auch das hier nutzen:

    PHP
    (isset($_GET['page'])) and ($site='guestbook?' . $_GET['page']);


    Ich lasse dabei die Klammern () um die Bedingungen und Zuweisungen, um es "Blockweise" zu erkennen.
    Auch das $site='guestbook' ohne Leerzeichen soll deutlich machen, dass hier kein Vergleich, sondern eine gewollte Zuweisung passiert.
    Das hier würde auch funktionieren:

    PHP
    isset($_GET['page']) and $site='guestbook?' . $_GET['page'];

    Du hast ganz schön viel verschlimmbessert. :D
    Alles nochmal zurück.
    Nutze am besten den zusätzlichen Key via GET:

    JavaScript
    url: "Backend/backend.php?ajaxLogin=true",


    Den Rest wie vorher, also vor Deinem letzen Post.

    Zum PHP:

    Zitat

    wird geben dem "angreifer" keinen hinweis, daher fällt das hier weg


    Beim Login sagst Du dem Nutzer nicht, dass der Name oder pw zu kurz war.
    Also brauchst Du auch keine bestimmte Länge prüfen. Sondern nur ob strlen() > 0.
    Du kannst auch weiterhin empty() nutzen. Ich find empty() nur irgendwie ecklig() :D
    Rest per Kommentare:

    Die db-Änderungen sind nur Vorschläge.

    Was Du da im Screenshot zeigst ist das, was auch erwartet wurde:
    PHP legt die Daten als json String ab, und die JS Funktion wandelt diesen bei Aufruf um.
    Wie gesagt - das soll erstmal nur als "Schnittstelle" dienen.

    Zitat

    // hier kann man später per ajax die daten live holen


    Später kannst Du dort drin per ajax die Daten einzeln laden.

    Das ist natürlich keine Copy-Paste-Code, den Du direkt nutzen kannst. Du musst es schon anpassen.
    Hier gint es mehr um den Ablauf. =)

    Dann musst Du mischen.


    Per ajax (POST sicherlich beim Login) sendest Du einen weiteren Schlüssel (Key) und der Value true.
    Damit kannst Du im Script erkennen, auch welche Art Du die Rückmeldung liefern musst.

    Wie gesagt - die success function von ajax/jquery springt ja an, wenn der Aufruf erfolgreich war.
    Ein Aufgerufenes Script kann das Wort "Hundehaufen" ausgeben - das ist für den ajax call ein success :D

    Das Tut hab ich mir nicht angesehen - ich mag die Seite generell nicht (persönlich).
    Was wolf und ich aber meinten ist das Generieren des Hashes.
    Der Ablauf des Logins kann dann auf 1000 verschiedenen Wegen passieren.

    isset und empty:
    isset() prüft ob eine var gesetzt ist (existiert und nicht null)
    empty pfrüft ob eine var "leer" ist. Leer ist aber auch 0, null, false, "0", ... -- also (mMn) zu schwammig.

    Prüfe auf das, was Du erwartest.
    Der Benutzername zB muss ja
    - gesetzt sein ( isset ),
    - nicht leer sein ( strlen )
    - eine bestimmte min Länge haben ( strlen ... >= x )
    - ein bestimmtes Format haben ( regex )

    BLOB ist binary.
    Was auch immer nun da drin steck, wird sicherlich so reingeschickt worden sein:

    SQL
    INSERT INTO `tbl` SET `blobcolumn` = BINARY('hier ist mein text oder was auch immer ...');


    Beim Auslesen kann man zB CONVERT nutzen (~aus binary wird ein string):

    SQL
    SELECT `irgendwas`, `nochwas`, CONVERT(`blobcolumn` USING utf8) AS `blobcolumn` FROM `tbl`;


    Der String, den Du nun rausbekommst, wird sicherlich encoded sein (json_encode, serialize, ... ?)
    also musst Du das rückgängig machen (json_decode, unserialize, ... ?).

    Naja, der Ajax-Aufruf war erfolgreich.
    Das Problem ist der Ablauf im PHP-Script.


    Mögliche Lösung (falls das PHP-Script NUR für diesen call via ajax genutzt wird)
    (btw: paar Änderungen/Vorschläge eingefügt)


    in der jquery func success prüfst Du nun

    JavaScript
    ...
                    success: function(data){
                        // weiß grad nicht wie jquery die daten schmeisst, solte aber passen:
                	    if(data && data["login"] && data["login"] === true){
                            // hier die meldung ausgeben, dass login ok war und weitergeleitet wird (weiterleitern dann per JS)
                        }
    // else -- wenn data["login"] === false, dann nicht eingeloggt, und wenn data["error"].length > 0 dann ist eine fehlermeldung vorhanden
            	},
    ...


    redirect mit js einfach mal "JS location redirect" suchen

    Du hast da paar Fehler in den Queries.
    In dem Create Statement heiße es h_titel oder s_titel,
    in den Queries schreibst Du dann aber title.
    Oder auch web_hersteller.id -- gibts nicht. web_hersteller.h_id gibts =)

    Hier mal ein "Concept":

    Empfehlung:
    Backup vor irgendwelchen Änderungen:
    (achtung! könnte lange dauern, wenn die maschiene lahmt und "viele" datensätze kopiert werden müssten =)

    SQL
    create table `web_hersteller_kopie` like `web_hersteller`;
    insert into `web_hersteller_kopie` select * from `web_hersteller`;
    create table `web_serien_kopie` like `web_serien`;
    insert into `web_serien_kopie` select * from `web_serien`;


    tabelle hersteller ändern:

    SQL
    ALTER TABLE 
        `web_hersteller` 
    CHANGE COLUMN 
        `h_id` `h_id`           -- `name alt` `name neu` - bleibt also gleich
        INT(11) 
        UNSIGNED                -- ganze zahl ohne vorzeichen (siehe google "mysql int types")
        NOT NULL 
        AUTO_INCREMENT,         -- lass die db die id hochzählen
    ADD PRIMARY KEY (`h_id`);   -- h_id wird primary key

    tabelle serien ändern:

    Guck mal hier: Tutorial jQuery AJAX

    Zum Trennen von PHP und HTML:
    naja, wenn Du im HTML - OHNE PHP nutzen zu wollen - eine Abfrage brauchst, ob eine Session o.ä. gesetzt ist,
    dann kommst Du um ein CMS (eigenes oder anderes ...) nicht herum.
    Dabei wird ja anhand von PseudoCode - was eigtl nur bestimmte Platzhalter/Keywords darstellt - der Inhalt dort hin replaced/gesetzt/ersetzt.

    Zum Weitergeben:
    SESSIONs (Seite muss min einmal abgefeuert werden um in PHP die SESSIONs zu setzen, ODER per ajax an PHP-Script senden),
    Dateien (ähnlich wie bei SESSIONs),
    LocalStorage (js),
    (Web)Socket (Aufwand/Nutzen sollte passen)

    Jap, google anal meckert:

    Zitat

    Redundante Hostnamen
    Die Property {id} erhält Daten von redundant Hostnamen.
    Filter anpassen | Erneut prüfen | Ignorieren | Details


    wird aber erfolgreich zu-ignoriert :)