Go Back   CodingForums.com > :: Server side development > PHP

Before you post, read our: Rules & Posting Guidelines

Reply
 
Thread Tools Rate Thread
Enjoy an ad free experience by logging in. Not a member yet? Register.
Old 11-22-2010, 08:49 PM   PM User | #1
zachatk
New Coder

 
Join Date: Sep 2010
Posts: 77
Thanks: 13
Thanked 1 Time in 1 Post
zachatk is an unknown quantity at this point
Random "new" error!

Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in /home/a2986016/public_html/database.php on line 218

I'm getting that error and it's driving me nuts! It's been happening recently. Here's what makes it weird. I'll go onto my site and I should be logged in. However I get that error and it says I'm not logged in. If I press refresh a few times, the error will go away and I'll be logged in!

Sometimes I'll be going through my site when I suddenly log out and get that error. However I'm not truly logged out because if I refresh it the error won't be there and I'll refresh and I'll be signed in.

EDIT: Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in /home/a2986016/public_html/database.php on line 207 Is another error I get randomly.

Here is database.php:

PHP Code:
<?
/**
 * Database.php
 * 
 * The Database class is meant to simplify the task of accessing
 * information from the website's database.
 *
 * Written by: Jpmaster77 a.k.a. The Grandmaster of C++ (GMC)
 * Last Updated: August 17, 2004
 */
include("constants.php");
      
class 
MySQLDB
{
   var 
$connection;         //The MySQL database connection
   
var $num_active_users;   //Number of active users viewing site
   
var $num_active_guests;  //Number of active guests viewing site
   
var $num_members;        //Number of signed-up users
   /* Note: call getNumMembers() to access $num_members! */

   /* Class constructor */
   
function MySQLDB(){
      
/* Make connection to database */
      
$this->connection mysql_connect(DB_SERVERDB_USERDB_PASS) or die(mysql_error());
      
mysql_select_db(DB_NAME$this->connection) or die(mysql_error());
      
      
/**
       * Only query database to find out number of members
       * when getNumMembers() is called for the first time,
       * until then, default value set.
       */
      
$this->num_members = -1;
      
      if(
TRACK_VISITORS){
         
/* Calculate number of users at site */
         
$this->calcNumActiveUsers();
      
         
/* Calculate number of guests at site */
         
$this->calcNumActiveGuests();
      }
   }

   
/**
    * confirmUserPass - Checks whether or not the given
    * username is in the database, if so it checks if the
    * given password is the same password in the database
    * for that user. If the user doesn't exist or if the
    * passwords don't match up, it returns an error code
    * (1 or 2). On success it returns 0.
    */
   
function confirmUserPass($username$password){
      
/* Add slashes if necessary (for query) */
      
if(!get_magic_quotes_gpc()) {
          
$username addslashes($username);
      }

      
/* Verify that user is in database */
      
$q "SELECT password FROM ".TBL_USERS." WHERE username = '$username'";
      
$result mysql_query($q$this->connection);
      if(!
$result || (mysql_numrows($result) < 1)){
         return 
1//Indicates username failure
      
}

      
/* Retrieve password from result, strip slashes */
      
$dbarray mysql_fetch_array($result);
      
$dbarray['password'] = stripslashes($dbarray['password']);
      
$password stripslashes($password);

      
/* Validate that password is correct */
      
if($password == $dbarray['password']){
         return 
0//Success! Username and password confirmed
      
}
      else{
         return 
2//Indicates password failure
      
}
   }
   
   
/**
    * confirmUserID - Checks whether or not the given
    * username is in the database, if so it checks if the
    * given userid is the same userid in the database
    * for that user. If the user doesn't exist or if the
    * userids don't match up, it returns an error code
    * (1 or 2). On success it returns 0.
    */
   
function confirmUserID($username$userid){
      
/* Add slashes if necessary (for query) */
      
if(!get_magic_quotes_gpc()) {
          
$username addslashes($username);
      }

      
/* Verify that user is in database */
      
$q "SELECT userid FROM ".TBL_USERS." WHERE username = '$username'";
      
$result mysql_query($q$this->connection);
      if(!
$result || (mysql_numrows($result) < 1)){
         return 
1//Indicates username failure
      
}

      
/* Retrieve userid from result, strip slashes */
      
$dbarray mysql_fetch_array($result);
      
$dbarray['userid'] = stripslashes($dbarray['userid']);
      
$userid stripslashes($userid);

      
/* Validate that userid is correct */
      
if($userid == $dbarray['userid']){
         return 
0//Success! Username and userid confirmed
      
}
      else{
         return 
2//Indicates userid invalid
      
}
   }
   
   
/**
    * usernameTaken - Returns true if the username has
    * been taken by another user, false otherwise.
    */
   
function usernameTaken($username){
      if(!
get_magic_quotes_gpc()){
         
$username addslashes($username);
      }
      
$q "SELECT username FROM ".TBL_USERS." WHERE username = '$username'";
      
$result mysql_query($q$this->connection);
      return (
mysql_numrows($result) > 0);
   }
   
   
/**
    * usernameBanned - Returns true if the username has
    * been banned by the administrator.
    */
   
function usernameBanned($username){
      if(!
get_magic_quotes_gpc()){
         
$username addslashes($username);
      }
      
$q "SELECT username FROM ".TBL_BANNED_USERS." WHERE username = '$username'";
      
$result mysql_query($q$this->connection);
      return (
mysql_numrows($result) > 0);
   }
   
   
/**
    * addNewUser - Inserts the given (username, password, email)
    * info into the database. Appropriate user level is set.
    * Returns true on success, false otherwise.
    */
   
function addNewUser($username$password$email){
      
$time time();
      
/* If admin sign up, give admin user level */
      
if(strcasecmp($usernameADMIN_NAME) == 0){
         
$ulevel ADMIN_LEVEL;
      }else{
         
$ulevel USER_LEVEL;
      }
      
$q "INSERT INTO ".TBL_USERS." VALUES ('$username', '$password', '0', $ulevel, '$email', $time)";
      return 
mysql_query($q$this->connection);
   }
   
   
/**
    * updateUserField - Updates a field, specified by the field
    * parameter, in the user's row of the database.
    */
   
function updateUserField($username$field$value){
      
$q "UPDATE ".TBL_USERS." SET ".$field." = '$value' WHERE username = '$username'";
      return 
mysql_query($q$this->connection);
   }
   
   
/**
    * getUserInfo - Returns the result array from a mysql
    * query asking for all information stored regarding
    * the given username. If query fails, NULL is returned.
    */
   
function getUserInfo($username){
      
$q "SELECT * FROM ".TBL_USERS." WHERE username = '$username'";
      
$result mysql_query($q$this->connection);
      
/* Error occurred, return given name by default */
      
if(!$result || (mysql_numrows($result) < 1)){
         return 
NULL;
      }
      
/* Return result array */
      
$dbarray mysql_fetch_array($result);
      return 
$dbarray;
   }
   
   
/**
    * getNumMembers - Returns the number of signed-up users
    * of the website, banned members not included. The first
    * time the function is called on page load, the database
    * is queried, on subsequent calls, the stored result
    * is returned. This is to improve efficiency, effectively
    * not querying the database when no call is made.
    */
   
function getNumMembers(){
      if(
$this->num_members 0){
         
$q "SELECT * FROM ".TBL_USERS;
         
$result mysql_query($q$this->connection);
         
$this->num_members mysql_numrows($result);
      }
      return 
$this->num_members;
   }
   
   
/**
    * calcNumActiveUsers - Finds out how many active users
    * are viewing site and sets class variable accordingly.
    */
   
function calcNumActiveUsers(){
      
/* Calculate number of users at site */
      
$q "SELECT * FROM ".TBL_ACTIVE_USERS;
      
$result mysql_query($q$this->connection);
      
$this->num_active_users mysql_numrows($result);
   }
   
   
/**
    * calcNumActiveGuests - Finds out how many active guests
    * are viewing site and sets class variable accordingly.
    */
   
function calcNumActiveGuests(){
      
/* Calculate number of guests at site */
      
$q "SELECT * FROM ".TBL_ACTIVE_GUESTS;
      
$result mysql_query($q$this->connection);
      
$this->num_active_guests mysql_numrows($result);
   }
   
   
/**
    * addActiveUser - Updates username's last active timestamp
    * in the database, and also adds him to the table of
    * active users, or updates timestamp if already there.
    */
   
function addActiveUser($username$time){
      
$q "UPDATE ".TBL_USERS." SET timestamp = '$time' WHERE username = '$username'";
      
mysql_query($q$this->connection);
      
      if(!
TRACK_VISITORS) return;
      
$q "REPLACE INTO ".TBL_ACTIVE_USERS." VALUES ('$username', '$time')";
      
mysql_query($q$this->connection);
      
$this->calcNumActiveUsers();
   }
   
   
/* addActiveGuest - Adds guest to active guests table */
   
function addActiveGuest($ip$time){
      if(!
TRACK_VISITORS) return;
      
$q "REPLACE INTO ".TBL_ACTIVE_GUESTS." VALUES ('$ip', '$time')";
      
mysql_query($q$this->connection);
      
$this->calcNumActiveGuests();
   }
   
   
/* These functions are self explanatory, no need for comments */
   
   /* removeActiveUser */
   
function removeActiveUser($username){
      if(!
TRACK_VISITORS) return;
      
$q "DELETE FROM ".TBL_ACTIVE_USERS." WHERE username = '$username'";
      
mysql_query($q$this->connection);
      
$this->calcNumActiveUsers();
   }
   
   
/* removeActiveGuest */
   
function removeActiveGuest($ip){
      if(!
TRACK_VISITORS) return;
      
$q "DELETE FROM ".TBL_ACTIVE_GUESTS." WHERE ip = '$ip'";
      
mysql_query($q$this->connection);
      
$this->calcNumActiveGuests();
   }
   
   
/* removeInactiveUsers */
   
function removeInactiveUsers(){
      if(!
TRACK_VISITORS) return;
      
$timeout time()-USER_TIMEOUT*60;
      
$q "DELETE FROM ".TBL_ACTIVE_USERS." WHERE timestamp < $timeout";
      
mysql_query($q$this->connection);
      
$this->calcNumActiveUsers();
   }

   
/* removeInactiveGuests */
   
function removeInactiveGuests(){
      if(!
TRACK_VISITORS) return;
      
$timeout time()-GUEST_TIMEOUT*60;
      
$q "DELETE FROM ".TBL_ACTIVE_GUESTS." WHERE timestamp < $timeout";
      
mysql_query($q$this->connection);
      
$this->calcNumActiveGuests();
   }
   
   
/**
    * query - Performs the given query on the database and
    * returns the result, which may be false, true or a
    * resource identifier.
    */
   
function query($query){
      return 
mysql_query($query$this->connection);
   }
};

/* Create database connection */
$database = new MySQLDB;

?>

Last edited by zachatk; 11-22-2010 at 08:59 PM..
zachatk is offline   Reply With Quote
Old 11-22-2010, 09:18 PM   PM User | #2
Dormilich
Senior Coder

 
Dormilich's Avatar
 
Join Date: Jan 2010
Location: Behind the Wall
Posts: 2,880
Thanks: 9
Thanked 291 Times in 287 Posts
Dormilich is on a distinguished road
a) it’s mysql_num_rows()
b) you never check whether your query succeeds or fails.
__________________
please post your code wrapped in [CODE] [/CODE] tags
Dormilich is offline   Reply With Quote
Old 11-22-2010, 10:30 PM   PM User | #3
myfayt
Senior Coder

 
Join Date: Apr 2010
Posts: 1,156
Thanks: 46
Thanked 95 Times in 94 Posts
myfayt can only hope to improve
As Dormilich said, missing one of the underscores.
myfayt is offline   Reply With Quote
Old 11-22-2010, 11:02 PM   PM User | #4
Fou-Lu
God Emperor


 
Fou-Lu's Avatar
 
Join Date: Sep 2002
Location: Saskatoon, Saskatchewan
Posts: 15,650
Thanks: 4
Thanked 2,451 Times in 2,420 Posts
Fou-Lu is a name known to allFou-Lu is a name known to allFou-Lu is a name known to allFou-Lu is a name known to allFou-Lu is a name known to allFou-Lu is a name known to all
MySQL_numrows is actually valid (although should be considered obsolescent); its a direct synonym to mysql_num_rows. Actually, most mysql_*_* have alias' I believe.

This is a typical error, very common. The issue as mentioned is simply that you do not check for a valid resource. This can be done as easily as:
PHP Code:
$qry = @mysql_query('SOMEQUERY'); 
if (
$qry)
{
    if (
mysql_num_rows($qry) > 0)
    {
        echo 
'We have more than 0 records.';
    }

What matters is the check for if($qry). Trying to call mysql_num_rows on a failed query will always fail since it considers the call mysql_num_rows(false); which is always false (and triggers an error of course).
__________________
As of PHP 5.5, the MySQL library has been officially deprecated. It is recommended to move to either MySQLi or PDO libraries for your mysql connectivity. See here for help choosing which interface you prefer: http://php.net/manual/en/mysqlinfo.api.choosing.php
Fou-Lu is offline   Reply With Quote
Users who have thanked Fou-Lu for this post:
zachatk (11-22-2010)
Old 11-22-2010, 11:24 PM   PM User | #5
zachatk
New Coder

 
Join Date: Sep 2010
Posts: 77
Thanks: 13
Thanked 1 Time in 1 Post
zachatk is an unknown quantity at this point
Alright... so I replaced this line for example:

PHP Code:
   function calcNumActiveUsers(){
      
/* Calculate number of users at site */
      
$q "SELECT * FROM ".TBL_ACTIVE_USERS;
      
$result mysql_query($q$this->connection);
      
$this->num_active_users mysql_numrows($result);
   } 
with this:

PHP Code:
   function calcNumActiveUsers(){
      
/* Calculate number of users at site */
      
$q "SELECT * FROM ".TBL_ACTIVE_USERS;
      
$result = @mysql_query($q$this->connection);
      if (
$result)
        {
          if (
mysql_num_rows($result) > 0)
            {
              echo 
"ERROR on calcNumActiveUsers: More than one record exists";
            }
        }
   } 
And I get this:

ERROR on calcNumActiveUsers: More than one record existsERROR on calcNumActiveUsers: More than one record existsERROR on calcNumActiveUsers: More than one record exists
zachatk is offline   Reply With Quote
Old 11-22-2010, 11:29 PM   PM User | #6
MattF
Senior Coder

 
Join Date: Jul 2009
Location: South Yorkshire, England
Posts: 2,322
Thanks: 6
Thanked 304 Times in 303 Posts
MattF will become famous soon enoughMattF will become famous soon enough
That's checking for the existence of *any* rows. If you're wanting to check for the existence of one row only:

Code:
if (mysql_num_rows($result) > 1)
MattF is offline   Reply With Quote
Users who have thanked MattF for this post:
zachatk (11-22-2010)
Old 11-22-2010, 11:59 PM   PM User | #7
zachatk
New Coder

 
Join Date: Sep 2010
Posts: 77
Thanks: 13
Thanked 1 Time in 1 Post
zachatk is an unknown quantity at this point
Thanks a lot guys! I really appreciate it. Got it working nicely.
zachatk is offline   Reply With Quote
Old 11-24-2010, 02:14 PM   PM User | #8
zachatk
New Coder

 
Join Date: Sep 2010
Posts: 77
Thanks: 13
Thanked 1 Time in 1 Post
zachatk is an unknown quantity at this point
Well I thought I had it figured out... until this:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/a2986016/public_html/view_active.php on line 10

Code:

Code:
<?
if(!defined('TBL_ACTIVE_USERS')) {
  die("Error processing page");
}

$q = "SELECT username FROM ".TBL_ACTIVE_USERS
    ." ORDER BY timestamp DESC,username";
$result = $database->query($q);
/* Error occurred, return given name by default */
$num_rows = mysql_num_rows($result);
if(!$result || ($num_rows < 0)){
   echo "Error displaying info";
}
else if($num_rows > 0){
   /* Display active users, with link to their info */
   echo "<table border=\"1\" cellspacing=\"0\" cellpadding=\"3\">\n";
   echo "<tr><td><font size=\"2\">\n";
   for($i=0; $i<$num_rows; $i++){
      $uname = mysql_result($result,$i,"username");

      echo "<a href=\"infopage.php?user=$uname\">$uname</a> / ";
   }
   echo "</font></td></tr></table><br>\n";
}
?>
I tried putting Fou-Lu's script in but the if (mysql_num_rows($qry) > 0) part just gave the same error as before.

Another quick question

$this->num_active_users = mysql_num_rows($result);


Would putting that in here like this be the same as before (post #5 first code).

Code:
$qry = @mysql_query('SOMEQUERY'); 
if ($qry)
{
    if (mysql_num_rows($qry) > 1)
    {
        echo 'We have more than 1 records.';
    }
  $this->num_active_users = mysql_num_rows($qry);
}
I have to have that for everywhere on the site where it uses those variables.
zachatk is offline   Reply With Quote
Old 11-24-2010, 02:18 PM   PM User | #9
Dormilich
Senior Coder

 
Dormilich's Avatar
 
Join Date: Jan 2010
Location: Behind the Wall
Posts: 2,880
Thanks: 9
Thanked 291 Times in 287 Posts
Dormilich is on a distinguished road
you would have to test each and every query call for errors, otherwise the mentioned warning occurs.


PS. that’s what I like in PDO, you can set it to automaticly throw Exceptions when there is an error
__________________
please post your code wrapped in [CODE] [/CODE] tags
Dormilich is offline   Reply With Quote
Old 11-24-2010, 04:41 PM   PM User | #10
zachatk
New Coder

 
Join Date: Sep 2010
Posts: 77
Thanks: 13
Thanked 1 Time in 1 Post
zachatk is an unknown quantity at this point
So... how do I do that?

PDO... never heard of it. How hard would it be to switch over to it.
zachatk is offline   Reply With Quote
Old 11-24-2010, 07:20 PM   PM User | #11
Dormilich
Senior Coder

 
Dormilich's Avatar
 
Join Date: Jan 2010
Location: Behind the Wall
Posts: 2,880
Thanks: 9
Thanked 291 Times in 287 Posts
Dormilich is on a distinguished road
Quote:
Originally Posted by zachatk View Post
PDO... never heard of it.
http://php.net/pdo

Quote:
Originally Posted by zachatk View Post
How hard would it be to switch over to it.
if you’re somewhat familiar with objects — not complicated
if you’ve heard of Iterators — piece of cake

Quote:
Originally Posted by zachatk View Post
So... how do I do that?
PHP Code:
$dsn "mysql:host=$host;dbname=$dbname";
$pdo = new PDO($dsn$login$password);
$pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION); 
__________________
please post your code wrapped in [CODE] [/CODE] tags
Dormilich is offline   Reply With Quote
Reply

Bookmarks

Jump To Top of Thread


Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +1. The time now is 03:18 AM.


Advertisement
Log in to turn off these ads.