?
Solved

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

Posted on 2008-06-10
10
Medium Priority
?
1,085 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
Industry Leaders: 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!

 
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 1500 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

Secure Your WordPress Site: 5 Essential Approaches

WordPress is the web's most popular CMS, but its dominance also makes it a target for attackers. Our eBook will show you how to:

Prevent costly exploits of core and plugin vulnerabilities
Repel automated attacks
Lock down your dashboard, secure your code, and protect your users

Question has a verified solution.

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

Foreword (July, 2015) Since I first wrote this article, years ago, a great many more people have begun using the internet.  They are coming online from every part of the globe, learning, reading, shopping and spending money at an ever-increasing ra…
3 proven steps to speed up Magento powered sites. The article focus is on optimizing time to first byte (TTFB), full page caching and configuring server for optimal performance.
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…
Suggested Courses

770 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