PHP $this Problem

  • Hallo Community,
    ich bin gerade dabei mich in OOP in PHP einzufinden und nun stehe ich schon vor meinem ersten Problem. Ich bekomme folgenden Fehler beim Aufruf meiner Seite:

    Code
    Fatal error: Using $this when not in object context in C:\xampp\htdocs\UCP\class\mysql.class.php on line 63


    Zeile 63 ist folgende Zeile:

    PHP
    if(!$this->query($sql, $fields)->error()) {


    query ist eine public function in der Klasse MySQL. query gibt $this zurück. error ist ebenfalls eine public function.


    Ich verstehe nun gerade nicht, wieso dies nicht funktioniert. Könnte mir dort jemand weiterhelfen?


    Mit freundlichen Grüßen
    Adrian Rodriguez

  • Möchtest du uns mal deine ganze Klasse auf Pastebin stellen?

    Moderator der Bereiche: Coding, Vorstellungsrunde und Handelsecke. Über Verwarnungen, falls du zu den Wenigen gehörst, die eine Verwarnung von mir erhalten haben, kannst du jederzeit mit mir reden, sofern der Umgangston stimmt.


    expect us. / unkompetent. Das neue dynamisch. / easy-stripping.net - coming soon! / "9§. the entire website bestands out of english." / Vollprofi in allem, wo gibt und noch mehr; kann auch OOP.
    Kleine Coding-Frage? Schau doch in #dev im IRC vorbei, wir können dir sicher helfen.


    Ich bin für Aufträge im Bereich der Webentwicklung (z.B. User Control Panel) zu haben. Kontaktiere mich diesbezüglich einfach in einer privaten Nachricht mit deinen, möglichst konkreten, Vorstellungen.


    lesen.denken.posten. - [22:54:14] <Goldkiller2> früher gabs immer so coole user da stand in der signatur "lesen.denken.posten."


    Mafia 2 Multiplayer (m2mp.de) - Eine kostenlose Modifikation für Mafia 2, die es, ähnlich wie SAMP, erlaubt über das Internet oder LAN mit bis zu 1000 anderen Spielern zu spielen.

  • Die Funktion, in der das Problem auftritt ist statisch (public static function insert(...)), query(...) allerdings nicht. Wie es aussieht, versuchst du das Singleton-Pattern zu implementieren, was so allerdings nicht ganz richtig aussieht. Das ist allerdings ein anderes Thema.


    Die Schnelllösung für den Problem wäre statt $this static::getInstance() zu verwenden, um die Instanz zu erhalten, die verwendet werden soll (welche im Objekt-Kontext in $this läge).

    Moderator der Bereiche: Coding, Vorstellungsrunde und Handelsecke. Über Verwarnungen, falls du zu den Wenigen gehörst, die eine Verwarnung von mir erhalten haben, kannst du jederzeit mit mir reden, sofern der Umgangston stimmt.


    expect us. / unkompetent. Das neue dynamisch. / easy-stripping.net - coming soon! / "9§. the entire website bestands out of english." / Vollprofi in allem, wo gibt und noch mehr; kann auch OOP.
    Kleine Coding-Frage? Schau doch in #dev im IRC vorbei, wir können dir sicher helfen.


    Ich bin für Aufträge im Bereich der Webentwicklung (z.B. User Control Panel) zu haben. Kontaktiere mich diesbezüglich einfach in einer privaten Nachricht mit deinen, möglichst konkreten, Vorstellungen.


    lesen.denken.posten. - [22:54:14] <Goldkiller2> früher gabs immer so coole user da stand in der signatur "lesen.denken.posten."


    Mafia 2 Multiplayer (m2mp.de) - Eine kostenlose Modifikation für Mafia 2, die es, ähnlich wie SAMP, erlaubt über das Internet oder LAN mit bis zu 1000 anderen Spielern zu spielen.

  • @NicoWiss: Nein, eben nicht. $this ist nur im Objektkontext, folglich nicht im statischen Kontext zugreifbar.
    Was geht ist, dass man auf statische Methoden im Objektkontext zugreift, umgekehrt aber, logischerweise, nicht.


    Edit: So könntest du das mit dem Parameter-Binding machen. Du musst dann an PDO das gleiche Array ($fields) übergeben. Ggf. musst du jeweils noch : for dem Key prependen, das habe ich nun nicht mehr genau im Hinterkopf.

    PHP
    // public static function insert($table, $fields = array())
    
    
    if (count($fields)) {
        $keys   = array_keys($fields);
        $values = array_values($fields);
    
        $sql = "INSERT INTO `{$table}` (`" . implode('`, `', $keys) . "`) VALUES (:" . implode(', :', $values) . ")";

    Moderator der Bereiche: Coding, Vorstellungsrunde und Handelsecke. Über Verwarnungen, falls du zu den Wenigen gehörst, die eine Verwarnung von mir erhalten haben, kannst du jederzeit mit mir reden, sofern der Umgangston stimmt.


    expect us. / unkompetent. Das neue dynamisch. / easy-stripping.net - coming soon! / "9§. the entire website bestands out of english." / Vollprofi in allem, wo gibt und noch mehr; kann auch OOP.
    Kleine Coding-Frage? Schau doch in #dev im IRC vorbei, wir können dir sicher helfen.


    Ich bin für Aufträge im Bereich der Webentwicklung (z.B. User Control Panel) zu haben. Kontaktiere mich diesbezüglich einfach in einer privaten Nachricht mit deinen, möglichst konkreten, Vorstellungen.


    lesen.denken.posten. - [22:54:14] <Goldkiller2> früher gabs immer so coole user da stand in der signatur "lesen.denken.posten."


    Mafia 2 Multiplayer (m2mp.de) - Eine kostenlose Modifikation für Mafia 2, die es, ähnlich wie SAMP, erlaubt über das Internet oder LAN mit bis zu 1000 anderen Spielern zu spielen.

    Einmal editiert, zuletzt von Klemmlampe ()

  • Wie ich bereits gesagt hatte, bindValue ersetzt die einzelnen ? nicht mit den Parametern, die ich in einem Array übergebe. Ich habe mit die Query mal ausgeben lassen, nachdem er eigentlich die Parameter eingesetzt haben sollte.

    SQL
    { ["queryString"]=> string(110) "INSERT INTO users (`username`, `password`, `salt`, `name`, `joined`, `group`) VALUES (?, ?, ?, ?, ?, ?)" }