Solved

PHP function parameter call by reference--interesting 'feature'?

Posted on 2008-06-10
10
1,082 Views
Last Modified: 2013-12-13
Running PHP 5.1 on an Apache 2.2.6 (localhost with appropriate DB permissions) on a windows XP home machine (my laptop). Function foo(in the snippet) is an implementation of an abstract object from a child object. Function get_query_resource() returns a query resource.
The expected result of the attached code snippet, for a resource with five rows, should be

Bar calls foo.
Now in foo.
Query resource rows: 5
Processing query_resource row
Processing query_resource row
Processing query_resource row
Processing query_resource row
Processing query_resource row
Foo completed successfully.

But what I'm actually getting is

Bar calls foo.
Now in foo.
Query resource rows: 5
Foo completed successfully.

The code in the while loop isn't executing.

However, if I don't pass the query resource in bar (ie, if(foo())...) then bar gets the query resource and finishes normally. Why is this?
function foo(&$query_resource=NULL){
      echo "Now in foo<BR>";
      if(is_null($query_resource)) $query_resource = get_query_resource();
      if(!$query_resource) exit("SQL error");
      echo "Query resource rows: ".mysql_num_rows($query_resource);   
      while($row = mysql_fetch_assoc($query_resource)){
           echo "Processing query_resource row<BR>";
      }
      return true;
}
function bar(&$q_r=NULL){
      echo "Bar calls foo.<BR>";
      if(foo($q_r)) echo "Foo completed successfully.<BR>";
}
 
bar();

Open in new window

0
Comment
Question by:dnatal
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 3
  • 2
10 Comments
 
LVL 48

Expert Comment

by:hernst42
ID: 21755109
thats because in this case $query_resource === null and thus the result of get_query_resource() is used which might be an unfetched result. If you pass something to bar this resultset might be already read and thus does not contain any more rows.
0
 
LVL 2

Author Comment

by:dnatal
ID: 21755151
Testing shows that the contents of the if(is_null($query_resource)) conditional do not execute--I put an echo in there (something like echo "No resource found; getting resource") and I don't see that on the output.
0
 
LVL 2

Author Comment

by:dnatal
ID: 21755167
How do I determine if the resultset has been read and thus doesn't contain any rows? Wouldn't the mysql_num_rows() return 0?
0
MS Dynamics Made Instantly Simpler

Make Your Microsoft Dynamics Investment Count  & Drastically Decrease Training Time by Providing Intuitive Step-By-Step WalkThru Tutorials.

 
LVL 9

Expert Comment

by:Rob Siklos
ID: 21755238
try:

if ($query_resource === FALSE) {
   // error
}
0
 
LVL 2

Author Comment

by:dnatal
ID: 21755268
rob263, how about line 4
if(!$query_resource) exit("SQL error");
since the negation of the boolean false (or, actually, a NULL that should have previously been detected, or a 0), should return true.
0
 
LVL 9

Expert Comment

by:Rob Siklos
ID: 21755277
Yeah, you're right - my comment was premature.
0
 
LVL 9

Expert Comment

by:Rob Siklos
ID: 21755299
after "echo "Query resource rows:...", try putting:

     var_dump(mysql_fetch_assoc($query_resource));

and see what that value is.  It might give you a hint as to why the while loop isn't executing.
0
 
LVL 48

Accepted Solution

by:
hernst42 earned 375 total points
ID: 21755303
> Wouldn't the mysql_num_rows() return 0?

no it returns the numbers of records in the resultset and not the number of records still readable in the result set.
0
 
LVL 2

Author Closing Comment

by:dnatal
ID: 31465935
That would do it.
0
 
LVL 2

Author Comment

by:dnatal
ID: 21755339
Because I was executing multiple calls to foo() in bar() the first call ate my query and didn't leave anything for the others to process. That'd cause the observed problem.
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Popularity Can Be Measured Sometimes we deal with questions of popularity, and we need a way to collect opinions from our clients.  This article shows a simple teaching example of how we might elect a favorite color by letting our clients vote for …
Many old projects have bad code, but the budget doesn't exist to rewrite the codebase. You can update this code to be safer by introducing contemporary input validation, sanitation, and safer database queries.
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question