Hi there everyone,
I've got a script that calls on a remote server for character data(from a game). This morning, I started getting errors like this:
phpBB Debug PHP Warning: in file /home/clash/public_html/includes/wowarmoryapi/Character.class.php on line 397: Invalid argument supplied for foreach()
Which I'm assuming is because the remote server is not responding correctly.
I tried wrapping my code in an is_array check:
$members = $guild->getMembers('rank', 'asc');
if(is_array($members)){ //<--new if
//code went here.
}
but it apparently is an array, so the errors still appeared.
I'm wondering if there's anything else I can do to try to protect myself from invalid data? Here's my function, so you can see the foreach in question:
case "roster_update" :
// Get ready to call on Blizz's armory
include("./includes/armory_init.php");
$members = $guild->getMembers('rank', 'asc');
if(is_array($members)){
$update_count = 0;
$insert_count = 0;
$deactivate_count = 0;
$current_key = mt_rand();
foreach($members as $member) {
//Get character information
$mname = $member['character']['name'];
$mgender = $member['character']['gender'];
$mlevel = $member['character']['level'];
$mrace = $member['character']['race'];
$mclass = $member['character']['class'];
$mrank = $member['rank'];
//Get the member's reputation with the guild.
$character = $armory->getCharacter($mname);
$reputations = $character->getReputation(TRUE,'name','asc');
foreach($reputations as $reputation) {
$rep_name = $reputation['name'];
if($rep_name=="Guild"){
$current_standing = $reputation['standing'];
$current_standing_text = standing_text($current_standing);
$current_value = $reputation['value'];
$current_max = $reputation['max'];
$current_remaining = $max-$value;
}
}
$query = "SELECT id,name,rep_guild_standing FROM addon_guild_members WHERE name='$mname'";
$result = mysql_query ($query) or die('MySQL error: ' . mysql_error() . '<hr/>' . $query);
$result_rows = mysql_num_rows($result);
if($result_rows==1){
//Match found in the local db. Update row.
while($row=mysql_fetch_array($result)){
$old_standing = $row['rep_guild_standing'];
$old_standing_text = standing_text($old_standing);
$mid = $row['id'];
}
mysql_query("UPDATE addon_guild_members SET gender = '$mgender', level = '$mlevel', race = '$mrace', class = '$mclass', rank = '$mrank', rep_guild_standing = '$current_standing', rep_guild_value = '$current_value', rep_guild_max = '$current_max', last_time = NOW(), active = '1', update_key = '$current_key' WHERE name = '$mname'") or die("Failed to update member in the database.<br><br>" . mysql_error());
}elseif($result_rows==0){
//No local record found. Insert new row.
$query2="INSERT INTO addon_guild_members (name,gender,level,race,class,rank,active,join_time,last_time,update_key) VALUES ('$mname','$mgender','$mlevel','$mrace','$mclass','$mrank','1',NOW(),NOW(),'$current_key')";
$result2=mysql_query($query2) or die("Failed to insert new member into database.<br><br>" . mysql_error());
}
// Check to see whether the character's rep standing with the guild has increased.
if(($current_standing > $old_standing) AND ($current_standing != '3')){
// Rep standing increased. Form the email body and flag the user in the database.
mysql_query("UPDATE addon_guild_members SET rep_change = NOW() WHERE name = '$mname'") or die("Failed to update reputation_change in db.<br><br>" . mysql_error());
}
mysql_query("UPDATE addon_cron SET roster_update = NOW(), roster_update_key = '$current_key'") or die("Failed to update roster_update in the database.<br><br>" . mysql_error());
}
//Time to set the active flag for players no longer in the guild.
$query = "SELECT * FROM addon_guild_members WHERE update_key != '$current_key' ORDER BY name ASC";
$result = mysql_query ($query) or die('MySQL error: ' . mysql_error() . '<hr/>' . $query);
$result_rows = mysql_num_rows($result);
if($result_rows!=0){
// Set the active flag to 0.
$result = mysql_query ($query);
while ($row = mysql_fetch_assoc ($result)) {
$name = stripslashes($row['name']);
mysql_query("UPDATE addon_guild_members SET active = '0' WHERE name = '$name'") or die("Failed to set member as inactive in guild.<br><br>" . mysql_error());
$deactivate_count = $deactivate_count + 1;
}
}
echo("<b>The roster has been updated. ".$insert_count." new members have been added, ".$deactivate_count." members have been removed and ".$update_count." current members have been updated.</b>");
}else{
echo("WoW Armory is currently not responding to the request. This probably means that their server is temporarily down. Just wait a bit and everything should begin
working again.");
}
break;
Any thoughts would be greatly appreciated!