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?
 

kaepteniglo

Teammitglied
Mitglied seit
07.06.2007
Beiträge
7.729
Reaktionspunkte
323
Kommentare
1.121
Buffs erhalten
912
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.
 
TE
TE
Sorgonas

Sorgonas

Quest-Mob
Mitglied seit
30.03.2010
Beiträge
69
Reaktionspunkte
0
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:

Tikume

Raid-Boss
Mitglied seit
02.03.2007
Beiträge
15.413
Reaktionspunkte
951
Kommentare
1.526
Buffs erhalten
1.308
Naja, dann gib doch mal das zusammengebaute SQL-Statement aus und wirf es testweise in den PHPMyAdmin.
 
TE
TE
Sorgonas

Sorgonas

Quest-Mob
Mitglied seit
30.03.2010
Beiträge
69
Reaktionspunkte
0
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,
 

Tikume

Raid-Boss
Mitglied seit
02.03.2007
Beiträge
15.413
Reaktionspunkte
951
Kommentare
1.526
Buffs erhalten
1.308
Das SQL Statement wird auch mehrfach mit unterschiedlichen Werten generiert?

Ich nehme an Primärschlüssel und so Kram hat die Tabelle?
 
TE
TE
Sorgonas

Sorgonas

Quest-Mob
Mitglied seit
30.03.2010
Beiträge
69
Reaktionspunkte
0
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
 

kaepteniglo

Teammitglied
Mitglied seit
07.06.2007
Beiträge
7.729
Reaktionspunkte
323
Kommentare
1.121
Buffs erhalten
912
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:
TE
TE
Sorgonas

Sorgonas

Quest-Mob
Mitglied seit
30.03.2010
Beiträge
69
Reaktionspunkte
0
also ne fehlermeldung hatte ich da noch nicht bei, aber habe es so nun mal abgeändert unten
 
TE
TE
Sorgonas

Sorgonas

Quest-Mob
Mitglied seit
30.03.2010
Beiträge
69
Reaktionspunkte
0
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
 
TE
TE
Sorgonas

Sorgonas

Quest-Mob
Mitglied seit
30.03.2010
Beiträge
69
Reaktionspunkte
0
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'] . "',
 

Tikume

Raid-Boss
Mitglied seit
02.03.2007
Beiträge
15.413
Reaktionspunkte
951
Kommentare
1.526
Buffs erhalten
1.308
Hättest du dir die SQL-Statements ausgegeben, dann hättest Du aber gesehen dass nur eines ausgegeben wird.
 
Oben Unten