Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] mysqli, bind_result dynamisch füttern schlägt fehl

Einklappen

Neue Werbung 2019

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

  • [Erledigt] mysqli, bind_result dynamisch füttern schlägt fehl

    Tag Leute

    Kürzlich habe ich mich entschlossen künftig mit mysqli zu arbeiten. Nun bin ich dabei, meine Mysql-Klasse umzuschreiben. Um folgenden Code-Block geht es zur Zeit:

    PHP-Code:
        private function db_select($args)    {
            
    $sql "";
            
    $col_arr explode(", "strtolower($args[0]));

            if(
    count($args) == 2)    {
                
    $sql "SELECT ".$args[0]." FROM ".$args[1];
                
    $stmt $this->_con->prepare($sql);

                
    $stmt->execute();
                
                
    //Diese Zeile macht Probleme
                //var_dump($col_arr) --> array(3) { [0]=> string(2) "ID" [1]=> string(4) "Zahl" [2]=> string(12) "Zeichenkette" } 
                
    call_user_func_array(array($stmt"bind_result"), $col_arr);

                while(
    $stmt->fetch()) {
                    echo 
    $id." | ".$zahl." | ".$zeichenkette."<br />";
                }
            }
        } 
    Nun zu meinem Problem: Wenn ich der Funktion call_user_func_array() den zweiten Parameter, das Array, als Variable mitgebe, kommt folgende Fehlermeldung:
    Warning: Parameter 1 to mysqli_stmt::bind_result() expected to be a reference, value given in [...]test\Mysql.class.php on line 117
    Wenn ich Parameter zwei al &$col_arr übergebe, bekomme ich folgende Fehlermeldung:
    Deprecated: Call-time pass-by-reference has been deprecated in [...]test\Mysql.class.php on line 117
    Was die beiden Fehlermeldungen bedeuten ist mir klar. Aus irgendeinem Grund erwartet bind_result(), wenn man es per Callback-Funktion aufruft, die Parameter als Referenz. Andererseits ist das Referenzieren in meiner PHP-Version veraltet.

    Wie bringe ich dies nun unter einen Hut? Wäre nett, wenn mir da jemand den Weg aus der Sackgasse weisen könnte. Ich bin grad mit meinem Latein am Ende...

    So long, Igäl

  • #2
    http://www.php.net/manual/en/mysqli-...ult.php#102179

    Kommentar


    • #3
      Danke dir Chris. Das sieht schonmal gut aus. Nun habe ich aber in der neuen Funktion an ähnlicher Stelle ein Problem. Und zwar hier:

      PHP-Code:
              $variables = array();
              
      $data = array();
              
      $meta $result->result_metadata();
             
              while(
      $field $meta->fetch_field())
                  
      $variables[] = &$data[$field->name]; // pass by reference

              
      var_dump($variables); 
      der var_dump($variables) gibt folgendes Ergebnis:
      array(3) { [0]=> &NULL [1]=> &NULL [2]=> &NULL }
      Gebe ich in der Schleife aber $field->name aus, dann werden mir alle Feldnamen angezeigt. Warum werden die Feldnamen in $variables nicht übernommen?

      Edit: Kann ich eigentlich eine Referenz auf etwas setzen, was noch gar nicht existiert? Bzw. wird dann, wenn die referenzierte Variable nicht existiert, diese dann angelegt?

      Kommentar


      • #4
        So... nach etwas Training und erneutem Kopfzerbrechen habe ich fürs erste eine funktionierende Lösung adaptieren können:

        PHP-Code:
          /*********************************************************************************************************/
        /** Function "db_interaction" is the only function (beside the const-/destructor) interacting directly    **/
        /** with the scripts. The first parameter $action declares which function the user wants to use. The    **/
        /** second parameter $args contains the arguments (structured in an array) used in specific function.    **/
        /*********************************************************************************************************/
            
        public function db_interaction($action$args)    {
                
        $call_function "db_".$action;

                
        $result $this->$call_function($args);

                return 
        $result;
            }
        /*********************************************************************************************************/   
        private function db_select($args)    {
                
        $sql "";
                
        $return_hash = array();

                if(
        count($args) == 2)    {
                    
        $sql "SELECT ".$args[0]." FROM ".$args[1]."`";
                    
        $result $this->_con->prepare($sql);
                    
        $return_hash $this->fetch_data($result);
                }elseif(
        count($args) > 2)    {
                    
        $sql "SELECT ".$args[0]." FROM `".$args[1]."` ".$args[2];
                    
        $result $this->_con->prepare($sql);
                    
        $this->set_param($result$args[3]);
                    
        $return_hash $this->fetch_data($result);
                }

                return 
        $return_hash;
            }
        /*********************************************************************************************************/
            
        private function set_param($res$arr)    {
                
        $ref_arr = array();

                for(
        $i=0;$i<count($arr);$i++)    {
                    
        $ref_arr[$i] = &$arr[$i];
                }

                
        call_user_func_array(array($res"bind_param"), $ref_arr);
            }
        /*********************************************************************************************************/
        private function fetch_data($res)    {
            
        $return_arr = array();

            if(
        $res instanceof mysqli_stmt)    {
                
        $res->execute();

                
        $res_data $res->get_result();

                
        $i=0;
                while(
        $row $res_data->fetch_assoc())    {
                    foreach(
        $row as $k => $v)    {
                        
        $return_arr[$i][$k] = $v;
                    }
                    
        $i++;
                }
                
        $res->close();
            }elseif(
        $res instanceof mysqli_result)    {
                while(
        $row $res->fetch_assoc())    {
                    
        $return_arr[] = $row;
                }
            }
            return 
        $return_arr;
        }
        //Ausserhalb der Klasse wird das dann so aufgerufen:
        $db = new Mysql("host""user""""table""latin1");

        $param[] = "NwID, NwAuthor, NwDate, NwTitle, NwBody";
        $param[] = "news";
        $param[] = "WHERE NwDate BETWEEN ? AND ?";
        $param[] = Array("ii"11360736001167609599);

        $test $db->db_interaction("select"$param);

        for(
        $i=0;$i<count($test);$i++)    {
            echo 
        "Author = ".$test[$i]['NwAuthor']."<br />";
            echo 
        "Datum = ".$test[$i]['NwDate']."<br />";
            echo 
        "Titel = ".$test[$i]['NwTitle']."<br />";
            echo 
        "Body = ".$test[$i]['NwBody']."<hr />";

        Ist natürlich noch ausbaufähig. Bin mich auch gerade erst am Einlesen. Aber das dynamische Parameter-binden hat mir jetzt echt Kopfzerbrechen bereitet.

        So long... Igäl

        Kommentar

        Lädt...
        X