Klasse mit statischen Methoden require()

  • PHP

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von rotherford.

    Klasse mit statischen Methoden require()

    Hi! Folgendes Problem:
    Ich habe eine Klasse (SFC) mit statischen Methoden.
    Mittels require binde ich eine weitere Klasse (DB) mit ein.
    (DB erbt von mysqli)

    Doch leider klappt das nicht:
    Call to undefined method DB::prepare()


    SFC-Klasse (Ausschnitt)

    PHP-Quellcode

    1. require('DB.php');
    2. session_start();
    3. class SFC{
    4. public static function login($email,$password) {
    5. $password = md5($password);
    6. $m = new DB();
    7. $query = "SELECT id,username FROM users WHERE email=? AND password=? LIMIT 1";
    8. if ($stmt = $m->prepare($query)) {
    9. ..
    10. }
    11. }
    12. }


    //ohne Klasse funktioniert alles..
    /nicht getestet
    Kann es sein, dass das was in der If-Bedingung steht auch nochmal vorher dran gehört. Denn da ist offiziell keine Methode prepare() in deiner Database-Klasse. Das gehört zum Objekt hier:
    $m->prepare($query))
    Mach das oben nochmal hin bevor du das abfragst.
    Was du suchst ist wahrscheinlich eher so:
    Database :: $m->prepare(...)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „programmer71“ () aus folgendem Grund: Rechtschreibfehler

    programmer71 schrieb:

    Kann es sein, dass das was in der If-Bedingung steht auch nochmal vorher dran gehört. Denn da ist offiziell keine Methode prepare() in deiner Database-Klasse.

    ??

    Die Klasse DB erbt von mysqli:
    class DB extends mysqli{..}

    Das Komische ist, wenn ich das Ganze ohne Klasse schreibe, funktioniert es.

    PHP-Quellcode

    1. <?php
    2. require('DB.php')
    3. //..
    4. $password = md5($password);
    5. $m = new DB();
    6. $query = "SELECT id,username FROM users WHERE email=? AND password=? LIMIT 1";
    7. if ($stmt = $m->prepare($query)) {
    8. ..
    9. }
    10. ?>
    /nicht getestet
    mysqli schön und gut, PDO hat prepared statements allerdings etwas sauberer gelöst ( finde ich ), ich leg dir daher nahe auch aus gründen von flexibilität dir mal PDO ( PHP Data Objects ) anzusehen auch hinsichtlich native dependencies von php ist PDO die bessere Wahl ( aus meiner Erfahrung ).
    Ich habe es in meinem Projekt so gelöst:
    index.php <-- da spielt sich alles ab
    config.php <-- dort ist der Datenbankkram drine (PDO)
    functions.php <-- halt meine Klasse

    Ich habe die Datenbankgeschichte in der index includet und in der function.php dann einfach sowas geschrieben wie:

    PHP-Quellcode

    1. public function foo()
    2. {
    3. global $db;
    4. //Der rest der funktion
    5. }


    das funktioniert 1A

    var_dump($m) => "object(DB)#1 (0) { } "
    Komisch. Irgendwie kann der auf die Klasse DB nicht zugreifen.

    Klasse DB: (..)

    PHP-Quellcode

    1. <?php
    2. include('credentials.php');
    3. class DB extends mysqli{
    4. public function __construct(){
    5. parent::__construct(HOST,USER,PASS,DB);
    6. if ($this->connect_errno){
    7. die('hard');
    8. }
    9. }
    10. }
    11. ?>
    /nicht getestet

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „rotherford“ ()

    rotherford schrieb:

    Doch leider klappt das nicht:
    Zitat
    Call to undefined method DB::prepare()


    Es wäre vielleicht ganz hilfreich, wenn du mal die Definition von prepare(...) zeigen könntest, wenn du das denn überschrieben hast ... :)

    Schau dir auch mal diesen Artikel auf stackoverflow an.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trudi“ ()

    Also bei mir funktioniert es

    PHP-Quellcode

    1. <?php
    2. class DB extends mysqli {
    3. public function __construct() {
    4. parent::__construct("localhost", "root", "", "tabelle");
    5. }
    6. }
    7. $d = new DB;
    8. var_dump($d);
    9. ?>


    Output:

    Quellcode

    1. object(DB)#1 (17) {
    2. ["affected_rows"]=>
    3. int(0)
    4. ["client_info"]=>
    5. string(6) "5.1.41"
    6. ["client_version"]=>
    7. int(50141)
    8. ["connect_errno"]=>
    9. int(0)
    10. ["connect_error"]=>
    11. NULL
    12. ["errno"]=>
    13. int(0)
    14. ["error"]=>
    15. string(0) ""
    16. ["field_count"]=>
    17. int(0)
    18. ["host_info"]=>
    19. string(20) "localhost via TCP/IP"
    20. ["info"]=>
    21. NULL
    22. ["insert_id"]=>
    23. int(0)
    24. ["server_info"]=>
    25. string(6) "5.1.41"
    26. ["server_version"]=>
    27. int(50141)
    28. ["sqlstate"]=>
    29. string(5) "00000"
    30. ["protocol_version"]=>
    31. int(10)
    32. ["thread_id"]=>
    33. int(275)
    34. ["warning_count"]=>
    35. int(0)
    36. }