2010-07-22 2 views
2

Ce script fonctionne très bien. Je l'appelle en haut de mes scripts. Mais si un utilisateur qui est pas interdit entre le site qu'ils obtiennent:Essayer d'obtenir la propriété du non-objet

Notice: Trying to get property of non-object in index.php on line 20 

La fonction:

// Check if conecting user is banned. If ban has expired delete row. 
function check_bans() 
{ 

// IP address 
$user_ip = $_SERVER['REMOTE_ADDR']; 

$query = mysql_query("SELECT ip, expire FROM bans WHERE ip = '$user_ip'"); 
$row = mysql_fetch_object($query); 

$expire = $row->expire ? date('M d Y H:i', $row->expire) : 'Never'; 

// Did we find a match? 
if (mysql_num_rows($query)) { 

    // Has this ban expired? Then delete and let user inside. 
    if ($row->expire != '' && $row->expire <= time()) 
     mysql_query("DELETE FROM bans WHERE ip = '$user_ip'") or die (mysql_error()); 
    else 
     die("<h1 align=\"center\" style=\"color:maroon\">You have been IP banished. Ban will be lifted: $expire</h1>"); 

} 

} 

Répondre

4

Parce que si l'utilisateur n'a pas été interdit, les rendements de requête zéro résultats et l'attribution $rowgets assigned false (et pas un objet). Donc, cette erreur se produit parce que vous essayez d'appeler une méthode sur un booléen. Essayez:

function check_bans() { 

    // IP address 
    $user_ip = $_SERVER['REMOTE_ADDR']; 

    $query = mysql_query("SELECT ip, expire FROM bans WHERE ip = '$user_ip'"); 
    $row = mysql_fetch_object($query); 
    if($row) { 

     $expire = $row->expire ? date('M d Y H:i', $row->expire) : 'Never'; 

     // Has this ban expired? Then delete and let user inside. 
     if ($row->expire != '' && $row->expire <= time()) 
      mysql_query("DELETE FROM bans WHERE ip = '$user_ip'") or die (mysql_error()); 
     else 
      die("<h1 align=\"center\" style=\"color:maroon\">You have been IP banished. Ban will be lifted: $expire</h1>"); 

    } 
} 
+1

En fait je pense 'if (mysql_num_rows ($ query))' est redondant alors. –

+0

@Fixix - vous avez raison, ça a l'air si. Va supprimer. – karim79

0

S'il n'y a pas de ligne correspondante, puis $row sera FAUX. Vous devriez ajouter if ($row) autour de tout après mysql_fetch_object.

Questions connexes