Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Parameter wird als Referenz übergeben?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Parameter wird als Referenz übergeben?

    Hallo,
    ich hab hier ein absolutes Verständnisproblem. Ich hoffe Ihr könnt mir hier weiterhelfen.
    Also vorab, soweit ich das gelesen und verstanden habe übergibt PHP seine Werte immer als Call-by-Value, nie als Referenz es sei denn es wird explizit mit dem Ampersand vorangestellt angegeben.
    Mein Problem ist nun, ich versuche mittels eval einen PHP Befehl zusammenzusetzen, und der Parser meckert immer, das der zweite Parameter von der Methode $stmt->bin_param keine Referenz sein darf. Aber nach meinem Verständnis ist sie das auch nicht.
    Schaut doch bitte einmal drüber.

    PHP-Code:
    // $querystring enthält den Query mit entsprechenden Platzhaltern
    // $tpyes enthält die Werte, von welchem Typ das erwartete $_POST/$_GET Feld sein muss
    // $placeholder enthält die Anzahl an Platzhaltern im Query
    public function prepQuery($querystring,$types,$arr_placeholder_values = array())
    {
        
    // Prüft ob die Anzahl der Platzhalter mit der Anzahl der Typen und Datenfeldern übereinstimmt
        
    $ph substr_count($querystring,"?");    // Berechnet die Anzahl an Platzhaltern im querystring
        
    if(($ph == count($arr_placeholder_values)) && ($ph == strlen($types)))
        {
            
    $stmt        $this->db->prepare($querystring);
            
            
    $this->prepForBinding($types,$arr_placeholder_values);    // Aufruf um die Parameter für bind_param vorzubereiten 
                    
            
    eval('$stmt->bind_param(' $this->types ', ' $this->ph_values ');');    // Setzt die Werte als PHP Befehl für bind_param zusammen
            
    $stmt->execute();
                        
        }
        else
        {
            throw new 
    Exception("Die übergebenen Werte sind nicht stimmig!");
        }
    }

    private function 
    prepForBinding($types,$arr_placeholder_values)
    {
        
    $ph_values false;
        foreach(
    $arr_placeholder_values as $temp)
        {
            
    $ph_values  .= '\'';
            
    $ph_values     .= $temp "'";
            
    $ph_values  .= ',';
        }
        
    $ph_values rtrim($ph_values,",");    // Entfernen des letzten Kommazeichens
                                
        
    $types        '\'' $types '\'';    // Einfache Anführungsstriche hinzugefügt, damit bind_param mit diesem Wert arbeiten kann
        
        
    $this->ph_values $ph_values;
        
    $this->types $types;
                    

    Wieso ist denn nun $ph_values bzw. $this->ph_values eine Referenz?
    An dieser Stelle
    PHP-Code:
    eval('$stmt->bind_param(' $this->params ', ' $this->ph_values ');'); 
    gibt es das besagte Problem.
    Fehlermeldung: PHP Fatal error: Cannot pass parameter 2 by reference in <insertfilenamehere>(99) : eval()'d code on line 1


  • #2
    Da hast Du veraltete Informationen gelesen. Du kannst z.B. im Funktionskopf veranlassen, dass Parameter per Referenz übergeben werden.

    Ganz allgemein wird übrigens alles erst mal als Quasi-Referenz übergeben, und erst im Falle eines Schreibzugriffes wird eine Kopie des Inhaltes erstellt.

    Ich versteh auch ehrlich gesagt noch nicht, was Du da mit Deinem eval() willst.

    Gruß Jens

    Kommentar


    • #3
      Danke für Deine Antwort.
      Vermutlich hab ich das mit dem eval falsch verstanden. Der angedachte Sinn ist, dass ich sobald ich dem $stmt->bind_param meine Werte übergebe, ich ne Meldung erhalte, dass die Anzahl der angegebenen Typen nicht mehr der Anzahl der Werte übereinstimmen, die daran gebunden werden sollen. In der Eigenschaft $this->ph_values stehen diese jedoch und sind dort auch mit Kommata getrennt. Ich hab mittels eval versucht der $stmt->bind_param Methode damit trotzdem eine passende Anzahl an Parameter zu übergeben, weil der Befehl ja erst mit eval zusammengesetzt wird. Ich glaube ich sollte da wohl eher sowas wie call_user_func benutzen, muss aber gestehen, dass ich das bislang nicht verstanden habe, wie diese Funktion funktioniert.
      Wenn Du einen besseren Vorschlag hast bin ich ganz Ohr.

      Kommentar


      • #4
        An so einer Stelle eval einzusetzen, ist m.E. vollkommen pervers.

        Und wozu das ganze überhaupt gut sein soll, kann ich auch nicht erkennen.
        Die bind_param-Methode merkt schon selber, wenn die Anzahl der Parameter nicht zur Anzahl der Platzhalter passt. Der Rückgabewert für diesen Fall ist auch definiert, also kann man das abfangen; und wenn man genauere Infos will, dann kann man auch noch Fehlernummer/-meldung abfragen.

        Kommentar


        • #5
          Das ganze soll letztlich mir ermöglichen ein Prepared Statement abzusetzen, ohne vorher zu wissen, wieviele Werte ich dort benutzen werde. So muss ich dann nicht bei jedem Script wo irgendwo nen Query haben werde, jedesmal prepare, bind_param, execiute ect aufrufen, sondern mache das über eine Methode. Nur ein einem Formular A habe ich vielleicht nur 4 Felder, in einem Formular B 10. Ich hab letztlich nach einer Möglichkeit gesucht, dass flexibel abzufangen.
          Ich sagte ja für einen besseren Vorschlag bin ich gerne offen. Das das ganze sicherlich schicker, effizienter, besser usw. zu machen ist mir bewusst.
          Aber damit kommen wir wieder zum Ausgangsproblem. Wie bewerkstellige ich das am sinnvollsten hier, mit meinem bind_param, wenn nicht mit eval?()

          Kommentar


          • #6
            Zitat von Nightwave Beitrag anzeigen
            Wie bewerkstellige ich das am sinnvollsten hier, mit meinem bind_param, wenn nicht mit eval?()
            call_user_func/call_user_func_array

            Kommentar


            • #7
              Das ganze soll letztlich mir ermöglichen ein Prepared Statement abzusetzen, ohne vorher zu wissen, wieviele Werte ich dort benutzen werde.
              Wenn DU eine sichere Lösung willst, ist das schlicht unmöglich. Denn Du musst für einen Parameter immer wissen, welchen Datentyp er haben soll (nicht, welchen er hat!).
              --

              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


              --

              Kommentar

              Lädt...
              X