Problem mit OOP

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit OOP

    Hi

    ich habe leider noch riesige Probleme mit der OOP. Liegt zum Teil an der fehlenden Übung zum anderen daran, dass ich den Sinn wohl nocht nicht ganz durchschaut habe. Jedenfalls habe ich eine MySQLi-Klasse gefunden:

    Quellcode

    1. class DB
    2. {
    3. /**
    4. * @var <str> The mode to return results, defualt is MYSQLI_BOTH, use setFetchMode() to change.
    5. */
    6. public $fetchMode = MYSQLI_BOTH;
    7. /**
    8. * @desc Creates the MySQLi object for usage.
    9. *
    10. * @param <arr> $db Required connection params.
    11. */
    12. public function __construct($db) {
    13. $this->mysqli = new mysqli($db['host'], $db['user'], $db['pass'], $db['table']);
    14. if (mysqli_connect_errno())
    15. {
    16. printf("<b>Connection failed:</b> %s\n", mysqli_connect_error());
    17. exit;
    18. }
    19. }
    20. /**
    21. * @desc Simple preparation to clean the SQL/Setup result Object.
    22. *
    23. * @param <str> SQL statement
    24. * @return <bln|null>
    25. */
    26. public function query($SQL)
    27. {
    28. $SQL = $this->mysqli->real_escape_string($SQL);
    29. $this->result = $this->mysqli->query($SQL);
    30. if ($this->result == true)
    31. {
    32. return true;
    33. }
    34. else
    35. {
    36. printf("<b>Problem with SQL:</b> %s\n", $this->SQL);
    37. exit;
    38. }
    39. }
    40. // und so weiter
    41. }
    Alles anzeigen


    Diese binde ich per extend in eine zweite Klasse ein und möchte von dieser Klasse Chat auf die Funktion query() zugreifen.

    Quellcode

    1. class Chat extends DB {
    2. public $chat_id;
    3. public $last_id;
    4. public $db;
    5. public function __construct($config) {
    6. $db = parent::__construct($config);
    7. }
    8. public static function getLines($chat_id, $last_id) {
    9. $select = $this->db->query("SELECT * FROM `lines` JOIN `user` ON lines_author = user_id WHERE lines_chat = '".$chat_id."' AND lines_id > '".$last_id."' ORDER BY lines_id") or die(mysqli_error);
    10. }
    11. }
    Alles anzeigen


    Aufruf:

    Quellcode

    1. $config = array();
    2. $config['host'] = 'localhost';
    3. $config['user'] = 'root';
    4. $config['pass'] = '';
    5. $config['table'] = 'project';
    6. $chat = new Chat($config);
    7. echo $chat->getLines(1, 0);



    Nur erhalte ich immer Fehlermeldungen. Die letzte ist jetzt:

    Fatal error: Using $this when not in object context in C:\xampp\htdocs\project\Chat.class.php on line 15

    An dieser Stelle komme ich leider wirklich nicht mehr weiter, denn egal wie ich die Variable anspreche erhalte ich immer Fehlermeldungen, dass die Variable nicht definiert ist. Bitte klärt mich auf. Gerne auch Meinungen zum Code bis jetzt, da ich überzeugt bin, dass einige Programmierer kurz vor dem Herzinfarkt waren, als sie meinen Code gesehen haben^^

    Danke schonmal
  • Wenn ich mich nicht vollkommen irre, dann liegt es daran, dass die Methode vererbt wird und nicht die db-Klasse als Variable der Chatklasse erhält. Also einfach $this->query('Anfrage'); ... Den SQL-String würde ich aber aus performanten Gründen in Single Quotes schreiben und anstatt SELECT * die einzelnen Spalten wirklich definieren;)

    Wenn du noch Probleme mit der OOP hast, solltest du villeicht keine Klassen aus dem Internet übernehmen, sondern lieber selber schreiben ;)
  • Warum ist die getLines Funktion statisch?

    Ich habe keine Ahnung mehr warum^^ Ist entfernt. Auch den Rat von JaffaCoder hab ich befolgt. Neue Meldung:

    Notice: Undefined property: Chat::$SQL in C:\xampp\htdocs\project\DB.class.php on line 116
    Problem with SQL:

    Komischerweise wird auch keine SQL-Fehlermeldung ausgegeben. Heißt das, dass die Verbindung schon nicht aufgebaut wird?

    PS: Der SELECT ist noch nicht fertig, das * bleibt da nicht
  • Kaotisch würd ich dazu sagen. Willst du wirklich jedes mal in jeder deiner Klassen wo du eine Datenbank braucht mit extends die Datenbank Klasse einbinden?
    Was ist wenn mal auch andere Klassen eingebunden werden solln du kannst nur immer bei extends eine Klasse angeben.

    Zuerstmal würd ich dir generell zu neueren moderenen Methode PDO für den Datenbank zugriff raten.
    Am besten ruft du die Datenbank statisch auf so kanst du überall und in jeder Klasse darauf zugreifen ohne sie vorher einbinden zu müssen.

    Weiters würd ich Singleton bei einer Datenbank Klasse empfehlen und auch hier sind verschiedene Verbindungen möglich je nachdem wie die Klasse geschrieben wurde.

    Hier mal schnell ein Ungetestetes Beispiel einer Singlton Datenbank Klasse passierend auf PDO.
    (Wer Fehler findet darf sie hier Posten sowie die Verbesserungs vorschläge sind Natürlich immer Willkommen.)

    Die Config

    Quellcode

    1. <?php defined('SYSPATH') or die('No direct access allowed.');
    2. return array
    3. (
    4. 'default' => array
    5. (
    6. 'hostname' => 'localhost', # Datenbank Server
    7. 'database' => 'dbname', # Datenbank Name
    8. 'username' => 'user', # Benutzename
    9. 'password' => 'pass', # Password
    10. 'persistent' => FALSE,
    11. 'prefix' => '', # Tabellen Prefix
    12. 'charset' => 'utf8', # Zeichensatz
    13. 'caching' => FALSE,
    14. ),
    15. 'db1' => array
    16. (
    17. 'hostname' => 'localhost', # Datenbank Server
    18. 'database' => 'dbname', # Datenbank Name
    19. 'username' => 'user', # Benutzename
    20. 'password' => 'pass', # Password
    21. 'persistent' => FALSE,
    22. 'prefix' => '', # Tabellen Prefix
    23. 'charset' => 'utf8', # Zeichensatz
    24. 'caching' => FALSE,
    25. ),
    26. );
    Alles anzeigen


    Die zugehörige Datenbank Klasse

    Quellcode

    1. <?php
    2. /**
    3. * Datenbank Klasse
    4. * @version 1.2
    5. * @author Splasch
    6. * Filename: dbpdo.php
    7. * Verbindung über die PDO herstellen
    8. **/
    9. final class Dbpdo
    10. {
    11. protected static $db_obj = null; # Datenbank Objekt PDO
    12. private $db_file = 'dbconfig.php'; # Configuration Datei
    13. public $error; = ''; # Fehler Varibale
    14. private $anfragen; # Sql Anfragen zählen
    15. /**
    16. * PDO verbindung aufbauen
    17. * Verbindungsdaten abfragen
    18. */
    19. private function __construct($instance)
    20. {
    21. $config = $this->get_config($instance);
    22. $db = "mysql:dbname=".$config['database'].";host=".$config['hostname'];
    23. try
    24. {
    25. self::$db_obj[$instance] = new PDO($db, $config['username'], $config['password'],array
    26. (
    27. PDO::ATTR_PERSISTENT => false,
    28. PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
    29. #PDO::ERRMODE_EXCEPTION
    30. #PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
    31. )
    32. );
    33. $this->exec("SET CHARACTER SET ".$config['charset']);
    34. }
    35. catch (PDOException $e)
    36. {
    37. $this->error.='Fehler beim Öffnen der Datenbank: ' . $e->getMessage();
    38. echo $this->error; #Fehler ausgabe
    39. }
    40. }
    41. /**
    42. * get_config
    43. * Konfigurations Daten (Verbindungsdaten)
    44. * Standard einstellung Default
    45. * @param instance (string)
    46. */
    47. private function get_config($instance = 'default')
    48. {
    49. if(is_file($this->db_file))
    50. {
    51. $config = include $this->db_file;
    52. return $config[$instance];
    53. }
    54. $this->error.='Konfiguration Datei nicht gefunden.<br>';
    55. return false
    56. }
    57. /**
    58. * Eine Instanz des PDO Objektes übergeben
    59. * @return Objekt $db_obj
    60. */
    61. public static function get_db($instance = 'default')
    62. {
    63. if(!isset (self::$db_obj[$instance]))
    64. {
    65. self::$db_obj[$instance] = new Dbpdo($instance);
    66. }
    67. return self::$db_obj[$instance];
    68. }
    69. /**
    70. * exec
    71. * Auch exec Anfragen mit zählen
    72. * @param sql (string)
    73. **/
    74. public function exec($sql)
    75. {
    76. $this->anfragen ++;
    77. return parent::exec($sql); // Funktion der Eltern Klasse zurückgeben
    78. }
    79. /**
    80. * execute
    81. * Auch execute Anfragen mit zählen
    82. * Nach prepare
    83. * @param params (array)
    84. **/
    85. public function execute($params = array())
    86. {
    87. $this->anfragen ++;
    88. return parent::execute($params);
    89. }
    90. /**
    91. * get_anfragen
    92. * Gesamt Sql anfragen zurück geben
    93. **/
    94. public function get_anfragen()
    95. {
    96. return $this->anfragen;
    97. }
    98. } // Ende Klasse
    99. ?>
    Alles anzeigen


    Mfg Splasch

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von splasch ()