Ankündigung

Einklappen
Keine Ankündigung bisher.

Referenz geht im Array "verloren", call_user_func_array()

Einklappen

Neue Werbung 2019

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

  • Referenz geht im Array "verloren", call_user_func_array()

    Hi,

    irgendwie hab ich ein Brett vorm Kopf. Bei folgendem Code geht mir die jeweilige Referenz im Array verloren:

    PHP-Code:
    <?php  
        
    require "DBConnection.php";

        
    $connection = new DBConnection(....);
       
    // ...

        
    $pro = array("id""status"); // Testwerte
        
    $sel = array('id' => array(1,2,3,4,5,6,7), 'status' => 0); // Testwerte

        
    $result $connection->executeStatementWResult(createSelect($connection"user_tools"NULL$sel));
        while(
    $row $result->fetch_assoc())
        {
            
    // .....
        
    }

       
    // ......

        
    function createSelect($con$table$project=NULL$select=NULL)
        {
            
    $type_table = array(string => 's'integer => 'i'double => 'd'boolean => 'b');

            
    $proj = empty($project)?"*":((is_array($project))?implode(', ' ,$project):$project);
            
    $query "SELECT ".$proj." FROM ".$table;

            if(!empty(
    $select))
            {
                
    $projection .= "WHERE ";
                foreach (
    $select as $key => $value)
                {
                    if(
    is_array($value))
                    {
                        
    $projection .= $key." IN (";
                        foreach (
    $value as $k => $v)
                        {
                            
    $bind_types .= $type_table[gettype($v)];
                            
    $bind_params[] = & $value[$k]; // --> Referenz gesetzt
                            
    $projection .= "?".(next($value)?",":"");
                        }
                        
    $projection .= ") ";
                    }
                    else
                    {
                        
    $bind_types .= $type_table[gettype($value)];
                        
    $bind_params[] = & $select[$key]; // --> Referenz gesetzt

                        
    $projection .= $key."=?";
                    }

                    if(
    next($select) !== false)
                        
    $projection .= " AND ";
                }
                
    $query .= " ".$projection;
            }
            
    $query .=";";
            
    $stmt $con->prepare($query);

            
    array_unshift($bind_params,$bind_types);

            
    call_user_func_array(array($stmt'bind_param'), ($bind_params)); // --> Fehlermeldung: Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in...

            
    return $stmt;
        }
    Übergebe ich im Code keine Referenzen und behandel den Value als String und behelfe mir mit einer Funktion:

    PHP-Code:
         function makeValuesReferenced(&$arr)
        {
            
    $refs = array();
            foreach(
    $arr as $key => $value)
                
    $refs[$key] = &$arr[$key];
            return 
    $refs;
        } 
    die ich bei $bind_params in der call_user_func_array() aufrufe, geht es.

    Wo und warum gehen mir zwischendurch die Referenzen flöten?

    By the way: Variablennamen bitte erstmal außen vor lassen - danke.

    mfg wolf
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

  • #2
    Hi,

    Nagel mich nicht fest, aber musst Du nicht auch die $bind_types übergeben?

    EDIT. Ach, habe das array_unshift() übersehen.
    Vergiss es...

    Kann es sein, dass call_user_func() die Parameter als Kopie (daher: value) an die callable übergibt, wodurch die Referenz verloren geht?
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Hi,

      Zitat von Arne Drews Beitrag anzeigen
      Hi,

      Nagel mich nicht fest, aber musst Du nicht auch die $bind_types übergeben?
      füge ich hier zusammen:

      PHP-Code:
      array_unshift($bind_params,$bind_types); 
      while (!asleep()) sheep++;

      Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

      Kommentar


      • #4
        Jo, hab ich zu spät gesehen, siehe Nachtrag in #1, evtl. sendet call_user_func() nur Kopien an die callable?
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar


        • #5
          Before PHP 5.4, referenced variables in param_arr are passed to the function by reference, regardless of whether the function expects the respective parameter to be passed by reference. This form of call-time pass by reference does not emit a deprecation notice, but it is nonetheless deprecated, and has been removed in PHP 5.4. Furthermore, this does not apply to internal functions, for which the function signature is honored. Passing by value when the function expects a parameter by reference results in a warning and having call_user_func() return FALSE (there is, however, an exception for passed values with reference count = 1, such as in literals, as these can be turned into references without ill effects — but also without writes to that value having any effect —; do not rely in this behavior, though, as the reference count is an implementation detail and the soundness of this behavior is questionable).
          http://php.net/manual/en/function.ca...func-array.php

          Kommentar


          • #6
            Zitat von php.net
            Before PHP 5.4, referenced variables in param_arr are passed to the function by reference, regardless of whether the function expects the respective parameter to be passed by reference. This form of call-time pass by reference does not emit a deprecation notice, but it is nonetheless deprecated, and has been removed in PHP 5.4.
            zu spät...
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar


            • #7
              Ok, danke (hatte ich in der Doku überlesen).
              while (!asleep()) sheep++;

              Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

              Kommentar

              Lädt...
              X