Solved

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

Posted on 2008-06-10
10
1,075 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
  • 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
 
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
Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

 
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

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

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 …
Introduction Many web sites contain image galleries; a common design for these galleries includes a page with a collection of thumbnail images.  You can click on each of the thumbnail images to see the larger version of the image.  This is easily i…
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…
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

759 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

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now