PHP Problems, really this hard?

Hello!

I have a script and I am trying to get up time into the database. I dont know why, but when my server is offline, it still adds one. NOTE: all of the other features with offline work, and are entered correctly into the database. Any help would be greatly appreciated.


 $query = mysql_query("SELECT * FROM servers") or die(mysql_error());
$servers = array();
while($row = mysql_fetch_assoc($query)) {
 array_push($servers, "{$row['serverIP']}");
}

$query = mysql_query("SELECT * FROM servers") or die(mysql_error());
        while($post = mysql_fetch_assoc($query)){
            $serverActualUptime = $post['serverActualUptime'];
            $serverPossibleUptime = $post['serverPossibleUptime'];
            foreach($servers as $server) {
                $stats = \\Minecraft\\Stats::retrieve(new \\Minecraft\\Server($server));
                if($stats->is_online){
                    $serverStatus = 1;
                    $serverMOTD = $stats->motd;
                    $server;
                    $serverPOnline = $stats->online_players;
                    $serverMPlayers = $stats->max_players;
                    $serverVersion = $stats->game_version;
                    $uptimeClass1 = $serverActualUptime + 1;
                    $uptimeClass2 = $serverPossibleUptime + 1;
                    $uptimePercentPart = $uptimeClass1 / $uptimeClass2;
                    $uptimePercent = $uptimePercentPart * 100;
                    $queryUpdate = mysql_query("UPDATE servers SET serverStatus='$serverStatus', serverMessage='$serverMOTD', serverPlayersOnline='$serverPOnline', serverPlayersTotal='$serverMPlayers', serverVersion='$serverVersion', serverUptime='$uptimePercent', serverActualUptime='$uptimeClass1', serverPossibleUptime='$uptimeClass2' WHERE serverIP='$server'") or die(mysql_error());
                } else {
                    $serverStatus = 0;
                    $serverMOTD = '?';
                    $server;
                    $serverPOnline = '?';
                    $serverMPlayers = '?';
                    $serverVersion = '?';
                    $uptimeClass3 = $serverActualUptime + 0;
                    $uptimeClass4 = $serverPossibleUptime + 1;
                    $uptimePercentPart = $uptimeClass3 / $uptimeClass4;
                    $uptimePercent = $uptimePercentPart * 100;
                    $queryUpdate = mysql_query("UPDATE servers SET serverStatus='$serverStatus', serverMessage='$serverMOTD', serverPlayersOnline='$serverPOnline', serverPlayersTotal='$serverMPlayers', serverVersion='$serverVersion', serverUptime='$uptimePercent', serverActualUptime='$uptimeClass3', serverPossibleUptime='$uptimeClass4' WHERE serverIP='$server'") or die(mysql_error());
                }
            }
        }

Again, even though the server is offline it is still adding a one to ActualUptime, and I need it added to PossibleUptime only!

If you can help please do so!

Thanks,
TJ

Is ServerStatus getting set to 0?

Yes. In the database it sets to 0 and question marks are put where they belong.

It stands to reason that $stats->is_online is true when you expected it to be false. Start there, as from looking at your code, I see no reason for it to run the wrong logic at this point.

Could it be me declaring the variables from the database as $serversctualuptime as that needs to be the uptime it pulls from the database for only the server that is being tested. I think it’s getting it from a different server in the database.

sigh, I see it now

Let’s look at your code in parts, then it may make sense

First you build an array of servers (though I have no idea why – more on that later)

 $query = mysql_query("SELECT * FROM servers") or die(mysql_error());  
$servers = array();   
while($row = mysql_fetch_assoc($query)) {   
 array_push($servers, "{$row['serverIP']}");   
} 

Next you query ALL servers (again) and loop through them, grabbing the Actual and Possible up times

$query = mysql_query("SELECT * FROM servers") or die(mysql_error());  
        while($post = mysql_fetch_assoc($query)){  
            $serverActualUptime = $post['serverActualUptime'];  
            $serverPossibleUptime = $post['serverPossibleUptime'];  

Then you loop through each server in the array you built at the top of your script. For each server in this array, you are apply the Actual and Possible uptime of the individual server you fetched above.

            foreach($servers as $server) {  
                $stats = \\Minecraft\\Stats::retrieve(new \\Minecraft\\Server($server));  
                if($stats->is_online){  
                    $serverStatus = 1;  
                    $serverMOTD = $stats->motd;  
                    $server;  
                    $serverPOnline = $stats->online_players;  
                    $serverMPlayers = $stats->max_players;  
                    $serverVersion = $stats->game_version;  
                    $uptimeClass1 = $serverActualUptime + 1;  
                    $uptimeClass2 = $serverPossibleUptime + 1;  
                    $uptimePercentPart = $uptimeClass1 / $uptimeClass2;  
                    $uptimePercent = $uptimePercentPart * 100;  
                    $queryUpdate = mysql_query("UPDATE servers SET serverStatus='$serverStatus', serverMessage='$serverMOTD', serverPlayersOnline='$serverPOnline', serverPlayersTotal='$serverMPlayers', serverVersion='$serverVersion', serverUptime='$uptimePercent', serverActualUptime='$uptimeClass1', serverPossibleUptime='$uptimeClass2' WHERE serverIP='$server'") or die(mysql_error());  
                } else {  
                    $serverStatus = 0;  
                    $serverMOTD = '?';  
                    $server;  
                    $serverPOnline = '?';  
                    $serverMPlayers = '?';  
                    $serverVersion = '?';  
                    $uptimeClass3 = $serverActualUptime + 0;  
                    $uptimeClass4 = $serverPossibleUptime + 1;  
                    $uptimePercentPart = $uptimeClass3 / $uptimeClass4;  
                    $uptimePercent = $uptimePercentPart * 100;  
                    $queryUpdate = mysql_query("UPDATE servers SET serverStatus='$serverStatus', serverMessage='$serverMOTD', serverPlayersOnline='$serverPOnline', serverPlayersTotal='$serverMPlayers', serverVersion='$serverVersion', serverUptime='$uptimePercent', serverActualUptime='$uptimeClass3', serverPossibleUptime='$uptimeClass4' WHERE serverIP='$server'") or die(mysql_error());  
                }  
            }  
        }  

See the problem? You are applying the Actual and Possible uptime of one server across ALL servers, then you move to the next server and do it again, and again, and again until your nested loops finish.

Here is what I think you intended to do:
First remove the servers array, you don’t need it. Your while loop does it for you.
Remove the foreach, as now that you don’t have the array, you don’t need that either. All you need to do is send the serverIP to the Minecraft function.
Which leaves you with the following:

$query = mysql_query("SELECT * FROM servers") or die(mysql_error());  
        while($post = mysql_fetch_assoc($query)){  
            $serverActualUptime = $post['serverActualUptime'];  
            $serverPossibleUptime = $post['serverPossibleUptime'];  

                $stats = \\Minecraft\\Stats::retrieve(new \\Minecraft\\Server($post['serverIP']));  
                if($stats->is_online){  
                    $serverStatus = 1;  
                    $serverMOTD = $stats->motd;  
                    $server;  
                    $serverPOnline = $stats->online_players;  
                    $serverMPlayers = $stats->max_players;  
                    $serverVersion = $stats->game_version;  
                    $uptimeClass1 = $serverActualUptime + 1;  
                    $uptimeClass2 = $serverPossibleUptime + 1;  
                    $uptimePercentPart = $uptimeClass1 / $uptimeClass2;  
                    $uptimePercent = $uptimePercentPart * 100;  
                    $queryUpdate = mysql_query("UPDATE servers SET serverStatus='$serverStatus', serverMessage='$serverMOTD', serverPlayersOnline='$serverPOnline', serverPlayersTotal='$serverMPlayers', serverVersion='$serverVersion', serverUptime='$uptimePercent', serverActualUptime='$uptimeClass1', serverPossibleUptime='$uptimeClass2' WHERE serverIP='$server'") or die(mysql_error());  
                } else {  
                    $serverStatus = 0;  
                    $serverMOTD = '?';  
                    $server;  
                    $serverPOnline = '?';  
                    $serverMPlayers = '?';  
                    $serverVersion = '?';  
                    $uptimeClass3 = $serverActualUptime + 0;  
                    $uptimeClass4 = $serverPossibleUptime + 1;  
                    $uptimePercentPart = $uptimeClass3 / $uptimeClass4;  
                    $uptimePercent = $uptimePercentPart * 100;  
                    $queryUpdate = mysql_query("UPDATE servers SET serverStatus='$serverStatus', serverMessage='$serverMOTD', serverPlayersOnline='$serverPOnline', serverPlayersTotal='$serverMPlayers', serverVersion='$serverVersion', serverUptime='$uptimePercent', serverActualUptime='$uptimeClass3', serverPossibleUptime='$uptimeClass4' WHERE serverIP='$server'") or die(mysql_error());  
                }  
        }  

Okay. I see… But I need something like this though, because the script works by an array.


$servers = array();   
while($row = mysql_fetch_assoc($query)) {   
 array_push($servers, "{$row['serverIP']}");   
}  


EDIT: Read below…

Actually I’m not sure, is there a way to tell?

EDIT: It seems it’s working, it just won’t display them here: http://mcss-portal.com/beta/serverstatus/demo/ (but that is okay.) On the main project http://mcss-portal.com/beta/. If you go to the demo page (refresh it) the data values will update on the main page (/beta/).

So this means its working?

Not really, the array was redundant because your while loop was already providing that functionality.

Since we do not have the display code here, I can’t tell you what the problem might be for that. What I can tell you, is if you are seeing the updates to the table working correctly, then I have solved your initial problem.

Okay, well I want to thank you greatly. If I have problems in the future, do threads usually get answered in decent amount of time? I think you were fantastic with explaining whats wrong, and the response time. I would of responded earlier (previous replies) but I was at school.

Thanks again!

Depends who is on, but here at Sitepoint, there is usually several members more than capable at helping you with problems. The best way to get your questions answered, is 1) make sure you clearly present your question, 2) provide code show casing the problem (when possible), 3) be kind and be patient, some problems take time to resolve.

Don’t hesitate to ask questions here, there are a lot of smart people who browse these forums.

Another question:


function getNavButtonDrop() {
     if(isset($_SESSION['usr'])){
         echo "<div class=\\"btn-group\\">";
         echo "<a class=\\"btn dropdown-toggle\\" data-toggle=\\"dropdown\\" href=\\"#\\">"
         echo "<i class=\\"icon-user\\"></i>" . $_SESSION['usr'];
         echo "<span class=\\"caret\\"></span>";
         echo "</a>";
         echo "<ul class=\\"dropdown-menu\\">";
         echo "<li><a href=\\"#\\">Login</a></li>";
         echo "<li><a href=\\"#\\">Register</a></li>";
         echo "</ul>";
         echo "</div>";
     }else{
         echo "<div class=\\"btn-group\\">";
         echo "<a class=\\"btn dropdown-toggle\\" data-toggle=\\"dropdown\\" href=\\"#\\">"
         echo "<i class=\\"icon-user\\"></i> Account"; 
         echo "<span class=\\"caret\\"></span>";
         echo "</a>";
         echo "<ul class=\\"dropdown-menu\\">";
         echo "<li><a href=\\"#\\">Login</a></li>";
         echo "<li><a href=\\"#\\">Register</a></li>";
         echo "</ul>";
         echo "</div>";
     }
}

I am getting an error with “Parse error: syntax error, unexpected T_ECHO, expecting ‘,’ or ‘;’ in /home/mcssport/public_html/beta/functions.php on line 192”.

Line 192 is echo “<i class=\“icon-user\”></i>” . $_SESSION[‘usr’];

Help would be greatly appreciated!

Missing semi-colon on


         echo "<a class=\\"btn dropdown-toggle\\" data-toggle=\\"dropdown\\" href=\\"#\\">"

and (in the else)


         echo "<a class=\\"btn dropdown-toggle\\" data-toggle=\\"dropdown\\" href=\\"#\\">"

The server status is set to 0, thus whenever it starts, it gets incremented by one.

Nice! Lol…

Today… I cant seem to figure this one out. I am thinking that the HTML code would listen to the PHP, but I really don’t think that is the case!


      <?php
			
			if(isset($_SESSION['usr'])){
			
			?>

      <div class="row">
        <div class="span12" style="background-color: #ffffff;">
          
       </div>
      </div>
        <?php
			
			} else {
			
			?>
            </br>
            </br>
            </br>
            </br>
            <div class="alert alert-error">
              <b>Just not so fast.</b> You need to login before you can view this page!
            </div>
            <?php
			}
			?>

Note this is part of the page account.php.

Dont get the random post, but we have already been over this! :wink: Thanks!

Care to explain the problem? Is it always showing the else?

Sure! Sorry about that… It always shows:
<div class=“row”>
<div class=“span12” style=“background-color: #ffffff;”>

   &lt;/div&gt;
  &lt;/div&gt;

and the else is only displayed when needed.

Where is your logic for setting $_SESSION[‘usr’]? If you add <?php var_dump($_SESSION); ?> do you always see usr inside it when visiting the page?

I am getting this: array(3) { [“usr”]=> string(7) “craytor” [“id”]=> string(1) “1” [“rememberMe”]=> int(1) }

This is how I am defining the session…


if($_POST['submit']=='Login')
{
	// Checking whether the Login form has been submitted
	
	$err = array();
	// Will hold our errors
	
	
	if(!$_POST['username'] || !$_POST['password'])
		$err[] = 'All the fields must be filled in!';
	
	if(!count($err))
	{
		$_POST['username'] = mysql_real_escape_string($_POST['username']);
		$_POST['password'] = mysql_real_escape_string($_POST['password']);
		$_POST['rememberMe'] = (int)$_POST['rememberMe'];
		
		// Escaping all input data

		$row = mysql_fetch_assoc(mysql_query("SELECT id,usr FROM users WHERE usr='{$_POST['username']}' AND pass='".md5($_POST['password'])."'"));

		if($row['usr'])
		{
			// If everything is OK login
			
			$_SESSION['usr']=$row['usr'];
			$_SESSION['id'] = $row['id'];
			$_SESSION['rememberMe'] = $_POST['rememberMe'];
			
			// Store some data in the session
			
			setcookie('tzRemember',$_POST['rememberMe']);
		}
		else $err[]='Wrong username and/or password!';
	}
	
	if($err)
	$_SESSION['msg']['login-err'] = implode('<br />',$err);
	// Save the error messages in the session

	header("Location: login.php");
	exit;
} .... // goes on and on