Datenbankbestandteile außerhalb von Admidio auslesen

Alles, was nicht in die anderen Foren passt, kannst du hier loswerden.
Antworten
taba
Beiträge: 26
Registriert: 13. Okt 2009, 14:18

Datenbankbestandteile außerhalb von Admidio auslesen

Beitrag von taba »

Hallo zusammen,

erst mal vielen Dank für Admidio! Toll, dass es es gibt!

Ich bin kein großer PHP-SQL-Spezialist, deshalb vielleicht eine etwas stumpfsinnige Frage. Wir benutzen noch die Version 2.09.

Innerhalb der Benutzerverwaltung habe ich noch das Profilfeld "mitgliedsnr" eingefügt. Jetzt würde ich gerne anhand der Mitgliedsnummer noch Daten des Mitglieds auslesen, die ja im gleichen Datensatz stehen. Ich bräuchte also - falls das überhaupt so möglich sein sollte - eine sql-Abfrage nach dem Muster:

$sql ="SELECT nachname FROM adm_user_data WHERE mitgliedsnr=".$xy."";
(ich möchte also den Nachnamen auslesen, dessen Mitgliegsnummer xy lautet und im gleichen Datensatz steht)

Die Datenbank-Struktur ist in Admidio aber nicht so aufgebaut, dass ich sie mit meinen beschränkten Kenntnissen verstehen würde. Wäre toll, wenn mir da jemand die passende SQL-Abfrage verraten könnte...

Ich sag schon mal DANKE an die Wissenden ;-)
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

Hallo Taba,

erstmal eine Frage zum Verständnis: Du hast eine Datei, die Du ausserhalb von Admidio auf dem gleiche Webserver verwendest, mit der Du Daten eines Mitglieds auslesen möchtest?

Dazu wären generell nicht so viele Schritte notwendig:
1. Zwingend erforderlich ist die Einbindung der common.php, mit der Du die Verbindung zu Admidio herstellst (Datenbankzugriff etc.). Das sieht dann ungefähr so aus (abhängig davon, in welchem Pfad Deie Datei liegt):

Code: Alles auswählen

include($_SERVER['DOCUMENT_ROOT']. "/adm_program/system/common.php");
2. Natürlich ist eine SQL Abfrage ebenso notwendig. Du benötigst für die Ausgabe später allerdings "nur" die Admidio User-ID des Mitglieds, weil Du damit alle relevantenDaten per User-Objekt (siehe 3.) auslesen kannst. Daher müsste die Abfrage in etwa so lauten:

Code: Alles auswählen

SELECT usd_usr_id FROM adm_user_data, adm_user_fields
WHERE usf_name = 'MITGLIEDSNUMMER'
and usf_id = usd_usf_id
and usd_value = 'PLATZHALTER FÜR DIE AUSZULESENDE MITGLIEDSNUMMER'
3. Mit der ausgelesenen User-ID kannst Du nun per User-Objekt alle Daten zum Mitglied auslesen, die Du möchtest. Der folgende Code sollte es veranschaulichen:

Code: Alles auswählen

//User-Objekt erstellen
$mitglied = new User($g_db, AUSGELESENE USER-ID);

//Nachname ausgeben
echo $mitglied->getValue("Nachname");

//Vorname ausgeben
echo $mitglied->getValue("Vorname");
So kannst Du alle Daten zum Mitglied ausgeben und benötigst keine komplizierte übergreifende Abfrage. Natürlich ist da noch ein bischen Programmierung drumherum notwendig, aber mit den genannten Daten sollte das Herzstück erledigt sein...

Gruss,
Matze

Ps. Achtung: Unter Admidio 2.1.x läuft der Zugriff dann wieder etwas anders...
taba
Beiträge: 26
Registriert: 13. Okt 2009, 14:18

Beitrag von taba »

Hey, das ging ja super schnell.

Zur Verständnisfrage: Ich möchte einfach innerhalb der Internetseite Daten aus der Admidio-Datenbank anzeigen, die aber nicht aber über Admidio gesteuert und ja auch nicht optional geändert werden sollen... einfach nur auslesen.

Die Datenbankverbindung müsste ich doch eigentlich auch mit einem normalen Datenbank-Connect hinbekommen, oder?

Code: Alles auswählen

$server = "xxx";
$benutzername = "xxx";
$passwort = "xxx";	
$datenbank = "xxx";
-------------------------

Aber gehen wir mal von Deinem Beispiel aus:

Code: Alles auswählen

<?
include($_SERVER['DOCUMENT_ROOT']. "../adm_program/system/common.php");

$mitglied = mysql_query("SELECT usd_usr_id FROM adm_user_data, adm_user_fields
WHERE usf_name = 'Mitgliedsnr'
and usf_id = usd_usf_id
and usd_value = $id");
?>
Der Code müsste dann doch stimmen, oder? (Nehmen wir mal an $id sei die per php übermittelte Mitgliedsnummer)

Was bedeutet aber:

Code: Alles auswählen

$mitglied = new User($g_db, AUSGELESENE USER-ID); 

Konkret. Was genau ist bei "ausgelesene USER-ID" einzugeben? Und was bedeutet in diesem Zusammenhang "new User"?

----

Und gleich noch eine Frage... Wenn dass Feld in Admidio z.B. nicht "Nachname" sondern "Nachname des Mitglieds" heißt, also duch Leerzeichen getrennt ist, was ist dann bei usf_name = ? anzugeben?
taba
Beiträge: 26
Registriert: 13. Okt 2009, 14:18

Beitrag von taba »

Ich hab schon mal ein bisschen rumprobiert und nun folgenden Code

Code: Alles auswählen

<?
include("../admidio/adm_program/system/common.php");

$userid = mysql_query("SELECT usd_usr_id FROM adm_user_data, adm_user_fields
WHERE usf_name = 'Mitgliedsnr'
and usf_id = usd_usf_id
and usd_value = '$id'");

$mitglied = new User($g_db, $userid);

echo $mitglied->getValue("Nachname");
?>
include($_SERVER['DOCUMENT_ROOT']. "../adm_program/system/common.php"); führt zu einer Fehlermeldung und include("../admidio/adm_program/system/common.php"); verwendet Ihr ja auch in der index.php bei Admidio. So kommt jedenfalls keine Fehlermeldung.

Im Ergebnis passiert aber garnix :-(

Auch wenn ich eine Mitgliedsnummer händisch eintrage

Code: Alles auswählen

<?
include("../admidio/adm_program/system/common.php");

$userid = mysql_query("SELECT usd_usr_id FROM adm_user_data, adm_user_fields
WHERE usf_name = 'Mitgliedsnr'
and usf_id = usd_usf_id
and usd_value = '123456'");

$mitglied = new User($g_db, $userid);

echo $mitglied->getValue("Nachname");
?>
Passiert leider nix. Wo ist der Fehler?
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

taba hat geschrieben:

Code: Alles auswählen

$userid = mysql_query("SELECT usd_usr_id FROM adm_user_data, adm_user_fields
WHERE usf_name = 'Mitgliedsnr'
and usf_id = usd_usf_id
and usd_value = '$id'");
Mir fällt zunächst mal auf, dass Du zwar eine Abfrage durchführst, aber das Ergebnis nicht ausgibst. Der o.g. Code schickt nur die Abfrage an die Datenbank. Das, was von dort zurückkommt, bleibt im Nirvana.

Da fehlt also noch sawas in dieser Richtung:

Code: Alles auswählen

$row = mysql_fetch_object($userid)
Zum Testen kannst in Deinem Script ja einfach mal die Abfrage weglasen und direkt eine User-ID übergeben. Schau mal, was dann passiert...

Gruss,
Matze
taba
Beiträge: 26
Registriert: 13. Okt 2009, 14:18

Beitrag von taba »

Danke für die Antwort, aber wie Du ja siehst, fehlen bei mir offensichtlich die elementarsten Kenntnisse :shock:

Das Problem was ich habe ist, dass ich die Datenbankstruktur nicht begreife. Wenn alles hübsch in Spalten und Zeilen steht, klappen die Abfragen super, aber hier werden die ganzen Daten ja über eine Nummer gebündelt und untereinander weg dargestellt, was mich wohl überfordert.

Erst mal noch ne grundsätzliche Frage. Muss ich die Verbindung zur Admidio-Datenbank vorher herstellen in der Art?

Code: Alles auswählen

// Verbindung
$g_adm_srv = "xxx";      // Server
$g_adm_usr = "xxx";        // Benutzer
$g_adm_pw  = "xxx";    // Passwort
$g_adm_db  = "xxx";    // Datenbank

// Server Verbindung herstellen
mysql_connect($g_adm_srv,$g_adm_usr,$g_adm_pw) or 
die ("Keine Verbindung moeglich");
	
// Datenbank Verbidung
mysql_select_db($g_adm_db) or
die ("Die Datenbank existiert nicht");
oder wird das alles durch das include abgefangen?

Code: Alles auswählen

include("../admidio/adm_program/system/common.php");
---

Code: Alles auswählen

include("../admidio/adm_program/system/common.php");

$userid = mysql_query("SELECT usd_usr_id FROM adm_user_data
WHERE usd_usf_id = '2'
and usd_value = 'Meike'");
$row = mysql_fetch_object($userid);

Ich verstehe aber nach wie vor die Abfrage nicht. Um es ein bisschen kürzer zu machen, habe ich mal den Abgleich von usd_usf_id und wie das Feld im Klartext heißt weggelassen. Der Vorname hat ja die usd_usf_id 2. Also müsste ich doch mit der Abfrage eigentlich die Userid der Person herausfinden, die mit Vornamen Meike heißt, oder?
Wie kann ich denn jetzt einfach die userid testweise ausgeben? echo ????

und wie geht es dann weiter?

Code: Alles auswählen

$mitglied = new User($g_db, $row);
hier verstehe ich leider gar nicht, was da passieren soll

Code: Alles auswählen

<?

// Verbindung
$g_adm_srv = "XXXXX.DE";      // Server
$g_adm_usr = "XXXXXX";        // Benutzer
$g_adm_pw  = "XXXXXX";    // Passwort
$g_adm_db  = "XXXXXX";    // Datenbank

// Server Verbindung herstellen
mysql_connect($g_adm_srv,$g_adm_usr,$g_adm_pw) or 
die ("Keine Verbindung moeglich");
	
// Datenbank Verbidung
mysql_select_db($g_adm_db) or
die ("Die Datenbank existiert nicht");

include("../admidio/adm_program/system/common.php");

$userid = mysql_query("SELECT usd_usr_id FROM adm_user_data
WHERE usd_usf_id = '2'
and usd_value = 'Meike'");
$row = mysql_fetch_object($userid);

$mitglied = new User($g_db, $row);

echo $mitglied->getValue("Nachname");
?>
Dieser Code führt jedenfalls zu der Fehlermeldung:
Catchable fatal error: Object of class stdClass could not be converted to string in /mnt/web2/43/83/51803883/htdocs/admidio/adm_program/system/user_class.php on line 50

Ich weiß, mit mir braucht man viel Geduld :oops:

[EDIT matzman2000: Ich habe mal die Zugangsdaten zu Deinem Server rausgenommen, die muss niemand hier kennen!]
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

Die Datenbankverbindung wird über Einbindung der common.php hergestellt, das ist also schon erledigt. Für das Abfragen von Daten aus der Datenbank heraus sollte ein gewisses Grundwissen natürlich vorhanden sein. Sonst wird es schwierig, da zum Erfolg zu kommen.

Ich versuche Dir die Abfrage mal etwas näher zu bringen:

Code: Alles auswählen

SELECT usd_usr_id FROM adm_user_data, adm_user_fields
Hier wird expliziet nur das Feld usd_usr_id abgefragt, weil wir die User-ID später benötigen. Dieses Feld ist in der Tabelle adm_usr_data enthalten. Die Tabelle adm_user_fields wird allerdings mit abgefragt, weil wir diese als Bedingung benötigen (dort ist Dein eigenes Feld Mitgliedsnr gespeichert).

Code: Alles auswählen

WHERE usf_name = 'Mitgliedsnr'
and usf_id = usd_usf_id
and usd_value = '$id'
Die Bedingungen sind hier definiert. Zunächst wollen wir im Ergebnis nur Daten haben, die das Feld Mitgliednr enthalten (also das Feld usf_name). Dann stellen wir die Verbindung zwischen den beiden Tabellen her in dem wir angeben, dass das Feld usf_id (das ist die ID für Mitgliedsnr) in der Datentabelle unter usd_usf_id zu finden ist. Also alle Einträge in der Datentabelle sind von Interesse, wenn sie die ID Für Mitgliedsnr tragen. Da wir eine expliziete Mitglieds-ID suchen, geben wir diese in der letzten Bedingung im Feld usd_value auch noch mit.

Mehr ist es nicht....

Vielleicht macht es aber Sinn, sich erstmal noch ein bischen zum Thema Datenbanken einzulesen. Deine Abfrage wird so nicht funktionieren. Du fragst zwar das Ergebnis ab:

Code: Alles auswählen

$row = mysql_fetch_object($userid)
Aber hier fehlt noch das Schrittweise durchgehen durch das Ergebnis:

Code: Alles auswählen

while($row = mysql_fetch_object($userid))
{
    $user_id = $row->usd_usr_id;
}
Schau Dir mal zB diese gute Anfängerseite an, dort wird der Datenbankzugriff als Einstieg gut erklärt.

Ansonsten lohnt es sich auch in der Admidio-eigenen Entwicklerdoku nachzulesen.

Gruss,
Matze
taba
Beiträge: 26
Registriert: 13. Okt 2009, 14:18

Beitrag von taba »

Hey matzman2000,

nicht sauer sein. Ich weiß, dass Du es schwer mit mir hast. Ich bin halt Anwender und kein Programmierer. Aber jetzt hast Du es mir ja ausführlichst erklärt und selbst ich hab jetzt ne Abfrage, die mich zum Ziel führt.

Vielen, vielen DANK!
:)
taba
Beiträge: 26
Registriert: 13. Okt 2009, 14:18

Beitrag von taba »

Hallo matzmann,

ich bin es wieder :lol:

Ich hab jetzt ein Update von 2.09 auf 2.26 durchgeführt. Hat prima geklappt, nur durch die veränderte Datenbankstruktur funktioniert die Abfrage nicht mehr so, wie es mal war.

Kurz noch mal die Problemschilderung: Jeder Nutzer hat bei uns noch mal eine Mitgliedsnummer (Das entsprechende Feld in der Mitgliederverwaltung heißt auch so) ... Ich will aus der Admidio-Datenbank einzelne Felder per Mitgliedsnummer auf der Website auslesen - am besten auch das Datum, wann ein Mitglied einer bestimmten Rolle zugeordnet wurde...

Wäre super, wenn Ihr dafür ein paar Codezeilen für mich hättet...

Danke im Voraus!
taba
taba
Beiträge: 26
Registriert: 13. Okt 2009, 14:18

Beitrag von taba »

Ich übe mich weiter in Geduld ;) Aber nach einem Monat ist nachhaken doch erlaubt oder? Vielen Dank für Eure Unterstützung.
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

Hi taba,

ich habe den Beitrag hier ohne Absicht völlig überlesen...

Poste doch nochmal Deine komplette Abfrage, dann kann man da sicherlich recht schnell den Fehler/geänderten Paramter sehen.

gruss,
Matze
taba
Beiträge: 26
Registriert: 13. Okt 2009, 14:18

Beitrag von taba »

Hallo matzmann, kein Problem, jetzt bist Du ja da.

Also ganz kurz zusammengefasst... Wir haben unter der Version 2.08 folgende Abfrage gehabt:

Code: Alles auswählen

include("../ssl/admidio/adm_program/system/common.php");

$userid = mysql_query("SELECT usd_usr_id FROM adm_user_data, adm_user_fields
WHERE usf_name = 'Mitgliedsnummer'
and usf_id = usd_usf_id
and usd_value ='$mg'");

while($row = mysql_fetch_object($userid))
{
    $user_id = $row->usd_usr_id;
}

$mitglied = new User($g_db, $user_id);

$sportgruppe = $mitglied->getValue("Sportgruppe");
Der Sinn des Ganzen war, auf unserer Seite Daten aus der Admidio-Datenbank zu ziehen und außerhalb dieses Umfelds auszugeben. Die Mitgliedsnummer ist ein frei definiertes Feld innerhalb des Nutzerdatensatzes, der bei Admidio abgelegt ist. Bei uns wird die Mitgliedsnummer auf der Seite an dieser Stelle in der Variablen $mg gespeichert. Ich möchte also den Datensatz in der Admidio-Datenbank finden, wo das Feld "Mitgliedsnummer" den Inhalt unserer Variable $mg hat.
Mit dem Versionssprung von 2.08 auf 2.26 klappt diese Abfrage von oben aber nicht mehr. Wie muss diese angepasst werden?

2. Frage in dem Zusammenhang wäre, wie man gleichzeitig noch an das Datum kommt, wann dieses Mitglied einer bestimmten Rolle zugeordnet wurde.

... und wenn ich schon mal am Fragen bin... lässt sich bei der Benutzerverwaltung das Suchfeld noch dazu überreden, auch in unserem Feld "Mitgliedsnummer" zu suchen? Bei über 1800 Mitglieder wird die Namenssuche nämlich langsam etwas unübersichtlich und die Suche nach der Mitgliedsnummer würde die Arbeit sehr erleichtern ;)

DANKE für Deine Hilfe.
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

Schau doch mal in der Tabelle adm_user_fields, was dort im Feld usf_name_intern für Dein eigenes Feld "Sportgruppe" angegeben wird. Ich tippe mal auf "SPORTGRUPPE".
Dann müsste das Auslesen heissen:

Code: Alles auswählen

$sportgruppe = $mitglied->getValue("SPORTGRUPPE"); 
Die Rollenmitgliedschaften werden in der Tabelle adm_members unter der Angabe der Rollen ID aus der Tabelle adm_roles abgelegt, zugewiesen zur User ID.

Die Suche lässt sich nicht ohne weiteres auf die Mitgliedsnummer (also Dein eigenes Feld ausweiten), da muss man im Quelltext schon ein bisserl rumfummeln...
taba
Beiträge: 26
Registriert: 13. Okt 2009, 14:18

Beitrag von taba »

OK, wenn ich das richtig sehe, müssen also - solange keine Umlaute verwendet wurden, einfach alle Feldnamen in Großbuchstaben geschrieben werden... das bekomme ich hin ;)

Mit den Rollen muss ich mir erst mal näher anschauen. Das hab ich auf den ersten Blick noch nicht so richtig erfasst...

Bei der Suche dachte ich, man könnte bei der SQL-Abfrage einfach noch ein Feld mehr mit aufnehmen... aber so einfach ist es wohl nicht... schade... aber vielleicht könnt Ihr das ja irgendwann in einem Update mal integrieren, dass man ein Feld festlegen kann, was auch mit "durchsucht" wird... wenn es nur nicht so viele Schmidts, Meiers und Schulze geben würde ;)

Danke und Gruß
taba
Antworten