...

View Full Version : Random "new" error!



zachatk
11-22-2010, 09:49 PM
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:



<?
/**
* 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_SERVER, DB_USER, DB_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($username, ADMIN_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;

?>

Dormilich
11-22-2010, 10:18 PM
a) it’s mysql_num_rows()
b) you never check whether your query succeeds or fails.

myfayt
11-22-2010, 11:30 PM
As Dormilich said, missing one of the underscores.

Fou-Lu
11-23-2010, 12:02 AM
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:


$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).

zachatk
11-23-2010, 12:24 AM
Alright... so I replaced this line for example:



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:



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

MattF
11-23-2010, 12:29 AM
That's checking for the existence of *any* rows. If you're wanting to check for the existence of one row only:



if (mysql_num_rows($result) > 1)

zachatk
11-23-2010, 12:59 AM
Thanks a lot guys! I really appreciate it. Got it working nicely.

zachatk
11-24-2010, 03:14 PM
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:



<?
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).



$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.

Dormilich
11-24-2010, 03:18 PM
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

zachatk
11-24-2010, 05:41 PM
So... how do I do that?

PDO... never heard of it. How hard would it be to switch over to it.

Dormilich
11-24-2010, 08:20 PM
PDO... never heard of it.
http://php.net/pdo


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


So... how do I do that?

$dsn = "mysql:host=$host;dbname=$dbname";
$pdo = new PDO($dsn, $login, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);



EZ Archive Ads Plugin for vBulletin Copyright 2006 Computer Help Forum