Beiträge von cottton

    Also bissl musste schon selbst nachdenken.

    Zitat

    PHP Fatal error: Uncaught Error: Call to a member function getgetConnection() on strin

    getgetConnection


    Ich bin raus :)

    EDIT: nicht die Lösung, aber ich such bei sowas offensichtlichen doch nicht mehr für Dich weiter =)

    Etwas spät, aber ... :)


    So in etwa.

    Aber "Überschreibgefahr" nicht. Denn das ist oft gewollt.


    Bsp: ein "Tool"

    Angenommen, das Tool willst Du überschreiben:


    Du hast also mehr Möglichkeiten|Kontrolle.

    Alle, die das Objekt benutzen, müssen die Setter und Getter nutzen, um Values zu setzen|ändern.

    Du weißt also immer, wo die "ankommen" müssen. Und dort kannst Du ansetzen, um etwas zu ändern.

    Wenn alle nur auf die Eigenschaft $object->value = 13 gehen würden, dann könntest Du das gar nicht nachvollziehen.



    BTW: ich hab irgendwo gelesen, dass das eingeführt würde, um Typen (int, string, ...) zu setzen|validieren.

    Mit der nächsten PHP Version solle das nicht mehr nötig sein, da man dann die Eigenschaften per Typ definieren kann.

    Bsp: public int $value; (wenn ich mich nicht irre).

    in dem Artikel hies es, dass Getter und Setter dann ~"endlich ein Ende hätten"~ - find ich aber Quark.

    Getter und Setter sind ja nicht nur zur Validierung. Oft will man einfach noch was anhängen, filtern, loggen, ... .

    Ok, dann bleibt nur noch die Frage: warum hat denn die Klasse MyDatabase

    bei den Methoden

    select()

    und

    execute()

    keine Parameter?


    Wenn Du diese Klasse alleine Nutzen würdest, könntest Du ja gar keine Parameter übergeben =)

    compatible

    ist das Schlüsselwort.


    Aus der Meldung entnehme ich, dass Du

    eine class MysqlDatabase und eine class MyDatabase

    nutzt.


    MysqlDatabase erweitert sicherlich MyDatabase.


    Das Problem:

    Siehe code


    Der Fehler liegt hier also bei dem ersten Parameter.

    Der existiert bei der erweiterten (parent) Klasse nicht.

    Du kannst parameter hinzufügen, aber dann so, dass sie optional sind.




    An einem anderern Bsp:

    Hat der Php Code von ihn da überhaupt noch irgendeine Funktion ?, oder habe ich da jetzt was falsch verstanden ?

    Ok, gut. Dann bin ich nicht verblödet :D


    Ne, macht keinen Sinn.

    Mit nem mailto Link wird ja der Browser|System angesprochen.


    @Phobie-PHP

    Du solltest eine <form> nutzen, die dann die Daten an ein PHP Script schickt.

    Und dieses PHP Script validiert die Daten und sendet die eigentliche eMail and Deine Addresse.

    Was soll das den werden ? Code
    + "mai" + "lto" + ":

    irgendwie verstehe ich das nicht ganz

    Verschleierung, denk ich. Um bots auszutricksen. Damit die "mailto" nicht im Quellcode finden.


    Ich versteh das Vorhaben an sich nicht.

    Warum soll die Ziel-Email-Addresse in dem Quellcode stehen?

    Die mail wird doch dann per PHP vom Server verschickt, oder?

    Aber evtl verstehe ich das gerade falsch.

    Code
    {"message": [{"name": "kundenname", "value": "sertz"}]}

    Naja, kundenname ist wohl in message.

    Warum, kann ich Dir auch nicht sagen.


    Geh doch schrittweise ran.

    Du gibst erstmal $_POST aus (oder schreibst es in ein file).

    Dann weißt Du erstmal, was Du denn als Ganzes bekommst.

    mit der Methode kann sehr viel Spam vermeiden

    http://www.1ngo.de/web/captcha-spam.html

    Deine Antwort sieht aus, wie von einem Spam-Bot geschrieben :D

    Diese Ironie :D


    Das Versteckte email Feld kann was bringen.


    Das mit der Zeit halte ich für Quark.

    Das erinnert mich an ein Forum, in dem man nur aller x Sekunden einen Beitrag posten konnte.


    Den Inhalt filtern und bei einem Treffer gar nicht erst zulassen (also Beitrag komplett abweisen)

    halte ich für schlecht.

    Der Benutzer ist genervt, und Du, als admin, musst das Script ständig anpassen und wirst mit Supportanfragen beballert =)


    Ich selbst würde das eher denen überlassen, die sich schon lange damit beschäftigt haben.

    Auf Anhieb wäre das für mich google recaptcha.

    Gibt natürlich auch andere.


    Aber nicht falsch verstehen - ich find es gut, wenn man es selbst mal versuchen|schreiben will.

    Das bildet und macht oft auch Spass =)

    ---

    BTW: hatte vor kurzem ein Video gesehen, bei dem es um AI spam ging.

    Durch machine learning human-like posten.

    Es ging darum, Beiträge so menschenähnlich wie möglich zu gestalten.

    Dabei musste der Inhalt noch nicht mal wirklich Sinn ergeben. Es ging einfach nur darum, einen echten Menschen dazu zu bringen,

    aus den Beitrag zu antworten.

    Und schon durch diese "echte" Antwort gewinnt der Originale Beitrag an Glaubwürdigkeit.

    War interessant. Finde das Video aber nicht mehr :/

    Nein.

    \PDO ist ja eine Klasse von PHP.

    Die hat ja eigtl schon einen __construct.

    Den hättest Du jetzt überschrieben.

    Könnte man machen, aber muss eigtl nicht sein.


    Statt Database könntest Du gleich die \PDO Klasse nutzen.

    Und da das Object ja nun "nur" von \PDO stammt, und eine Connection ist,

    könntest Du den getter und setter (nennt man so, weil getSoUndSo() , setSoUndSo() )

    getConnection()

    und

    setConnection()

    nennen.

    Im besten Fall regelt man das über einen "DI" (dependency injection|injector).

    Aber das ist evtl. für den Anfang etwas zu viel.


    Du kannst die Abhängigkeit (dependency) in auf den User setzen:

    Beim User laden sollest Du nicht getUser nutzen.

    Sondern: find() findById() findFirst() delete() ...

    Bsp:

    Hehe, noch ein bischen Social Engineering und Du hättest den Account.

    Wollte gerade ein Bsp Text schreiben. Aber das lass ich mal besser :)


    Das passiert jeden Tag unzählige Male.

    Natürlich auch automatsiert.

    Wenn möglich, würde ich weiter gehen - Polizei ect. Wobei das der Vorherige Besitzer wohl anstoßen müsste.

    Aber ob die überhaupt was machen ... wer weiß.


    Zum Thema Password:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Von 2016. Alt, aber nicht veraltet.

    Ach, jetzt verstehe ich die Array-Sache (glaub ich).


    Du hast einen, oder mehrere Seiten, nach denen gesucht werden soll?

    Dann nutzt man

    SQL
    WHERE seite = IN(:a, :b, :c)


    Da Du aber evtl nicht weißt, wie viele Values (Seiten) abgefragt werden,

    musst Du die Platzhalter (:a, :b, :c) dynamisch erstellen.


    Info:

    Jetzt könnte man ja meinen, dass man einen Platzhalter angibt

    SQL
    WHERE seite = IN(:seiten)

    und bei execute ein array übergibt

    PHP
    $stmt->execute([
        'seite' => [ // invalid example!
            'foo.com',
            'bar.com',
            'baz.com',
        ]
    ]);

    Aber das funktioniert nicht.

    Die Parameter sind immer key => value (Platzhalter string => value)

    Siehe: PDO::PARAM_* https://www.php.net/manual/de/pdo.constants.php

    Es gibt kein PDO::PARAM_ARRAY.


    /endInfo



    Also erstellen wir dynamisch n parameter zu einem Kommagetrennten String:


    Sicherheit (Thema SQL-Injection): Zwar nutzen wir hier eine PHP Variable in der SQL query,

    aber wir wissen genau, dass in dem erstellten String keine Userdaten enthalten sind.

    Es sind immer die von uns selbst erstellten Platzhalter: ":value_1, :value_2, ..."

    Im Netz suchst Du einfach nach "php pdo".

    https://www.php.net/manual/de/book.pdo.php

    https://www.php.net/manual/de/pdo.prepared-statements.php


    bindParam

    Code
    $stmt->bindParam('seite', $seite);

    brauchst Du nicht.

    Kann man nutzen, muss man aber nicht. Ich find es verwirrend und "ekelhaft". Kann aber in bestimmten Fällen Sinn machen.

    Ansonsten so, wie Du es geschrieben hast.


    Würde allerdings eine while-Schleife nutzen, falls es viele Zeilen seinen können.

    Code
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        // do something with $row['...']
    }

    Mit fetchAll bekommst Du alle Zeilen in eine Variable.

    Wenn es zu viele sind, könnte es ein "out of memory" geben.

    Mit der while-Schleife hast Du immer nur eine Zeile in der Variable.


    Wenn du zb dich in einen Forum anmelden tust werden die Passwörter zb hiermit verschlüsselt

    https://www.php.net/manual/de/function.sha1.php

    https://www.php.net/manual/de/function.md5.php

    FALSCH!


    Siehe: Loginpasswort richtig hashen - password_hash() & password_verify()



    AndreasHL

    Was Du vorhast, macht man NICHT!

    Das gibt Angreifern infos, die sie nicht haben sollen.


    Der User hat seine Anmeldedaten, oder eben nicht.

    Wenn nicht,

    dann kann er auf "Passwort vergessen" klicken,

    eine email angeben,

    und der Server sendet an diese email (wenn bekannt|existier in db) einen Link zum Zurücksetzen.

    Der Server sagt nicht, ob es die email gibt!


    Es darf nie einen Hinweis auf die Anmeldedaten geben. NIcht vom Server|Service.

    Für sowas gibt es Tools (Passwortmanager), die es ja schon im Browser gibt.

    Wenn der Codierer der Bank einen token reinprogrammiert HÄTTE, würde also Dein Link "https...deine-bank.de/geld/senden?an=cottton&wieviel=1000" auch nicht funktionieren. Richtig?

    Ja. Der csrf-token müsste ja existent sein und auf die Request passen.



    Woher erkenne ich als Anwender eigentlich, dass eine HP - Anwendung mit token abgesichert ist?

    Rechtsklick -> Element untersuchen.

    In der Form könnte es einen Token geben.

    Die können aber auch in der url stehen (macht aber kaum jemand denk ich),

    oder per Header (siehe Wiki X-XSRF-TOKEN).


    Auf den ersten Blick kann man das nicht sehen.

    Fals english ok ist:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Sehr vereinfachtes Bsp:

    Du bist bei einer Bank "deine-bank.de" und hast Dich vor einer Minute eingeloggt.

    Ich poste hier einen Link "https...deine-bank.de/geld/senden?an=cottton&wieviel=1000"

    und Du klickst auf diesen Link.

    Dann ruft Dein Browser diese Seite auf und übermittelt die Request.


    Das geht auch via POST und still und heimlich.

    Wird im Video gut erklärt.