Seite 1 von 2

Userdaten der Benutzerdefinierten Profilfelder downloaden?

Verfasst: 25.01.2015 12:43
von lj_schmitt
Hallo ihr lieben,

habe mit der such Funktion leider nichts brauchbares gefunden

In unsere Webseite http://www.deutschehelden.de geht es um ein Online Kartenspiel.
Ich habe jetzt Benutzerdefinierte Profilfelder angelegt und möchte die gesamte liste der eingegebenen Profilfelden inklusive Usernamen downloaden

dabei bräuchte ich dringend hilfe :(

die Benutzerdefinierte Profilfelder sehen so aus:
[ externes Bild ]

und die ausgabe sollte ne exceltabelle oder CSV sein und in etwa so aufgeteilt sein

{Benutzername1}: commander, Karte_1, Karte_2, Karte_3, Karte_4, Karte_5, Karte_6, Karte_7, Karte_8, Karte_9, Karte_10, Inv1, Inv2, Inv3, Inv4, Inv5
{Benutzername2}: commander, Karte_1, Karte_2, Karte_3, Karte_4, Karte_5, Karte_6, Karte_7, Karte_8, Karte_9, Karte_10, Inv1, Inv2, Inv3, Inv4, Inv5
{Benutzername3}: commander, Karte_1, Karte_2, Karte_3, Karte_4, Karte_5, Karte_6, Karte_7, Karte_8, Karte_9, Karte_10, Inv1, Inv2, Inv3, Inv4, Inv5
{Benutzername4}: commander, Karte_1, Karte_2, Karte_3, Karte_4, Karte_5, Karte_6, Karte_7, Karte_8, Karte_9, Karte_10, Inv1, Inv2, Inv3, Inv4, Inv5



Ich habe hier nen phpcode gefunden weiß aber nicht so wirklich wie ich ihn abändern muss!?

Code: Alles auswählen

<?php 
    // Verbindung zum Datenbankserver 
    mysql_connect("host", "benutzer", "passwort") or die (mysql_error ()); 

    // Datenbank auswählen 
    mysql_select_db("datenbankname") or die(mysql_error()); 

    // Daten aus der Datenbank abrufen, wobei der Wert von id aus in der URL berücksichtigt wird 
    $strSQL = "SELECT * FROM search WHERE id=" . $_GET["id"]; 
    $rs = mysql_query($strSQL); 
     
    // Schleifendurchlauf durch $rs 
    while($row = mysql_fetch_array($rs)) { 

    // Schreibe die Daten der Person 
        echo "<dt>Name:</dt><dd>" . $row["VorUndNachName"] . " " . $row["Todestag"] . "</dd>"; 
        echo "<dt>Karte1, </dt><dd>" . $row["Geburtstag"] . "</dd>"; 
        echo "<dt>Karte2, </dt><dd>" . $row["Geburtsort"] . "</dd>"; 

    } 

    // Schließt die Datenbankverbindung 
    mysql_close(); 
    ?>
das mit dem zugang ist mir klar, nur wie lade ich die einträge aus den verschiedenen Datenbanken??

wäre super wenn mir da jemand helfen kann

Re: Userdaten der Benutzerdefinierten Profilfelder downloade

Verfasst: 02.02.2015 13:12
von paddle
Hi,

Wenn es dir nur um die Abfrage geht, so kannst du so die gewünschten Daten bekommen:

Code: Alles auswählen

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);

include($phpbb_root_path . 'common.' . $phpEx);

//Frage die Daten aus den benötigten Tabellen
$sql_query = 'SELECT u.username, u.user_id, p.* FROM ' . PROFILE_FIELDS_DATA_TABLE . ' AS p, ' . USERS_TABLE .' AS u WHERE p.user_id = u.user_id';

//Führe die Datenbankabfrage durch
$result = $db->sql_query($sql_query);

//laufe über das Ergebnis und gebe die Daten aus
while ($row = $db->sql_fetchrow($result)) {
    echo '{' . $row['username'] . '},'  . $row['pf_karte_1'] . ','  . $row['pf_karte_2'];  \\hier alle benötigten Felder abfragen
}
 
Anstatt die Daten auszugeben, kannst du sie natürlich auch in eine Datei schreiben.

Re: Userdaten der Benutzerdefinierten Profilfelder downloade

Verfasst: 03.02.2015 15:37
von lj_schmitt
das sieht ja schonmal gut aus, nur wie setze ich das um das alles in eine tabelle geladen wird!? z.b. in eine csv datei?

habe jetzt versucht den code so zu verändern, nur die ausgabe passt irgendwie nicht, iwas mache ich falsch!?

Code: Alles auswählen

<?php
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);

include($phpbb_root_path . 'common.' . $phpEx);

//Frage die Daten aus den benötigten Tabellen
$sql_query = 'SELECT u.username, u.user_id, p.* FROM ' . PROFILE_FIELDS_DATA_TABLE . ' AS p, ' . USERS_TABLE .' AS u WHERE p.user_id = u.user_id';

//Führe die Datenbankabfrage durch
$result = $db->sql_query($sql_query);

//laufe über das Ergebnis und gebe die Daten aus
while ($row = $db->sql_fetchrow($result)) {
    echo '{' . $row['username'] . '}:'  . $row['pf_tu_commander'] . ', '  . $row['pf_tu_karteeins', '  . $row['pf_tu_kartezwei', '  . $row['pf_tu_kartedrei', '  . $row['pf_tu_kartevier', '  . $row['pf_tu_kartefuenf', '  . $row['pf_tu_kartesechs', '  . $row['pf_tu_kartesieben', '  . $row['pf_tu_karteacht', '  . $row['pf_tu_karteneun', '  . $row['pf_tu_kartezehn', '  . $row['pf_tu_inv_a', '  . $row['pf_tu_inv_b', '  . $row['pf_tu_inv_c', '  . $row['pf_tu_inv_d', '  . $row['pf_tu_inv_e'];  \\hier alle benötigten Felder abfragen
}
?>
bekomme aber nur das als ausgabe

Code: Alles auswählen

sql_query($sql_query); //laufe über das Ergebnis und gebe die Daten aus while ($row = $db->sql_fetchrow($result)) { echo '{' . $row['username'] . '}:' . $row['pf_tu_commander'] . ', ' . $row['pf_tu_karteeins', ' . $row['pf_tu_kartezwei', ' . $row['pf_tu_kartedrei', ' . $row['pf_tu_kartevier', ' . $row['pf_tu_kartefuenf', ' . $row['pf_tu_kartesechs', ' . $row['pf_tu_kartesieben', ' . $row['pf_tu_karteacht', ' . $row['pf_tu_karteneun', ' . $row['pf_tu_kartezehn', ' . $row['pf_tu_inv_a', ' . $row['pf_tu_inv_b', ' . $row['pf_tu_inv_c', ' . $row['pf_tu_inv_d', ' . $row['pf_tu_inv_e']; \\hier alle benötigten Felder abfragen } ?>


kannst du mit noch einmal dabei helfen?

in der phpbb_profile_fields_data steht auch nur die user_id und die pf_tu_commander etc als id

Re: Userdaten der Benutzerdefinierten Profilfelder downloade

Verfasst: 04.02.2015 13:07
von lj_schmitt
so ich hab es selber hinbekommen, waren ein paar syntax fehler drin ;-)

aber leider gibt er mir nur die ids der profilfelder aus, kann mir das jemand so schrieben das er stattdessen die eingetragenen namen ausgibt?!

hier schonmal der funktionstüchtige code für alle anderen ;-)

Code: Alles auswählen

<?php
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);

include($phpbb_root_path . 'common.' . $phpEx);

//Frage die Daten aus den benötigten Tabellen
$sql_query = 'SELECT u.username, u.user_id, p.* FROM ' . PROFILE_FIELDS_DATA_TABLE . ' AS p, ' . USERS_TABLE .' AS u WHERE p.user_id = u.user_id';

//Führe die Datenbankabfrage durch
$result = $db->sql_query($sql_query);

//laufe über das Ergebnis und gebe die Daten aus
while ($row = $db->sql_fetchrow($result)) 

{
    echo '{' . $row['username'] . '}:' . $row['pf_tu_commander'] . ', ' . $row['pf_tu_karteeins'] . ', ' . $row['pf_tu_kartezwei'] . ', ' . $row['pf_tu_kartedrei'] . ', ' . $row['pf_tu_kartevier'] . ', ' . $row['pf_tu_kartefuenf'] . ', ' . $row['pf_tu_kartesechs'] . ', '  . $row['pf_tu_kartesieben'] . ', '  . $row['pf_tu_karteacht'] . ', '  . $row['pf_tu_karteneun'] . ', ' . $row['pf_tu_kartezehn'] . ', '  . $row['pf_tu_inv_a'] . ', '  . $row['pf_tu_inv_b'] . ', ' . $row['pf_tu_inv_c'] . ', '  . $row['pf_tu_inv_d'] . ', '  . $row['pf_tu_inv_e'] . "\n"; 
}
?>

so sieht dann meine ausgabe aus

Code: Alles auswählen

{JensS19}:4, 484, 83, 135, 8, 874, 874, 539, 705, 1107, 1, 1626, 1225, 733, 572, 474 {TimoE6}:23, 484, 330, 1824, 449, 83, 1373, 136, 572, 872, 1, 1676, 1728, 1603, 337, 1012 {Garthyrail}:4, 1443, 136, 872, 161, 484, 449, 1, 1, 1, 1, 1373, 1824, 83, 330, 572 {ThomasBu75}:8, 1529, 495, 485, 572, 1824, 449, 161, 135, 1603, 778, 730, 1408, 456, 1575, 1818 {darkstorne}:14, 1443, 733, 1373, 484, 572, 1662, 1824, 1, 1, 1, 1, 1, 1, 1, 1 {TheLaughingMax}:4, 161, 1628, 449, 1599, 83, 589, 1332, 509, 872, 866, 401, 705, 1676, 572, 1303 {Lalamith}:23, 484, 1543, 495, 449, 540, 1607, 83, 1427, 1603, 1529, 161, 33, 164, 874, 730 {Mathia190989}:11, 495, 495, 572, 484, 1408, 449, 1529, 1738, 1, 1, 1, 1, 1, 1, 1

Re: Userdaten der Benutzerdefinierten Profilfelder downloade

Verfasst: 04.02.2015 13:37
von Wolfsblvt
Willst du die Namen als Spaltenüberschrift, oder bei jedem Wert davor?
Ich meine die Namen hast du ja quasi schon angegeben unten bei der Ausgabeformatierung.

$row['pf_tu_commander'] gibt dir den Wert für das Profilfeld mit dem Namen "pf_tu_commander".

Re: Userdaten der Benutzerdefinierten Profilfelder downloade

Verfasst: 04.02.2015 14:08
von lj_schmitt
es sind halt karten und es sind benutzerdefinierte Profilfelder.

die namen liegen ja in der phpbb_profile_fields_lang
und ich hätte gerne statt die id nummer den ganzen Kartennamen drinstehen

in etwa so:
{JensS19}:Barracus, Abbhorend Recluse, Dreamhaunter, Halerift, Arch Nova Alpha, Tartarus Graft, Jilted Baughe, etc, etc, etc, etc

Re: Userdaten der Benutzerdefinierten Profilfelder downloade

Verfasst: 04.02.2015 22:57
von paddle
Hi,

Ich hatte gedacht die Namen würden direkt in der Datenbank stehen. - Mein Fehler.

Versuch es dann am besten mal so:

Code: Alles auswählen

<?php

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);

include($phpbb_root_path . 'common.' . $phpEx);

//Hole die phpbb Container zum verwalten der Daten
$cp = $phpbb_container->get('profilefields.manager');
$cd = $phpbb_container->get('profilefields.type.dropdown');

// lege die Profilfelder fest, die abgefragt werden sollen
$cardnames = array("tu_commander","tu_karteeins","tu_kartezwei"); //in dieser Form alle gewünschten Karten in das Array eintragen

// Erstelle ein neues Array für alle User und Karten
$decks = array();

//Hole alle User aus der Datenbank
$sql_query = 'SELECT username, user_id FROM '. USERS_TABLE ;
$result = $db->sql_query($sql_query);

//laufe über alle User
while ($row = $db->sql_fetchrow($result)) {
    $user_id = $row['user_id'];
    
    //erstelle ein temporaeres Kartenarray
    $cards = array();    
    
    //setze die 0. Position auf den Username 
    $cards[0] = $row['username'];
    
    //hole alle Profilfelder
    $profile_fields = $cp->grab_profile_fields_data($user_id);
    
    //schreibe die Benutzerdefinierten Profilfelder in das Kartenarray
    $i=1;
    foreach($cardnames as $card) {
        if(isset($profile_fields[$user_id])) {
            $cards[$i] = $cd->get_profile_value($profile_fields[$user_id][$card]['value'],$profile_fields[$user_id][$card]['data']);
        }
        $i++;
    }
    
    //Haenge das Kartenarray an das $decks array
    array_push($decks, $cards); 
}

?>
Die Daten: (Nutzername, Karte1, Karte2, ...) liegen dann am Ende des Codes im Array $decks.
Wie man ein Array in eine csv Datei schreibst, wirst du denk ich leicht über google herausfinden. Ist ja nicht phpBB spezifisch :)

Re: Userdaten der Benutzerdefinierten Profilfelder downloade

Verfasst: 05.02.2015 14:04
von lj_schmitt
bin leider kein Profi was das alles hier angeht, ich verstehe das nicht so ganz mit der array ausgabe, ich habe zwar den code bearbeitet bekomme aber keine ausgabe :cry:

könnte mir da noch jemand helfen? :oops:

Code: Alles auswählen

<?php

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);

include($phpbb_root_path . 'common.' . $phpEx);

//Hole die phpbb Container zum verwalten der Daten
$cp = $phpbb_container->get('profilefields.manager');
$cd = $phpbb_container->get('profilefields.type.dropdown');

// lege die Profilfelder fest, die abgefragt werden sollen
$cardnames = array("pf_tu_commander","pf_tu_karteeins","pf_tu_kartezwei","pf_tu_kartedrei","pf_tu_kartevier","pf_tu_kartefuenf","pf_tu_kartesechs","pf_tu_kartesieben","pf_tu_karteacht","pf_tu_karteneun","pf_tu_kartezehn","pf_tu_inv_a","pf_tu_inv_b","pf_tu_inv_c","pf_tu_inv_d","pf_tu_inv_e"); //in dieser Form alle gewünschten Karten in das Array eintragen

// Erstelle ein neues Array für alle User und Karten
$decks = array();

//Hole alle User aus der Datenbank
$sql_query = 'SELECT username, user_id FROM '. USERS_TABLE ;
$result = $db->sql_query($sql_query);

//laufe über alle User
while ($row = $db->sql_fetchrow($result)) {
    $user_id = $row['user_id'];
    
    //erstelle ein temporaeres Kartenarray
    $cards = array();    
    
    //setze die 0. Position auf den Username 
    $cards[0] = $row['username'];
    
    //hole alle Profilfelder
    $profile_fields = $cp->grab_profile_fields_data($user_id);
    
    //schreibe die Benutzerdefinierten Profilfelder in das Kartenarray
    $i=1;
    foreach($cardnames as $card) {
        if(isset($profile_fields[$user_id])) {
            $cards[$i] = $cd->get_profile_value($profile_fields[$user_id][$card]['value'],$profile_fields[$user_id][$card]['data']);
        }
        $i++;
    }
    
    //Haenge das Kartenarray an das $decks array
    array_push($decks, $cards); 
}

//test array csv ausgabe

$fp = fopen('daten.csv', 'a');
    fputcsv($fp, $decks);
    fclose($fp);
?>
er speichert mir die datei zwar aufm server, das soll er aber nicht, er soll sie mir direkt ausgeben als textanzeige und zum speichern auf der festplatte.

z.Z. steht in der server datei nur array array...... etc nix anderes als array :-(


Bitte bitte um Hilfe!?

Re: Userdaten der Benutzerdefinierten Profilfelder downloade

Verfasst: 05.02.2015 16:26
von paddle
Was genau möchtest du denn jetzt damit machen?

Möchtest du ein csv / xls Datei so auf dem Server speichern, dass der Nutzer sie herunterladen kann, oder möchtest du bei Aufruf der php Datei im Browser eine Ausgabe wie in deinem Startbeitrag angegeben?
lj_schmitt hat geschrieben:z.Z. steht in der server datei nur array array...... etc nix anderes als array
Das liegt daran, dass $decks ein 2 dimensionales Array ist. Du bekommst für jeden Index des Arrays also wieder ein Array zurück.
fputcsv erwartet aber ein Array, mit nur Werten.

Das könntest du z.B. so lösen:

Code: Alles auswählen

$fp = fopen('daten.csv', 'a');
foreach($decks as $deck) {
    fputcsv($fp, $deck);
}
fclose($fp);
Hab ich jetzt nicht getestet, sollte aber funktionieren.

Re: Userdaten der Benutzerdefinierten Profilfelder downloade

Verfasst: 05.02.2015 17:05
von lj_schmitt
Schonmal danke für die nette Hilfe ;-)

Ich hätte gerne eine textausgabe der Datei auf der hp und die Möglichkeit diese als csv oder XML, ist eigentlich egal, zu downloaden. Die Bearbeitung erfolgt durch eine batchdatei.

also in etwas so als Text:

Code: Alles auswählen

Username1: commander, Karte 1, Karte 2,... Karte 10
Username1: inventar karte 1, Inventar karte 2..., Inventar karte 5(geht demnächst bis inventar karte 10)

Username2: commander.... 
Etc..

Etc...
Etc...