Ankündigung

Einklappen
Keine Ankündigung bisher.

OOP Mysqli Datenbank Problem

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • OOP Mysqli Datenbank Problem

    Guten Abend,

    ich habe mich mal an OOP gewagt, und habe ein kleines Problem. Ich möchte eine art zentrale Mysqli Connect Funktion für meine Klassen schaffen, nur funktioniert das nicht so, wie ich es will. Ich weiß das folgender Code unter anderem auch Prozedural programmiert wurde, mir geht es aber um das Prinzip.

    Der komplette Code:

    PHP-Code:
    class Mysql {
        protected 
    $db_host 'localhost';
        protected 
    $db_user 'root';
        protected 
    $db_pass '';
        protected 
    $db_name 'ams';

        public function 
    connect() {
            
    $connect_db = new mysqli$this->db_host$this->db_user$this->db_pass$this->db_name );
            if (
    mysqli_connect_errno()) {echo mysqli_connect_error();exit();}
            return 
    true;
        }
        
        public function 
    login() {
            if(isset(
    $_POST['submit'])){
                
    $username $_POST['username'];
                
    $password $_POST['password'];
                
    $checkacc mysqli_query("SELECT id FROM users WHERE username = '$username' AND password = '$password' LIMIT 1");
                if(
    mysqli_num_rows($checkacc) == 1) {
                    
    $_SESSION['username'] = $username;
                    
    header("Location: dashboard.php");
                } else {echo 
    'Wrong username or password! Please try again';}
            }
        }

    Da die mysqli_query() Funktion nun eine Mysql Verbindung braucht, muss ich diese natürlich mit rein bringen:

    PHP-Code:
    mysqli_query($connect_db"..."
    Mein Problem ist nur das wenn ich in der login Klasse die variable $connect_db benutzen will, diese naürlich nicht existiert - logisch, da sie in der connect Klasse ist. Also: Kann man die eigenschaften und Variablen der connect Klasse in die login Klasse vererben oder eine Public Funktion erstellen? Ich möchte ungern in jeder neuen Methode (Funktion) eine Datenbank Verbindung einbauen.

    Hoffe mir kann jemand helfen, und es ist einigermaßen verständlich
    Rewards!

  • #2
    Entweder du übergibst jeder Klasse von dir einen Handler auf deine MySQL-Klasse, oder du speicherst die Variablen $connect_db in einer statischen Klassenvariable.
    [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
    [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

    Kommentar


    • #3
      Wobei erstgenanntes zu bevorzugen ist.
      [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

      Kommentar


      • #4
        Danke erstmal für die antworten, mein Code sieht nun folgenermaßen aus:

        PHP-Code:
        class Mysql {
            protected 
        $db_host 'localhost';
            protected 
        $db_user 'root';
            protected 
        $db_pass '';
            protected 
        $db_name 'ams';

            public function 
        connect() {
                
        $connect_db = new mysqli$this->db_host$this->db_user$this->db_pass$this->db_name );
                if (
        mysqli_connect_errno()) {echo mysqli_connect_error();exit();}
                return 
        true;
            }  
        }

        class 
        Login extends Mysql {
            public function 
        login() {
                if(isset(
        $_POST['submit'])){
                    
        $username $_POST['username'];
                    
        $password $_POST['password'];
                    
        $checkacc mysqli_query(parent::$connect_db"SELECT id FROM users WHERE username = '$username' AND password = '$password' LIMIT 1");
                    if(
        mysqli_num_rows(parent::$connect_db$checkacc) == 1) {
                        
        $_SESSION['username'] = $username;
                        
        header("Location: dashboard.php");
                    } else {echo 
        'Wrong username or password! Please try again';}
                }
            }

        Nun bekomm ich die Fehlermeldung: Fatal error: Access to undeclared static property: Mysql::$connect_db in C:\xampp\htdocs\ams\class\main.class.php on line 23

        Line 23: $checkacc = mysqli_query(parent::$connect_db, "...");

        Was ja heißt das ich keinen Zugriff auf die deklarierte (statische) Eigenschaft Mysql::$connect_db habe - Nur weiß ich leider nicht was ich machen kann/soll das diese Zugriff hat. Hoffe ihr könnt mir da noch einen Tipp oder ein Codebeispiel geben.

        Edit:
        Wenn ich public static $connect_db; deklariere ist die fehlmeldung zwar weg, aber PHP meldet dann: mysqli_query() expects parameter 1 to be mysqli, null given. Was auch logisch ist, da nichts drin ist - deshalb der 0 Wert

        Kommentar


        • #5
          wie wärs wenn du einen anderen ansatz gehst? den Repository ansatz?

          extends ist eine "ist ein" beziehung, sprich wenn du es vorliest," Login ist ein MySQL" ergibt es keinen sinn, du hast es ledeglich abgeleitet weil du auf die connection zugreifen wolltest.

          anderer ansatz

          PHP-Code:
          class PDOUserRepository{

          private 
          $connection null;
          public function 
          construct(PDO $connection){
          $this->connection $connection;
          }

          public function 
          findByUsernamAndHash($username,$hash){

          $sql "SELECT id,username,password,weitere_felder FROM users WHERE username = :username AND password = :password";
          $statement $this->connection->prepare($sql);
          $result $statment->execute(array(
          ':username'=>$username,
          ':password'=>$hash
          ));

          $found $result->fetch(PDO::FETCH_OBJ);

          //hier könntest du das stdClass noch umwandeln in ein für dich passenderes Objekt
          return $found;
          }


          ich habe hier PDO genommen wiel ich keine ahnung von mysqli habe und wollte die docu jetzt nicht durchlesen.

          nun zu deinem Login

          bootstrap.php
          PHP-Code:
          include 'config.php';

          $dsn ='mysql:host=localhost;dbname='.$dbname;
          $pdo = new PDO($dsn,$username,$password); 
          login.php (datei die nach dem login aufgerufen wurde)
          PHP-Code:
          include 'bootstrap.php'//die bootstrap muss jede datei includen

          if(isset($_POST['username']) && isset($_POST['password'])){
          $userRepository = new PDOUserRepository($pdo);
          $hash hash('sha256',$_POST['password']);
          $user $userRepository->findByUsernameAndHash($_POST['username'],$hash);
          if(
          $user){
            
          $_SESSION['username'] = $user->username;
                          
          header("Location: dashboard.php");
                      } else {
          echo 
          'Wrong username or password! Please try again';

          }


          das ganze kannst du nun in eine klasse Login und der Methode "ausführen" verpacken(also nur die logik dass du aus dem repository den user suchst) so dass du dann ein aufruf wie in etwa

          PHP-Code:
          $login = new Login($userRepository);
          $loginRequest = new LoginRequest($_POST['username'],$_POST['password']);
          $login->process($loginRequest); 
          übersetzt dann quasi $login->ausführen($anfrage)
          apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

          Kommentar

          Lädt...
          X