# Mitglieder-Liste hat fehlende Daten



## Sorgonas (27. Oktober 2014)

Hallo an alle,

 

wie beschrieben bekomme ich nicht alles angezeigt. Bis vor kurzem habe ich auch nur 61 von 77 Member angezeigt bekommen, nun bekomme ich oben in der Gildeninfo die richtige Anzahl angezeigt, unten jedoch habe ich nur leere felder bei den 16 nachträglichen Daten.

 

Das was ich  unter diesem code geschrieben habe,ist das was ich nachträglich abgeändert habe, um die richtige Anzahl zu bekommen.

 

Ich hoffe Ihr könnt mir da nun mit weiter helfen.

 

dies hier ist der code von Cronjob.php:

<?php
// Konfiguration
$sGuildName = 'Familia de Lux';
$sRealmName = 'Lothar';
$sGuildFields= 'members'; // Möglich sind: achievements, members
$iMaxEntries = 1; // Anzahl der maximalen Einträge pro Zeile
$sMemberFields = 'talents,professions,items';
$sCacheFile = 'cache.sth';
$iCacheTimeout = 1; // Cache-Timeout in Sekunden
$sAPIURL = 'http://eu.battle.net/api/wow/';
$aGuildData = array();

$sRawEncodedRealm = rawurlencode($sRealmName);
$sRawEncodedGuild = rawurlencode($sGuildName);
$sResponse = null;

if( !is_file($sCacheFile) || (time() - filemtime($sCacheFile)) > $iCacheTimeout || filesize($sCacheFile) == 0 ) {

// Auslesen der Gildendaten.
$sRequestURL = $sAPIURL . 'guild/'.$sRawEncodedRealm.'/'.$sRawEncodedGuild.'?locale=de_de&fields='.$sGuildFields;
$sResponse = @file_get_contents($sRequestURL, true);
if (strpos($http_response_header[0], '200')) {

$http_response_header = null;
$aRawData = json_decode($sResponse, true);
$aGuildData = $aRawData;
unset($aGuildData['members']);

foreach ($aRawData['members'] as $aMemberItem )
{
$sCharName = $aMemberItem['character']['name'];
$sCharResponse = @file_get_contents(
$sAPIURL . 'character/'.$sRawEncodedRealm.'/'.urlencode(html_entity_decode($sCharName, ENT_COMPAT, 'UTF-8')).'?locale=de_de&fields='.$sMemberFields
, true
);

// Prüfe Rückgabe
if (strpos($http_response_header[0], '200')) {

$aDecodeMember = json_decode($sCharResponse, true);
$aGuildData['members'][] = json_decode($sCharResponse, true);
}

}

//print_r(json_encode($aGuildData));
file_put_contents($sCacheFile, json_encode($aGuildData));

unset($aGuild, $decodeMember, $aRawData, $http_response_header, $sCharResponse, $sResponse);
}
}
?>


```
// Prüfe Rückgabe
if (strpos($http_response_header[0], '200')) {

$aDecodeMember = json_decode($sCharResponse, true);
$aGuildData['members'][] = json_decode($sCharResponse, true);
}
else {$aDecodeMember = json_decode($sCharResponse, true);
$aGuildData['members'][] = json_decode($sCharResponse, true);

}
}
```
Ich habe die Seite mal komplett unten angefügt:

 

1. cronfrage.php (Datei zum auslesen der Gilden-Informationen)

2. konfig.php (Variablen zum anzeigen verschiedener Atribute)

3. mitglieder.php (Hauptseite der Mitgliederliste)

4. mitglieder.css (ist wohl klar was dies ist 


			Dieser Inhalt steht nur eingeloggten Mitgliedern zur Verfügung.
        

 )


----------



## spectrumizer (27. Oktober 2014)

1.) Einrückung macht den Code unglaublich leichter zu lesen.

 

Also statt:

if ($irgendwas > $irgendwasAnderes) {
mache_irgendwas();
$variableX = 100;
foreach($foo as $bar) {
if ($blub == $bar) {
...
}
}
}
... schreib doch bitte ...

if ($irgendwas > $irgendwasAnderes) {
  mache_irgendwas();
  $variableX = 100;
  foreach($foo as $bar) {
    if ($blub == $bar) {
      ...
    }
  }
}
Damit hilfst du denen, die dir helfen wollen, schonmal ziemlich weiter. 

 

2.) Ich kenne mich mit der Battle.Net-API nicht aus. Aber wenn ich da auf Fehlersuche wäre, würde ich mir erstmal den Inhalt der Rückgaben ausgeben lassen und anschauen.

 


```
if (strpos($http_response_header[0], '200')) {
  $http_response_header = null;
  $aRawData = json_decode($sResponse, true);
 
  // Debug Ausgabe
  echo "<pre>"; print_r($aRawData); echo "</pre">;
  // ...
}
```


----------



## Sorgonas (28. Oktober 2014)

danke für den tip, werde versuchen diesen für das nächste mal zu beherzigen.

 

mir ist gerade aufgefallen, warum ich diese anderen nicht angezeigt bekomme. Ich bin auf dem realm Lothar und darauf hab ich die hp auch ausgelegt.

die anderen sind vom Server Baelgun. Nun kommt mein nächstes problem, wie mache ich es nun das ich beide so auch angezeigt bekomme.


----------



## ZAM (28. Oktober 2014)

Im ersten Schritt empfehle ich erst mal den Zugriff und die Abfrage der Daten auf die neue API umzustellen und dir einen Api-Key zu holen:

https://dev.battle.net/


----------



## ZAM (28. Oktober 2014)

Alt:

```
foreach ($aRawData['members'] as $aMemberItem )
{
    $sCharName = $aMemberItem['character']['name'];
    $sCharResponse = @file_get_contents(
    $sAPIURL . 'character/'.$sRawEncodedRealm.'/'.urlencode(html_entity_decode($sCharName, ENT_COMPAT, 'UTF-8')).'?locale=de_de&fields='.$sMemberFields, true);
```
Neu:

```
foreach ($aRawData['members'] as $aMemberItem )
{
    $sCharName = $aMemberItem['character']['name'];
    $sCharResponse = @file_get_contents(
    $sAPIURL . 'character/'.rawurlencode($aMemberItem['character']['realm']).'/'.urlencode(html_entity_decode($sCharName, ENT_COMPAT, 'UTF-8')).'?locale=de_de&fields='.$sMemberFields, true);
```


----------



## Sorgonas (28. Oktober 2014)

Vielen Dank für deine schnelle Antwort Zam, ich habe das mit der api ...   da angemeldet und nun auch so ne nummer usw. jedoch keine ahnung, wie ich das bei mir einbauen sollte,

 

habe nun auf der mitglieder.php versucht kurz vor der Tabelle wo die mitglieder infos drin sind, es hiermit zu ändern

if ($aMemberItem['character']['realm'] == 'Lothar'){
        $aMemberItem['character']['realm'] = str_replace("Lothar","Baelgun",$aMemberItem['character']['realm']);}

else{$aMemberItem['character']['realm'] = str_replace("Lothar","Lothar",$aMemberItem['character']['realm']);}

leider funktioniert das nicht so ganz,


----------



## ZAM (28. Oktober 2014)

Vielen Dank für deine schnelle Antwort Zam, ich habe das mit der api ...   da angemeldet und nun auch so ne nummer usw. jedoch keine ahnung, wie ich das bei mir einbauen sollte,


Steht auf der API-Seite 
 
habe nun auf der mitglieder.php versucht kurz vor der Tabelle wo die mitglieder infos drin sind, es hiermit zu ändern


Warum?


----------



## Sorgonas (28. Oktober 2014)

weil ich von den chars aus baelgun so ja keine daten angezeigt bekomme


----------



## ZAM (28. Oktober 2014)

Mach die Änderung im Cronjob, die ich dir geschrieben habe und verstehe den Code.
Dein Cronjob-Script cached womöglich auch noch die alten Daten.


----------



## Sorgonas (28. Oktober 2014)

ja hatte er sorry  na gut 7 sind nun immer noch ohne daten, keine ahnung warum.

 

wenn ich den code nun richtig verstehe, liesst er den char aus der gilde Lothar aus, und überprüft dann char-spezifisch auf welchem server er liegt und schrebt es unter ['realm'] rein


----------



## ZAM (28. Oktober 2014)

Sind die 7 Chars ggs. seit 3 Monaten nicht mehr aktiv gewesen?


----------



## Sorgonas (28. Oktober 2014)

das kann gut sein, werde ich heute abend mal in der gildenliste nachschauen


----------



## Sorgonas (29. Oktober 2014)

ja hattest recht, sind seit mehreren Monaten nicht mehr online gewesen.


----------



## Sorgonas (29. Oktober 2014)

Ich habe nun die cronfrage.php neu mit meinem API-KEY geschrieben bekommen, jedoch bekomme ich ausser den Gilden-Infos leider keine Member-Daten mehr angezeigt.
Muss an der mitglieder.php nun was geändert oder der api dort auch eingefügt werden? mit der Testausgabe bekomme ich alle Chars rein, jedoch nicht auf der HP.
Hier mal der Code der Seite:

```
<?php
// Konfiguration
$apiKey = ''; // Anpassen!
$guildRealm = 'Lothar'; // Auf welchem Server ist Gilde registriert?
$guild = 'Familia de Lux'; // Name der Gilde

$apiUrl = 'https://eu.api.battle.net/wow/';

$cacheFile = dirname(__FILE__).'/cache.sth'; // Speicherort der Cache-Datei
$cacheTimeout = 1; // Cache-Timeout in Sekunden

$characterFields = array('talents', 'professions', 'items'); // Welche Felder der Chars werden benötigt?

// Cache wird nur aufgebaut wenn er noch nicht exisitiert oder wenn der Timeout abgelaufen ist
if(!is_file($cacheFile) || (time() - filemtime($cacheFile)) > $cacheTimeout || filesize($cacheFile) == 0 )
    {
    $guildData = array();

// Daten über die Gilde samt Mitglieder holen - hier sind alle Mitglieder drin unabhängig vom Realm
$query = array(
    'locale' => 'de_DE',
    'fields' => 'members',
    'apikey' => $apiKey
);
$url = $apiUrl.'guild/'.rawurlencode($guildRealm).'/'.rawurlencode($guild).'?'.http_build_query($query);
$response = @file_get_contents($url, true);
$guildData = json_decode($response, true);

// Jetzt alle Chars anhand der Member laden
$chars = array();
foreach($guildData['members'] as $member)
    {
    $memberChar = $member['character'];

// Aber nicht vom oben konfigurierten Gilden-Realm sondern vom Realm der beim Member hinterlegt ist
$query = array(
    'locale' => 'de_DE',
    'fields' => 'talents,professions,items',
    'apikey' => $apiKey
);
$url = $apiUrl.'character/'.rawurlencode($memberChar['realm']).'/'.urlencode(html_entity_decode($memberChar['name'], ENT_COMPAT, 'UTF-8')).'?'.http_build_query($query);
$response = @file_get_contents($url, true);
$chars[] = json_decode($response, true);
}

$guildData['characters'] = $chars;

file_put_contents($cacheFile, json_encode($guildData));

// Testausgabe
echo '<pre>';
print_r($guildData);
}
```


----------



## Sorgonas (29. Oktober 2014)

HABS 

 

Ich musste nur in der mitglieder.php nur die Zeile:
 

foreach ($aGuildData['members'] as $aMemberItem ) {


durch
 

foreach ($aGuildData['characters'] as $aMemberItem ) {


ersetzen.


----------



## Sorgonas (29. Oktober 2014)

wie schaffe ich es jedoch nach 10 abgerufenen daten eine sec pause rein zu bekommen? jemand da eine idee?


----------



## ZAM (29. Oktober 2014)

Du setzt in der Schleife einen Counter hoch.
$x++;

if ( $x === 10 ) {
sleep(1);
$x = 0;
}


Ich habe übrigens mal deinen API-Key oben aus deinem Kommentar entfernt ...


----------



## Sorgonas (29. Oktober 2014)

Danke dir.

ok, das was ich versucht hatte, hatte nicht funktioniert ^^ na mal sehen wie ich das nun bei mir eingebaut bekomme


----------



## Sorgonas (30. Oktober 2014)

kann mir jemand vieleicht helfen diesen code bei mir einzubauen, ich bekomme es leider nicht hin


----------



## spectrumizer (30. Oktober 2014)

kann mir jemand vieleicht helfen diesen code bei mir einzubauen, ich bekomme es leider nicht hin

 

```
// Jetzt alle Chars anhand der Member laden
$chars = array();
$charsLoaded = 0; // Zähler
foreach($guildData['members'] as $member) {
	$memberChar = $member['character'];

	// Aber nicht vom oben konfigurierten Gilden-Realm sondern vom Realm der beim Member hinterlegt ist
	$query = array(
		'locale' => 'de_DE',
		'fields' => 'talents,professions,items',
		'apikey' => $apiKey
	);
	$url = $apiUrl.'character/'.rawurlencode($memberChar['realm']).'/'.urlencode(html_entity_decode($memberChar['name'], ENT_COMPAT, 'UTF-8')).'?'.http_build_query($query);
	$response = @file_get_contents($url, true);
	$chars[] = json_decode($response, true);

	// Zählen
	$charsLoaded++;
	if($charsLoaded === 9) {	// Nach 10 Charakteren ...
		$charsLoaded = 0;	// ... Zähler zurücksetzen
		sleep(1);		// ... 1 Sekunde Pause
	}
}
```
PS: Du solltest bei der Testausgabe auch das PRE-Tag wieder schliessen. Sonst kann's passieren, dass der Rest der Seite falsch dargestellt wird.


```
// Testausgabe
echo '<pre>';
print_r($guildData);
echo '</pre>';
}
```


----------



## Sorgonas (30. Oktober 2014)

vielen dank für die antwort, hab vieles versucht das nun einzubauen, aber an der stelle schien es mir nie richtig 

 

Ihr seid einfach spitze, danke


----------

