Abfrage in DB anstelle von TXT erstellen

Sorgonas

Quest-Mob
Mitglied seit
30.03.2010
Beiträge
69
Reaktionspunkte
0
Hallo, ich habe hier eine Abfrage die ich im moment in eine Datei abspeichern lasse. Ich würde diese gerne in meine Datenbank schreiben lassen, jedoch klappt das irgendwie nicht so.

 

Hier der Code wie er die Daten in die .txt schreibt

<?php
// Konfiguration
$apiKey = 'HIER STEHT MEIN 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();
$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
}
}


$guildData['characters'] = $chars;

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

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

Und dies ist der Versuch die Datenbank ein zu binden:

<?php
// Konfiguration
$apiKey = 'HIER STEHT MEIN 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();
$charsLoaded = 0; // Zähler

//Verbindung der DB herstellen
$datenbank = mysql_connect('localhost','BENUTZERNAME','PASSWORT');

if($datenbank)
echo('DB-Serververbindung hergestellt! ');
else
die('DB-Serververbindung fehlgeschlagen! ');
// Datenbank auswählen
mysql_select_db('usr_web22_4', $datenbank);

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
}
}
$guildData['characters'] = $chars;


//Daten in DB speichern (json_encode($aGuildData))
$sql_befehl = " INSERT INTO wy8b2_mitgliederliste (chars, klasse, level, firtal, sectal, firber, secber, erfolg) VALUES
(
'" . $chars['name'] . "',
'" . $chars['class'] . "',
'" . $chars['level'] . "',
'" . $chars['talents'][0]['spec']['name'] . "',
'" . $chars['talents'][1]['spec']['name'] . "',
'" . $chars['professions']['primary'][0]['rank'] . "',
'" . $chars['professions']['primary'][1]['rank'] . "',
'" . $chars['achievementPoints'] . "'
)";


mysql_query ($sql_befehl);
$guildData['members'][] = json_decode($response, true);


// Testausgabe
echo '<pre>';
print_r($chars);
echo '</pre>';
};
?>

Könnt Ihr mir hierbei helfen?
 
Du Prüfst doch immer noch ab, ob das Cache-File noch "gültig" ist:

 

// 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 )

 

Die Überprüfung ist ein wenig sinnfrei, wenn du gar nicht mehr in das File schreibst.

 

Aber landet nun gar nichts in der DB oder was ist das Problem? Wenn du dir einfach mal irgendwelche Debug-Meldungen ausgeben lassen würdest, könntest du auch sehen, welche Codestellen er überhaupt abarbeitet.
 
in die datenbank bekomme ich keine informationen angezeigt leider.

mit dem ersten code werden alle daten komplett in die txt geschrieben.

habe nun die if abfrage raus gelöscht.
 
Zuletzt bearbeitet von einem Moderator:
Naja, dann gib doch mal das zusammengebaute SQL-Statement aus und wirf es testweise in den PHPMyAdmin.
 
ich habe nun die einträge abgeändert mit:

'" . $memberChar['name'] . "',

die weiteren felder davon natürlich auch, jedoch bekomme ich nun nur einen char in die datenbank geschrieben,
 
Das SQL Statement wird auch mehrfach mit unterschiedlichen Werten generiert?

Ich nehme an Primärschlüssel und so Kram hat die Tabelle?
 
also am ende gebe ich ja ne test-ausgabe, die funktioniert und ich habe alle daten im browser der abfrage, nur nicht in der db
 
Wirft "mysql_query ($sql_befehl);" einen Fehler ab dem 2. Durchlauf?

 

mach mal:

$result = mysql_query($sql_befehl);
if (!$result) {
    $message  = 'Ungültige Abfrage: ' . mysql_error() . "\n";
    $message .= 'Gesamte Abfrage: ' . $query;
    die($message);
}

Das liefert dir wenigstens eine korrekte Fehlermeldung.

 

PS: Parameter im SQL-Statement sind besser als solche "Klartext"-Werte, ich sag nur SQL-Injection.

http://php.net/manual/de/function.mysql-query.php
 
Zuletzt bearbeitet von einem Moderator:
also ne fehlermeldung hatte ich da noch nicht bei, aber habe es so nun mal abgeändert unten
 
ich verzweifel hier noch, also wenn ich

'" . $memberChar['name'] . "',

benutze bekomme ich nur einen Char angezeigt, in der DB sowie auch im Browser,

 

wenn ich aber wieder dies hier nehme:

'" . $chars['name'] . "',

sehe ich im browser alle infos und alle Chars, jedoch in der DB keinen Eintrag.

wenn ich es richtig sehe, müsste ich ins nächste Array, jedoch keine ahnung wie
 
hab es geschaft, es hatte ein foreach gefehlt

Code:
foreach ($guildData['characters'] as $achars ) {

//Daten in DB speichern (json_encode($aGuildData))
$sql_befehl = " INSERT INTO wy8b2_mitgliederliste (chars, klasse, level, firtal, sectal, firber, secber, erfolg) VALUES
(
'" . $achars['name'] . "',
 
Hättest du dir die SQL-Statements ausgegeben, dann hättest Du aber gesehen dass nur eines ausgegeben wird.
 
Zurück