more php reference problems

The values in a custom object i have dont seem to be being accessed correctly and i think it is because i am not using references correctly in php (I am new to php).  Below is my code with comments showing the odd output.  Below the code is the output (read the description above the output to see what is wrong with it).

    function controlOutput(){
        //pull all the unique key/display values from tablename
        $output="";
        $controlName=$this->parentColumn->getControlName();
       
        $output=$output."<select name=\"".$controlName."\" id=\"".$controlName."\">";
       
        if($this->strKeyColumn!=""){
            $result=$this->queryDatabase();
            while($row = mysql_fetch_row($result))
            {
                $id = $row[0];
                $display = $row[1];
                $output=$output."<option value=\"$id\"";
                echo "Test2? - \$this->parentColumn->strCurValue={$this->parentColumn->strCurValue}<br>\n"; // <-this prints out blank
                //echo "\$id=$id\n";
                if($this->parentColumn->strCurValue==$id) $output=$output." selected";
                $output=$output.">$display</option>\n";
            }
            $output=$output."</select>";
        }
        return $output;
    } //end  function controlOutput()

function editOutput(){
        //pull all the unique key/display values from tablename
        $output="";
        $controlName="frm_".$this->strTableName;
       
        $output=$output."<form name=\"".$controlName."\" id=\"".$controlName."\" action=\"".$_SERVER['SCRIPT_NAME']."\" method=\"POST\">";
        $output=$output."<table cellpadding=0 cellspacing=0 border=0 align=left>";
       
        foreach ($this->arrColumns as $i => $value){
            $output=$output."<tr>";
            $output=$output."<td nowrap style=\"padding-bottom:3px\">".$value->descriptionOutput() . "</td>";
            $output=$output."<td nowrap style=\"padding-left:5px;padding-bottom:3px\">".$value->controlOutput() . "</td>";
            $output=$output."</td></tr>\n";
        }
       
        $output=$output."</table><br clear=\"left\" />";
       
        foreach ($this->arrHiddenFormVariables as $i => $value){
            $output=$output."<input type=\"hidden\" name=\"{$value[0]}\" id=\"{$value[0]}\" value=\"{$value[1]}\">";
        }
        $output=$output."<br /><input type=\"submit\" value=\"Save Changes\">";
        $output=$output."</form>";
       
        return $output;
    } // end function editOutput

      $objCurTable->strIdColumnValue=$curID;
      if(strtolower($curAction=="edit")){
           
        $objCurTable->updateFromDatabase();
         
        foreach($objCurTable->arrColumns as $foreachCurColumn){
            echo "Test? - \$foreachCurColumn->strCurValue{$foreachCurColumn->strDisplayText}={$foreachCurColumn->strCurValue}<br />\n";  <--actually holds the value
        }
      }

echo $objCurTable->editOutput();
---------------------------------------------------------------------------
The following is output generated from the code above.  Notice that during "Test2" the columns have values but during "Test" they do not:

Test? - $foreachCurColumn->strCurValueProgram Name=Example Entry
Test? - $foreachCurColumn->strCurValueProgram Description=
Test? - $foreachCurColumn->strCurValueProgram Website=
Test? - $foreachCurColumn->strCurValueThis program is also an instition=1
Test? - $foreachCurColumn->strCurValueProgram institution=376

Test2? - $this->parentColumn->strCurValue=
^^ The above line is repeated for each record in $result (in the controlOutput function)^^

Does anyone know why I am seeing this output and what changes to make so it see the strCurValues when it runs Test2 (in addition to "Test?")?
LVL 15
dave4dlAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
RoonaanConnect With a Mentor Commented:
Try changing the foreach in editOutput from
        foreach ($this->arrColumns as $i => $value){
            $output=$output."<tr>";
            $output=$output."<td nowrap style=\"padding-bottom:3px\">".$value->descriptionOutput() . "</td>";
            $output=$output."<td nowrap style=\"padding-left:5px;padding-bottom:3px\">".$value->controlOutput() . "</td>";
            $output=$output."</td></tr>\n";
        }

To:

        foreach ($this->arrColumns as $i => $value){
            $value = &$this->arrColumns[$i]; // Foreach makes a copy, so we need to get a proper reference
            $output=$output."<tr>";
            $output=$output."<td nowrap style=\"padding-bottom:3px\">".$value->descriptionOutput() . "</td>";
            $output=$output."<td nowrap style=\"padding-left:5px;padding-bottom:3px\">".$value->controlOutput() . "</td>";
            $output=$output."</td></tr>\n";
        }


Or an alternative code:

reset($this->arrColumns);
while(list($i, $value) = each($this->arrColumns)) {
            $output=$output."<tr>";
            $output=$output."<td nowrap style=\"padding-bottom:3px\">".$value->descriptionOutput() . "</td>";
            $output=$output."<td nowrap style=\"padding-left:5px;padding-bottom:3px\">".$value->controlOutput() . "</td>";
            $output=$output."</td></tr>\n";
}

Foreach copies an array before iterating. while/each uses the actual array.

-r-
0
 
RoonaanCommented:
Where do you set the $this->parentColumn property?

-r-
0
 
dave4dlAuthor Commented:
Woops, i forgot to tell you where the parentColumn come from:

$this->objLink=&new clsLink($this);

    function clsLink(&$inputParent,$inputDisplayColumn=null,$inputKeyColumn=null, $inputTableName=null) {
        $this->strDisplayColumn=$inputDisplayColumn;
        $this->strKeyColumn=$inputKeyColumn;
        $this->strTableName=$inputTableName;
        $this->parentColumn=$inputParent;
    }
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
dave4dlAuthor Commented:
Man you reply fast!
0
 
RoonaanCommented:
Try:

    function clsLink(&$inputParent,$inputDisplayColumn=null,$inputKeyColumn=null, $inputTableName=null) {
        $this->strDisplayColumn=$inputDisplayColumn;
        $this->strKeyColumn=$inputKeyColumn;
        $this->strTableName=$inputTableName;
        $this->parentColumn=&$inputParent;
    }

-r-
0
 
dave4dlAuthor Commented:
Thanks for the replies Roonaan,  I really appreciate your help today!

I changed the line that says "$this->parentColumn=$inputParent;" to "$this->parentColumn=&$inputParent;"
but it still prints out "Test2? - $this->parentColumn->strCurValue=" a number of times.
0
 
dave4dlAuthor Commented:
I tried the "while" loop since i didn't know how those behaved differently before but I had no luck.  I expect I am probably not giving you some critical piece of info so i uploaded my php files to https://filedb.experts-exchange.com/incoming/ee-stuff/1278-phpFiles.zip if you dont mind taking a look at the real thing (instead of the snippets on EE).

AddEditItem.php creates a table object (defined in clsTable.php) which has an array of column objects (defined in clsColumn.php) which contains a link object (defined in clsLink.php).

The values stored in the column object seem to persist but accessing it from the (child) link seems to be failing.

So i think the references in one direction and/or the other from the link are not working right.

What do you think?
0
 
RoonaanCommented:
Final resort might be to implement an explicit reference:

$this->objLink->parentColumn = &$this;

-r-
0
 
dave4dlAuthor Commented:
Thanks for your help roonaan.  I ended up just declaring another variable in the child class so that i wouldnt need a reference to the parent (even though it creates a duplicate).
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.