Ankündigung

Einklappen
Keine Ankündigung bisher.

mysqli per Parameter übergeben

Einklappen

Neue Werbung 2019

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

  • mysqli per Parameter übergeben

    Hallo Community,

    ich habe den Tipp von uha angenommen und interpretiert und versucht die mysqli-Verbindung in den Funktionen zu übergeben, dies schlägt jedoch massiv fehl. Angeblich ist die Variable $connect nicht definiert, obwohl diese im Main-File per connect.php inkludiert wurde.

    Fehlermeldung
    PHP-Code:
    NoticeUndefined variableconnect in /home/.sites/23/site2801510/web/usdev/game/pages/auth.php on line 16

    Catchable fatal error
    Argument 1 passed to User::login() must be an instance of mysqlinull givencalled in /home/.sites/23/site2801510/web/usdev/game/pages/auth.php on line 16 and defined in /home/.sites/23/site2801510/web/usdev/game/classes/User.class.php on line 41 
    auth.php
    PHP-Code:
    if(isset($_POST['submit_login'])) {
                
    // wenn der Username und das Passwort nicht leer sind, wird der User eingeloggt.
                
    if(!empty($_POST['username']) AND !empty($_POST['password'])) {
                    
    $user    =    new User();
                    if(
    $user->login($connect$_POST['username'], hash("sha512"$_POST['password']))) {
                        
    // wenn der Login erfolgreich war, wird der User auf die index-Seite weitergeleitet
                        
    header("Location: index.php?site=ucp");
                    } else {
                        
    // Fehlermeldung falls der Login fehlerhaft war
                        
    echo '<p class="error">Login fehlerhaft.</p>';
                    }
                } else {
                    
    // Fehlermeldung falls der Benutzername oder das Passwort fehlt
                    
    echo '<p class="error">Benutzername oder Passwort fehlt.</p>';
                }
            } 
    Hinweis: bei Zeile 16 handelt es sich um die $connect-Anfrage.

    index.php
    PHP-Code:
    <?php
        session_start
    ();
        require_once(
    "inc/funcs.php");
        require_once(
    "inc/connect.php");
        
        if(isset(
    $_GET['site']) AND file_exists("pages/" $_GET['site'] . ".php")) {
            
    $site    =    $_GET['site'] . ".php";
        } else {
            
    $site    =    "index.php";
        }
        
        
    loggingDB($connect$site " aufgerufen");
    ?>

    [..]

    <?php
        loadContent
    ("auth.php");
    ?>
    inc/funcs.php
    PHP-Code:
    function loadContent($site) {
            
    // Es wird geprüft ob die Seite übergeben wurde und ob die Seite überhaupt existiert
            
    if(isset($site) AND file_exists("pages/" $site)) {
                
    // falls positiv dann wird der Inhalt der Seite zurückgegeben
                
    return include("pages/" $site);
            } else {
                
    // andernfalls erscheint eine Fehlermeldung
                
    echo "Die angegebene Datei existiert nicht!";
                return 
    false;
            }
        } 
    Nun, zum eigentlichen Problem. Ich prüfe in der auth.php ob der Benutzer eingeloggt ist, wenn nicht, dann soll das Formular erscheinen und wenn auf Absenden gedrückt wird, dann werden die Eingaben an die $user->login() Funktion übergeben, diese sieht vor ein mysqli-Objekt zu erhalten, einen Benutzernamen sowie ein Passwort.

    User.class.php - login()
    PHP-Code:
    function login(mysqli $connect$username$password) {            
                
    $sqlUser    =    $connect->query("SELECT `username`, `password` FROM `users` WHERE `username` = '$username'");
                if(
    $sqlUser->num_rows 0) {
                    
    $rstUser    =    $sqlUser->fetch_object();
                    
                    if(
    $rstUser->password    ==    $password) {
                        
    $_SESSION['loggedIn']    =    true;
                        
    $_SESSION['username']    =    $username;
                        
    loggingDB($connect$username " hat sich eingeloggt");
                        
                        
    $timestamp    =    time();
                        
    $connect->query("UPDATE `users` SET `lastLogin` = '$timestamp' WHERE `username` = '$username'");
                        return 
    true;
                    }
                } else {
                    echo 
    "Dieser Benutzername existiert nicht!";
                }
                return 
    false;
            } 
    Nun wird laut der Fehlermeldung aber kein $connect übergeben, somit ergibt sich die zweite Fehlermeldung dass keine mysqli-Instanz übergeben wurde sondern NULL, nun möchte ich gerne wissen, wie ich OHNE global $connect, zu meinem gewünschten Ergebnis komme, nämlich jenem dass der Benutzer eingeloggt wird. Bei der Funktion loggingDB() funktioniert es ja auch ohne irgendwelche Vorkommnisse, da wird aber genau dasselbe Prinzip angewandt, liegt es ggf. daran dass die auth.php inkludiert wird, das kann ich mir jedoch nicht vorstellen.

    LG
    Rier


  • #2
    Innerhalb loadContent existiert $connect aber nicht.
    Zitat von nikosch
    Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

    Kommentar


    • #3
      Zitat von tkausl Beitrag anzeigen
      Innerhalb loadContent existiert $connect aber nicht.
      Hallo tkausl,

      ist das denn notwendig? Immerhin wird der Inhalt ja im Endeffekt eh mit der index.php zusammengeführt und darin wird $connect durch inc/connect.php definiert, somit müsste die Variable dann ja für alle weiterhin inkludierten Seiten oder Abschnitte verfügbar sein, zumindest basiert mein System auf dieser Logik, sag' mir jetzt nicht dass das so nicht funktioniert.

      Das Problem tritt im Übrigen erst auf, seit ich versuche die mysqli-Verbindung über die Funktion zu übergeben und die global $connect-'s entfernt habe.

      Kommentar


      • #4
        Du includest aber die auth.php innerhalb der loadContent, daher gilt auch deren Namensraum.
        Zitat von nikosch
        Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

        Kommentar


        • #5
          Versteh, danke.

          Ich habe nun loadContent() adaptiert und übergebe dort ebenfalls ein mysqli-Objekt, sollte keines übergeben werden, weil nicht benötigt, wird einfach NULL in die Variable geschrieben.

          Nun tritt aber der Fehler dennoch auf, dass mysqli kein Objekt darstellt sondern NULL, in der index.php im Bereich von loadContent("auth.php") habe ich nun loadContent("auth.php", $connect) und demnach gilt $connect auch in loadContent() und darum müsste auth.php diese Variable ja auch als mysqli-Objekt übernehmen.

          PHP-Code:
          function loadContent($sitemysqli $connect    =    NULL) {
                  
                  
          // Es wird geprüft ob die Seite übergeben wurde und ob die Seite überhaupt existiert
                  
          if(isset($site) AND file_exists("pages/" $site)) {
                      
          // falls positiv dann wird der Inhalt der Seite zurückgegeben
                      
          return include("pages/" $site);
                  } else {
                      
          // andernfalls erscheint eine Fehlermeldung
                      
          echo "Die angegebene Datei existiert nicht!";
                      return 
          false;
                  }
              } 
          PHP-Code:
          loadContent("auth.php"$connect); 
          Dass kein mysqli-Objekt übergeben wird kann ich mir nicht erklären, es müsste doch in loadContent() das Objekt übergeben werden, wenn deklariert, und das ist in meinem Fall so, und damit könnte auth.php dann auch arbeiten, die Userklasse erwartet in login() ein mysqli-Objekt, welches ich loadContent() übergebe.

          Kommentar


          • #6
            Dann wird dort wo login aufgerufen wird $connect schon nicht mehr verfügbar sein.
            Zitat von nikosch
            Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

            Kommentar


            • #7
              Hat es Sinn wenn ich das mysqli-Objekt in $con_tmp zwischenlagere und dieses übergebe? Sonst würde mir außer global $connect keine Lösung einfallen.

              Kommentar


              • #8
                Deine 2. Fehlermeldung sagt das der Parameter bei User::login() eine mysqli instanz sein muss. Wie sieht denn deine connect.php aus? Ist $connect ein Array oder wirklich eine Klasse?

                Kommentar


                • #9
                  PHP-Code:
                  <?php
                      
                  // Lokale Verbindungsinformationen
                      //$host        =    "localhost";
                      //$username    =    "root";
                      //$password    =    "";
                      //$database    =    "us";
                      
                      // Server Verbindungsinformationen
                      
                  $host        =    "";
                      
                  $username    =    "";
                      
                  $password    =    "";
                      
                  $database    =    "";
                      
                      @
                  $connect = new mysqli($host$username$password$database);
                  ?>
                  Eigentlich ein Objekt.

                  Kommentar


                  • #10
                    Oder eben doch nicht:

                    PHP-Code:
                    $connect = new mysqli($host$username$password$database); // weg mit dem @
                    var_dump($connect// mach das mal rein 
                    Frag doch ab ob es Fehler gab und nicht mit @ unterdrücken. Siehe: http://php.net/manual/de/mysqli.error.php

                    LG
                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Die Ausgabe von var_dump sagt eindeutig dass es ein Objekt ist.

                      Code:
                      object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(79) "mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $" ["client_version"]=> int(50011) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(35) " via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(6) "5.5.39" ["server_version"]=> int(50539) ["stat"]=> string(151) "Uptime: 1301165 Threads: 4 Questions: 161485208 Slow queries: 16 Opens: 2066145 Flush tables: 1 Open tables: 512 Queries per second avg: 124.108" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(3272250) ["warning_count"]=> int(0) }
                      Wenn ich var_dump($connect) in inc/funcs.php unter loadContent() anwende bekomme ich NULL, d.h. das mysqli-Objekt wird nicht mal übergeben an die Funktion, aufgrunddessen kann dann natürlich auch nicht von auth.php darauf zugegriffen werden.

                      loadContent()
                      PHP-Code:
                      function loadContent($sitemysqli $connect    =    NULL) {
                              
                      var_dump($connect);
                              
                      // Es wird geprüft ob die Seite übergeben wurde und ob die Seite überhaupt existiert
                              
                      if(isset($site) AND file_exists("pages/" $site)) {
                                  
                      // falls positiv dann wird der Inhalt der Seite zurückgegeben
                                  
                      return include("pages/" $site);
                              } else {
                                  
                      // andernfalls erscheint eine Fehlermeldung
                                  
                      echo "Die angegebene Datei existiert nicht!";
                                  return 
                      false;
                              }
                          } 
                      mysqli $connect = NULL macht ja eigentlich, dass wenn $connect eben nicht übergeben wird, die Variable trotzdem mit NULL gefüllt wird, ich habe aber loadContent("auth.php", $connect) in meinem Main-File stehen, somit müsste das Objekt übergeben werden.

                      Das alles nur wegen ein paar globals.

                      Kommentar


                      • #12
                        PHP-Code:
                        <?php 
                            loadContent
                        ("auth.php"); 
                        ?>
                        PHP-Code:
                        function loadContent($site) { 
                        d.h. das mysqli-Objekt wird nicht mal übergeben an die Funktion
                        dann übergib es?!

                        Im Grunde ist es in der Theorie ja einfach, alles was die Funktion nicht "selbst hat", aber zum arbeiten braucht muss man von außen als Parameter reingeben (abgesehen von POST, GET etc.. jetzt mal).

                        LG
                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar


                        • #13
                          PHP-Code:
                          loadContent("auth.php"$connect); 
                          PHP-Code:
                          function loadContent($sitemysqli $connect NULL) { 
                          Das ist der derzeitige Stand, nun funktioniert es seltsamerweise - jedoch tritt genau dasselbe Problem bei einer anderen Funktion auf.

                          User.class.php - getDB()
                          PHP-Code:
                          function getDB($propertymysqli $connect) {
                                      
                          $username    =    $this->username;
                                      
                                      
                          $sqlGet    =    $connect->query("SELECT `$property` FROM `users` WHERE `username` = '$username'");
                                      
                          $rstGet    =    $sqlGet->fetch_object();
                                                  
                                      return 
                          $rstGet->$property;
                                  } 
                          In diesem Fall ist NULL nicht notwendig, weil es immer benötigt wird. Das wird in ucp.php aufgerufen und ucp.php wird über loadContent() geladen, demnach das gleiche Prinzip.

                          var_dump($connect) in ucp.php ergibt wieder NULL, warum auch immer es in auth.php funktioniert und über die gleiche Funktion in ucp.php nicht mehr.
                          ucp.php
                          PHP-Code:
                          if($user->getDB("teamID"$connect) == NULL) {
                                      echo 
                          'Du hast noch kein Team gegründet, möchtest du dies jetzt tun? <a href="index.php?site=create&type=team">Team gründen</a><br />';
                                  } else {
                                      
                          $teamID    =    $user->getDB("teamID"$connect);
                                      
                                      
                          $team    =    new Team();
                                      echo 
                          '<div class="overview">Dies ist ein Text um zu zeigen, dass hier die Übersicht von <b>' $team->getDB("teamname"$teamID) . '</b> platziert sein wird!</div>';
                                  } 

                          Kommentar

                          Lädt...
                          X