Ankündigung

Einklappen
Keine Ankündigung bisher.

2 Werte aus einer Function zurückgeben

Einklappen

Neue Werbung 2019

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

  • 2 Werte aus einer Function zurückgeben

    Hey,

    ich habe eine Function die mittels eines suchpattern einen Spalte aus der DB ziehen soll. Ebenso möchte ich diese gezogenen Spalten zählen.

    Das heißt ich habe 1mal den Inhalt der gefundenen Spalten und 1mal die Anzahl der gefundenen Spalten. Nun brauche ich diese 2 Werte außerhalb des Funktionscopes um die ausgeben zu können.

    Ich habe es so versucht:
    PHP-Code:
    public function selectDataFromDB($suchmuster){

                try{

                    
    $sql "SELECT link FROM searchfunction WHERE suchmuster LIKE %:suchmuster%";

                    
    $stmt $this->dbConnection->prepare($sql);
                    
    $result $stmt->execute(array( ":suchmuster" => $suchmuster));

                    
    $rows $stmt->fetchAll(PDO::FETCH_ASSOC);
                    
    $countedRows count($rows);

                    return 
    $rows;
                    return 
    $countedRows;

                } catch(
    Exception $e){

                    
    error_log("Es ist ein Fehler aufgetreten " $e->getMessage(), __DIR__ "logs/errorlog.txt");
                    exit();
                }
            } 
    Wenn ich das so mache bekomme ich ne Fehlermeldung. Nun wenn ich 1 return entferne, dann erhalte ich aber keinen Wert.

    Ich rufe es so außerhalb auf:

    PHP-Code:
    $searchvalidator = new Search();

        if(isset(
    $_GET['searched'])){

            if(
    count($searchvalidator->error) > 0){

              
    $error $searchvalidator->error;

            }

            
    $searchvalidator->setSuchwort($_GET["search"]);
            
    $searchPattern $searchvalidator->getSuchwort();

            
    var_dump($searchPattern); // -> Hier wird das richtige suchmuster angezeigt

            
    $searchvalidator->connectToDB("localhost""drone""root""");
            
    $result $searchvalidator->selectDataFromDB($searchPattern);

            
    var_dump($result); // hier wird nix angezeigt

        

    Warum ist das den so ?

    Moonracer

  • #2
    Du könntest ja auch die Anzahl außerhalb der Funktion anhand der Rows bestimmen. Oder die Funktion gibt ein Array zurück oder du nutzt Referenzen.
    Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

    Kommentar


    • #3
      Im hier geschilderten Fall kannst Du in der Tat die Anzahl aus $rows berechnen.

      Zur eigentliche Frage: php unterstützt per Implementierung keine multiplen Returns.

      Kommentar


      • #4
        Return doch ein DBResponseObject, wenn Dir am einheitlichen Zugriff gelegen ist.

        Kommentar


        • #5
          Hey,

          vielen Dank für die zahlreichen Hilfestellungen.

          Stimmt ja. Dann kann ich das Array returnen und außerhalb der Klasse die Anzahl der gefundenen Keys herausfinden.

          Jedoch wenn ich es so mache, bekomme ich immernoch keine Daten zurück.

          Ich habe in der Datenbank in den Zeilen vom Suchmuster folgende Werte stehen: land, kontakt, tutorials, dazu ist noch eine weitere Spalte welche von den 3 suchmustern den link enthält.

          PHP-Code:
          public function selectDataFromDB($suchmuster){

                      try{

                          
          $sql "SELECT link FROM searchfunction WHERE suchmuster LIKE %:suchmuster%";

                          
          $stmt $this->dbConnection->prepare($sql);
                          
          $result $stmt->execute(array( ":suchmuster" => $suchmuster));

                          
          $rows $stmt->fetchAll(PDO::FETCH_ASSOC);

                          return 
          $rows;


                      } catch(
          Exception $e){

                          
          error_log("Es ist ein Fehler aufgetreten " $e->getMessage(), __DIR__ "logs/errorlog.txt");
                          exit();
                      }
                  } 
          Habe es jetzt mal mit Kontrollstruktur (if/else) versucht. Und da switch er immer in das else. Das heißt $rows existiert nichtmal.
          Ebenso gedebugt. Bei $result wird immer bool(false) ausgegeben. Warum ist es False ?

          Hier ist meine Function welche die Verbindung herstellt (Aber das funktioniert, habe schon getestet):
          PHP-Code:
          public function connectToDB($host$dbname$username$password){

                      try{

                          
          $dbv = new PDO("mysql:host=" $host ";dbname=" $dbname ";charset=utf8"$username$password);

                          
          $this->dbConnection $dbv;

                      } catch(
          Exception $e){

                          
          error_log("Es ist ein Fehler aufgetreten " $e->getMessage(), __DIR__ "logs/errorlog.txt");
                          exit();
                      }

                  } 
          Return doch ein DBResponseObject, wenn Dir am einheitlichen Zugriff gelegen ist.
          Wie meinst du das? Wo kann ich denn dieses DBResponseObject finden? Ich finde bei der Suche danach lediglich functionen im php-handbuch.

          Kommentar


          • #6
            Du solltest das Error-Reporting aktivieren:

            PHP-Code:
            $this->dbConnection = new PDO(
                
            'mysql:host=' $host ';dbname=' $dbname ';charset=utf8',
                
            $username,
                
            $password,
                [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
            ); 

            Kommentar


            • #7
              Ich blick grad nicht mehr durch. Ich verstehe grad nurnoch Bahnhof.

              Ich habe jetzt mal rumgetestet.

              Wenn ich es so erstelle dann gibt der mir ein Ergebnis aus:
              PHP-Code:
              public function connectToDB($host$dbname$username$password){

                          try{

                              
              $dbv = new PDO("mysql:host=" $host ";dbname=" $dbname ";charset=utf8"$username$password);

                              return 
              $dbv;

                          } catch(
              Exception $e){

                              
              error_log("Es ist ein Fehler aufgetreten " $e->getMessage(), __DIR__ "logs/errorlog.txt");
                              exit();
                          }

                      }

                      public function 
              selectDataFromDB($dbv){

                          try{

                              
              $sql "SELECT suchmuster, link FROM searchfunction WHERE suchmuster LIKE '%la%'";

                              
              $stmt $dbv->prepare($sql);
                              
              $stmt->execute();

                              
              $rows $stmt->fetchAll(PDO::FETCH_ASSOC);


                              if(
              $rows){
                                  return 
              $rows;
                              } else{
                                  return 
              "No rows exists";
                              }


                          } catch(
              Exception $e){

                              
              error_log("Es ist ein Fehler aufgetreten " $e->getMessage(), __DIR__ "logs/errorlog.txt");
                              exit();
                          }
                      } 
              Sobald ich aber anstand la ein Platzhalter hinzufüge und diesem den Wert mittels bindParam mitgebe wird wieder ins else gesprungen... Ich check nicht warum.
              PHP-Code:
              public function selectDataFromDB($dbv$muster){

                          try{

                              
              $sql "SELECT suchmuster, link FROM searchfunction WHERE suchmuster LIKE '%:muster%'";

                              
              $stmt $dbv->prepare($sql);
                              
              $stmt->bindParam(":muster"$musterPDO::PARAM_STR);

                              
              $stmt->execute();

                              
              $rows $stmt->fetchAll(PDO::FETCH_ASSOC);


                              if(
              $rows){
                                  return 
              $rows;
                              } else{
                                  return 
              "No rows exists";
                              }


                          } catch(
              Exception $e){

                              
              error_log("Es ist ein Fehler aufgetreten " $e->getMessage(), __DIR__ "logs/errorlog.txt");
                              exit();
                          }
                      } 
              So führe ich die Methoden der Klasse aus:
              PHP-Code:
              $searchvalidator = new Search();

                  if(isset(
              $_GET['search'])){

                      if(
              count($searchvalidator->error) > 0){

                        
              $error $searchvalidator->error;

                      }

                      
              $searchvalidator->setSuchwort($_GET["search"]);
                      
              $pattern $searchvalidator->getSuchwort(); // hier ist das suchwort drin. Habe ich schon gedebugt


                      
              $connection $searchvalidator->connectToDB("localhost""drone""root""");
                      
              $result $searchvalidator->selectDataFromDB($connection$pattern);

                      
              var_dump($result); // hier kommt immer : No rows exists


                  

              EDIT:

              Mir werden keine Fehler oder Warnings ausgegeben. ErrorReporting habe ich auch schon eingeschaltet. Findet auch nix.

              Kommentar


              • #8
                Zitat von Moonracer Beitrag anzeigen
                Mir werden keine Fehler oder Warnings ausgegeben. ErrorReporting habe ich auch schon eingeschaltet. Findet auch nix.
                Davon seh ich im Code nichts.

                Deine ganzen try-catch kannst du übrigens raushauen, sie bringen keinen Mehrwert. Eine Funktion sollte von sich aus nicht einfach die Anwendung mit exit beenden.

                Kommentar


                • #9
                  Zitat von Moonracer Beitrag anzeigen
                  Hey,
                  ie meinst du das? Wo kann ich denn dieses DBResponseObject finden? Ich finde bei der Suche danach lediglich functionen im php-handbuch.
                  Bau dir eine classe, fülle diese in Deiner Funktion function mit allen notwendigen und optinalen Werten.
                  Sobald ich aber anstand la ein Platzhalter hinzufüge und diesem den Wert mittels bindParam mitgebe wird wieder ins else gesprungen... Ich check nicht warum.
                  https://php-de.github.io/jumpto/sql/

                  Kommentar


                  • #10
                    hellbringer : Ich habe den Errormode nachdem ich deinen Post gesehen habe hinzugefügt. Da wird mir jedoch kein Fehler angezeigt.

                    Ich returne in der DB die DB-Connection. Somit wird außerhalb diese erstellt. Die außerhalb erstellte Connection gebe ich dann der selectFunction mit.

                    tomBuilder : Ah so meinst du das. Ist auch ne Möglichkeit. Möchte aber zuerst wissen warum das nicht funktioniert.
                    ______________

                    Mein aktueller Code ist das:

                    PHP-Code:
                    public function connectToDB($host$dbname$username$password){

                                try{

                                    
                    $dbv = new PDO("mysql:host=" $host ";dbname=" $dbname ";charset=utf8"$username$password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

                                    return 
                    $dbv;

                                } catch(
                    Exception $e){

                                    
                    error_log("Es ist ein Fehler aufgetreten " $e->getMessage(), __DIR__ "logs/errorlog.txt");
                                    exit();
                                }

                            }

                            public function 
                    selectDataFromDB($dbv$muster){

                                try{

                                    
                    $sql "SELECT suchmuster, link
                                            FROM searchfunction
                                            WHERE suchmuster
                                            LIKE '%:muster%' "
                    ;


                                    
                    $stmt $dbv->prepare($sql);

                                    echo 
                    "STMT vor bindParam: <br>";
                                    
                    var_dump($stmt) . "<br>";

                                    
                    $stmt->bindParam(":muster"$musterPDO::PARAM_STR);

                                    echo 
                    "STMT nach bindParam:";
                                    
                    var_dump($stmt) . "<br>";

                                    
                    $result $stmt->execute();

                                    
                    var_dump($result);

                                    
                    $rows $stmt->fetchAll(PDO::FETCH_ASSOC);

                                    
                    var_dump($rows);

                                    if(
                    $rows){
                                        return 
                    $rows;
                                    } else{
                                        return 
                    "No rows exists";
                                    }


                                } catch(
                    Exception $e){

                                    
                    error_log("Es ist ein Fehler aufgetreten " $e->getMessage(), __DIR__ "logs/errorlog.txt");
                                    exit();
                                }
                            } 
                    Beim ersten Var_dump kommt das raus: object(PDOStatement)#3 (1) { ["queryString"]=> string(102) "SELECT suchmuster, link FROM searchfunction WHERE suchmuster LIKE '%:muster%' " }
                    Beim zweiten Var_dump kommt das raus: object(PDOStatement)#3 (1) { ["queryString"]=> string(102) "SELECT suchmuster, link FROM searchfunction WHERE suchmuster LIKE '%:muster%' " }
                    Beim dritten Var_dump kommt das raus: bool(true)
                    Beim vierten Var_dump kommt das raus: array(0) { }

                    Wenn ich mir das so ansehe kommt der Fehler von dem, von außen hinzukommenden suchwort. Aber ich habe schon die variable ausgegeben. Und da wird der richtige Wert ausgegeben. Also kann die doch nicht leer sein.

                    Außen sieht es so aus:

                    PHP-Code:
                    <?php

                        error_reporting
                    (E_ALL);

                        if (
                    file_exists("../backend/searchvalidator.php")) {
                          include(
                    "../backend/searchvalidator.php");
                        }

                        
                    $searchvalidator = new Search();

                        if(isset(
                    $_GET['search'])){

                            if(
                    count($searchvalidator->error) > 0){

                              
                    $error $searchvalidator->error;

                            }

                            
                    $searchvalidator->setSuchwort($_GET["search"]);
                            
                    $pattern $searchvalidator->getSuchwort();

                           
                    var_dump($pattern);

                            
                    $connection $searchvalidator->connectToDB("localhost""drone""root""");
                            
                    $result $searchvalidator->selectDataFromDB($connection$pattern);

                            
                    var_dump($result);


                        }
                    ?>
                    Beim erstem var_dump wird mir dies ausgegeben was ich search= zuweise (example.com?search=suchwort).
                    Beim zweiten var_dump wird mir dies ausgegeben: "No rows exists"

                    Kommentar


                    • #11
                      PHP-Code:
                       LIKE '%:muster%' 
                      Das ist falsch.
                      Code:
                      ' ... LIKE :muster ... '
                      und beim binden dann
                      PHP-Code:
                      '%'.$var.'%' 
                      The string "()()" is not palindrom but the String "())(" is.

                      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


                      • #12
                        Oha... Ich dachte so wird das gemacht.

                        Ein großen Danke.

                        Kommentar


                        • #13
                          hellbringer :

                          Ok. Dann würde ich das try/catch doch beim Funktionsaufruf erstellen. Wäre ja schon besser.

                          Kommentar

                          Lädt...
                          X