Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PDO Fehler

Einklappen

Neue Werbung 2019

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

  • [Erledigt] PDO Fehler

    Guten Tag liebe Community,
    mir raucht zur Zeit wirklich der Kopf, ich habe schon alles durchsucht aber immer finde ich wieder andere Fehlerursache, die jedoch nicht mit meinem konkreten Fehlerbild übereinstimmen.
    Deshalb stelle ich nun nach langem suchen dieses Problem hier hinein in der Hoffnung das mir hier jemand schnell den Fehler zeigen kann.
    Fehler: Fatal error: Cannot use object of type PDOStatement as array
    Der Code dazu:
    PHP-Code:
    public function getCheckBoxes ($array$selectpath$wherestatment1$wherestatement2$wherevariable)
       {
          echo 
    '<table width="95%" align="center">';      
          foreach (
    $array as $array_id => $array_name)
          {
             echo 
    '<tr><td><div class="row"><div class="input-group"><span class="input-group-addon">';
             
    $res_get_active_rights $this->database->dbStatement('SELECT * FROM ? WHERE ? = ? AND ? = ?'
                   array(
                         
    $selectpath,
                         
    $wherestatment1,
                         
    $wherevariable,
                         
    $wherestatement2,
                         
    $array_id
                   
    ));
             if(
    $res_get_active_rights->rowCount() > 0)
             {
                echo 
    '<input type="checkbox" name="CheckBoxArray['.$array_id.']" checked=">" value="1">';
             }
             else
             {
                echo 
    '<input type="checkbox" name="CheckBoxArray['.$array_id.']" value="1">';
             }
             echo 
    '</span><input type="text" class="form-control" value="'.$array_name.'" disabled></td></tr>';
          }
       } 
    Danke schonmal für eure Hilfe


  • #2
    Du wirst vergessen haben, das Daten-Array vom Statement zu fetchen, aber da Du scheinbar mit eigenen Wrapper-Klassen arbeitest, kann man Dir aufgrund des vorliegenden Code-Abschnittes nicht viel mehr dazu sagen...
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Achso ja habe ich vergessen mit dabei zu posten das hole ich mal eben nach:
      PHP-Code:
      private function makeDbSelect ($sqlStatement$variableArray)
         {
            
      $sql_select "SELECT " $sqlStatement;
            
      $count substr_count($sql_select"?");
            
      $prepared_select $this->conn->prepare($sql_select);
            if(
      $variableArray != NULL)
            {
               for (
      $i 1$i <= $count$i ++)
               {
                  
      $prepared_select->bindParam($i$variableArray[$i 1]);
               }
            }
            if(
      $prepared_select->execute())
            {
               return 
      $prepared_select;
            }
            else
            {
               return 
      $prepared_select->execute();
            }
         } 

      Kommentar


      • #4
        Schön, Du postest eine Funktion makeDbSelect, die keinen direkten Bezug zu der von Dir zuvor geposteten getCheckBoxes hat.

        Interessant wäre, wie Du den Rückgabewert $prepared_select verarbeitest!
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar


        • #5
          Diese Funktion benutzt jedoch den PDO und wird von dem dbStatement aufgerufen, da das SELECT am Anfang erkannt worden ist. Das $prepared_select wird ganz normal vom PDO Objekt aus prepared, also die PDO Standardfunktion.

          Kommentar


          • #6
            Das versteht man glaube ich noch immer nicht. Die Fehlermeldung ist aber eigentlich auch eindeutig. Du nutzt eine Instanz von PDOStatement an einer Stelle, an der ein Array erwartet wird. (Ich tippe auf die foreach-Zeile, das wäre also die Variable $array.) So viele Instanzen von PDOStatement wirst du da ja nicht rumfliegen haben. Debuggen.

            - http://php-de.github.io/#debugging
            - http://phpforum.de/forum/showthread.php?t=216988

            Kommentar


            • #7
              $prepared_select ist ein Objekt vom Typ PDOStatement. Die Fehlermeldung besagt, daß Du vermutlich dieses als Array verwendest, bspw. mit foreach versuchst zu durchlaufen.
              Nur kann man nirgendwo bei Deinen Code-Schnipseln sehen, wo Du das machst... Daher kann man das anhand der Meldung nur vermuten, mehr nicht.
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #8
                Danke für die Hilfe soweit, ich habe den Fehler soweit entdeckt, das liegt wirklich an der Verwendung mit dem Array. Ich werde versuchen das ganze mal anzupassen und umzustellen.

                Kommentar


                • #9
                  PHP-Code:
                        if($prepared_select->execute())
                        {
                           return 
                  $prepared_select;
                        }
                        else
                        {
                           return 
                  $prepared_select->execute();
                        } 
                  Das würde ich tendenziell eher so schreiben:

                  PHP-Code:
                  if ($prepared_select->execute()) {
                      return 
                  $prepared_select;
                  }

                  return 
                  false
                  Ich musste beim aktuellen Code echt lange überlegen, wie das gedacht ist.

                  Kommentar


                  • #10
                    Ist jetzt nur mal so als informative Nachfrage gedacht, was spricht gegen
                    PHP-Code:
                    return ($prepared_select->execute)? $prepared_selectfalse
                    auch wenn das für den einen oder anderen ein AssKick auf den Trinitäts-Operator sein mag, aber ich persönlich würde das eher so schreiben, als mehrfache Rückgaben zu definieren?
                    Competence-Center -> Enjoy the Informatrix
                    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                    Kommentar


                    • #11
                      Dagegen spricht in erster Linie die schlechte Erweiterbarkeit. Ich hab mir angewöhnt, vor einem return false eine Warnung zu werfen, wie z.B.
                      PHP-Code:
                          if(empty($match)) {
                            
                      trigger_error('Unknown Parameter "'.$unitP.'" for '.__METHOD__E_USER_WARNING);
                            return 
                      false;
                          } 
                      wenn ein Ignorieren von false als Rückgabe zu schweren Folgefehlern führen kann. Ist aber auch etwas Geschmackssache. Selbst nutze ich die Notation gerne aus reiner Schreibfaulheit.
                      PHP-Klassen auf github

                      Kommentar


                      • #12
                        Wobei die Frage ist, ob so was nicht besser über Exceptions zu regeln wäre.

                        was spricht gegen [den Konditionaloperator]
                        Für mich grundsätzlich nichts, falls die Anmerkung von jspit nicht relevant ist.

                        Ich würde hier aber eine Exception werfen. Ich halte wenig davon, wenn eine Methode/Funktion verschiedene Datentypen (bool, PDOStatement) zurückgibt.

                        Kommentar


                        • #13
                          Ok, die Formulierung oben klingt so das ich immer nur eine Warnung werfe. Ist vom Anwendungsfall abhängig, hätte ich zusetzen sollen.
                          Mir gefällt die Möglichkeit in der PDO-Klasse, per Attribut das Verhalten im Fehlerfall festlegen zu können:

                          PDO::ERRMODE_SILENT: Just set error codes.

                          PDO::ERRMODE_WARNING: Raise E_WARNING.

                          PDO::ERRMODE_EXCEPTION: Throw exceptions.

                          Leider ist das Verhalten nicht für alle Methoden 100%ig umgesetzt worden.
                          Dies kann jedoch relativ einfach auch auf eigene Klassen angewendet werden.
                          Je nach Einsatzfall kann so festgelegt werden wie die Klasse/Methode im Fehlerfall reagiert.
                          PHP-Klassen auf github

                          Kommentar


                          • #14
                            Ja, mit Fehlern/Exceptions habt ihr natürlich recht.
                            War nur mal ne Frage, weil ich öfter sehe, daß ihr ( damit ist keine Einzelperson gemeint, sondern verschiedene Profis hier ) mehrfach return innerhalb einer Funktion/Methode verwendet bzw. zumindest hier anbietet.
                            Ich für meinen Teil wehre mich dagen, was aber nur rein persönliche Einstellung ist!
                            Dachte, ich übersehe da evtl. einen entscheidenden Vorteil?

                            Danke für die Infos!
                            Competence-Center -> Enjoy the Informatrix
                            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                            Kommentar


                            • #15
                              Na ja, müsste man im Einzelfall beurteilen, denke ich. Hier ist sicher auch nicht jeder Code, den jemand in Antworten postet, stilistisch maximal durchdacht.

                              Ich bin auch eher ein Freund davon, ein return-Statement zu haben, aber Guard-Clauses, mit denen triviale Fälle schnell zu Beginn des Codekörpers abgehandelt werden, finde ich zum Beispiel ganz praktisch.

                              Code:
                              Here is a sample of code using guard clauses ...
                              
                                public Foo merge (Foo a, Foo b) {
                                  if (a == null) return b;
                                  if (b == null) return a;
                                  // complicated merge code goes here.
                                }
                              
                              
                              Some style guides would have us write this with a single return as follows ...
                              
                                public Foo merge (Foo a, Foo b) {
                                  Foo result;
                                  if (a != null) {
                                    if (b != null) {
                                      // complicated merge code goes here.
                                    } else {
                                      result = a;
                                    }
                                  } else {
                                    result = b;
                                  }
                                  return result;
                                }
                              - http://c2.com/cgi/wiki?GuardClause

                              Kommentar

                              Lädt...
                              X