Select_where aus 3 unterschiedlichen tables

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
DeliCJouS
Mitglied
Beiträge: 20
Registriert: 04.11.2008 20:00

Select_where aus 3 unterschiedlichen tables

Beitrag von DeliCJouS »

Hallo,

habe nicht so viel Ahnung von PHP und möchte euch daher gerne um hilfe Bitten...

ich benötige ein array, welches mir die User einer bestimmten Gruppe mit einem zum user gehörenden benutzerdefinierten Profilfeld anzeigt.

Habe bisher folgendes gefunden und mir dabei gedacht das man dies aus der memberlist.php doch dementsprechend anpassen könnt (.. was nicht heißt dass es richtig oder ansatzweise richtig ist ^^)

Code: Alles auswählen

$sql = $db->sql_build_query('SELECT', array(
			'SELECT'	=> 'u.user_id, u.username u.group_id, g.group_colour, p.pf_DGrad, g.group_type, ug.user_id as ug_user_id',

			'FROM'		=> array(
				USERS_TABLE		                        => 'u',
				GROUPS_TABLE	                                => 'g'
				PROFILE_FIELDS_DATA_TABLE		=> 'p',
			),

			'LEFT_JOIN'	=> array(
				array(
					'FROM'	=> array(USER_GROUP_TABLE => 'ug'),
					'ON'	=> 'ug.group_id = g.group_id AND ug.user_pending = 0 AND ug.user_id = ' . $user->data['user_id']
				)
			),

			'WHERE'		=> $db->sql_in_set('g.group_id', array_unique(array_merge($admin_id_ary, $mod_id_ary)), false, true) . '
				AND u.group_id = g.group_id',

			'ORDER_BY'	=> 'g.group_name ASC, u.username_clean ASC'
		));
		$result = $db->sql_query($sql);
Ich bitte euch mir da mal etwas zu helfen :-)

MfG
Deli
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Select_where aus 3 unterschiedlichen tables

Beitrag von gn#36 »

Da gibt's vorgefertigte Funktionen für. Schau mal in die functions_user.php (fkt. group_memberships), den Rest ggf. mit Funktionen in der functions_profile_fields.php
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
DeliCJouS
Mitglied
Beiträge: 20
Registriert: 04.11.2008 20:00

Re: Select_where aus 3 unterschiedlichen tables

Beitrag von DeliCJouS »

löl....
habe nicht so viel Ahnung von PHP und möchte euch daher gerne um hilfe Bitten...
Das war ernst gemeint, also ich habe die funktion zwar schon in der Memberslist.php und auch in der functions_user.php gefunden... werde aber noch nicht wirklich schlau daraus wie ich diese Anwenden soll!
Habe leider auch keine Funktion gefunden, die mir dann in einem array die bzw. das benutzerd. Profilfeld zeigen könnten :-/

Sorry wenn ich mich so dumm anstelle...
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Select_where aus 3 unterschiedlichen tables

Beitrag von gn#36 »

Ok, dann gehen wir vielleicht noch mal an den grundsätzlichen Aufbau der Abfrage heran, auch wenn die Benutzung der group_memberships Funktion eigentlich ziemlich einfach ist...

Dazu solltest du das ganze zunächst mal aufspalten soweit es geht und dann wieder schrittweise zusammenbauen. Du fragst nämlich grundsätzlich Daten aus Tabellen ab, die nicht miteinander in Verbindung stehen, die Verknüpfungstabellen die dazu da sind fehlen in deiner Abfrage.
Zunächst mal möchtest du ja herausfinden welche User in einer bestimmten Gruppe sind. Ganz einfach ginge das mit so einer Abfrage:

Code: Alles auswählen

$sql = "SELECT user_id FROM " . USER_GROUP_TABLE . " WHERE group_id = $group_id AND user_pending = 0";
Das setzt natürlich vorraus dass du die Group ID der Gruppe kennst, wenn es aber immer um die gleiche Gruppe geht ist das ja kein Problem und auch sonst identifiziert man die Gruppe ja über die ID.

Als nächstes möchtest du ja für eine Auswahl an Usern ein bestimmtes Profilfeld abfragen. Wie du schon richtig erkannt hast liegen diese Daten in der PROFILE_FIELDS_DATA_TABLE, hier musst du also nur die entsprechenden Felder abfragen:

Code: Alles auswählen

$sql = "SELECT user_id, alle_notwendigen_felder FROM " . PROFILE_FIELDS_DATA_TABLE;
Willst du auch noch den Usernamen haben brauchst du noch Daten aus der USERS_TABLE:

Code: Alles auswählen

$sql = "SELECT username, user_id FROM " . USERS_TABLE;
Das alles lässt sich zusammenfassen in eine Abfrage. Hier zunächst mal die Abfrage:

Code: Alles auswählen

$sql = "SELECT u.user_id, u.username, p.alle_notwendigen_felder
FROM " . USERS_GROUPS_TABLE . " g
LEFT JOIN " . USERS_TABLE . " u ON g.user_id = u.user_id
LEFT JOIN " . PROFILE_FIELDS_DATA_TABLE . " p ON p.user_id = g.user_id
WHERE g.group_id = $group_id AND g.user_pending = 0";
Das ist jetzt die notwendige Abfrage für eine einzelne Gruppe. Du kannst den Teil der WHERE abfrage natürlich mit $db->sql_in_set wie du das schon bei deinem Aufbau gemacht hattest erweitern auf mehrere Gruppen. Du kannst das natürlich auch auf die von dir gewählte array Form bringen, ich persönlich mag es als zusammenhängenden Text lieber. Selbstverständlich musst du natürlich p.alle_notwendigen_felder durch die Liste der Felder die du brauchst ersetzen.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
DeliCJouS
Mitglied
Beiträge: 20
Registriert: 04.11.2008 20:00

Re: Select_where aus 3 unterschiedlichen tables

Beitrag von DeliCJouS »

wow...

vielen vielen Dank, das hat mir sehr geholfen!!!
Mit dem Left- und Inner Join zeugs kam ich noch nicht klar, also wusste ich nicht wie ich die tabellen verknüpfen sollte!
Hat sich ja nun erledigt :-)

Nochmals vielen Dank!
Gruß
DeliCJouS
Mitglied
Beiträge: 20
Registriert: 04.11.2008 20:00

Re: Select_where aus 3 unterschiedlichen tables

Beitrag von DeliCJouS »

hmmm... ahbe mich nun 3 Abende mit diesem Zeug beschäftigt und komme einfach nicht weiter... bin wohl noch nicht eingearbeitet genug :'-( ...

Ich habe es nicht geschaft diese Seite zum laufen zu bringen...oder etwas anzuzeigen... ich währe froh wenn einer der 'Könner' mir mal eine PHP und eine template html basteln könnte... ich bin fast am verzweifeln *schrei*
Habe nun wegen der Übersicht und den phpBB.wiki Erläuterungen diesen folgenden Weg gewählt: (ist der auch richtig??? && wie geht es weiter???)

Code: Alles auswählen

$dstgrdgroup_id = 7;

$sql_arr = array(
    'SELECT'    => 'u.user_id, u.group_id, u.username, g.group_id, g.group_name, pf.user_id, pf.pf_dstgrd_id',
    'FROM'        => array(
        USERS_TABLE        => 'u',
        GROUPS_TABLE    => 'g'
        ),
	'LEFT_JOIN'		=> array(
		PROFILE_FIELDS_DATA		=> 'pf'
		),
		
    'WHERE'        => 'u.group_id = $dstgrdgroup_id AND u.group_id = g.group_id AND u.user_id = pf.user_id',
    //'Order by Rand()'           <----?????????
	);

$sql = $db->sql_build_query('SELECT', $sql_arr);

$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
Thx schonmal
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Select_where aus 3 unterschiedlichen tables

Beitrag von gn#36 »

Gibt die Abfrage denn wenigstens das aus was du willst?

Was das Template angeht dürften dich ein paar KB Einträge interessieren: KB:template_system KB:template_syntax.
Ist zwar für phpBB 2, kannst du aber immer noch zum Großteil so machen. Wie du dein HTML Template genau aufbaust solltest du dir bei einem beliebigen ähnlichen Template deines Styles abschauen, am besten nimmst du das ähnlichste was du findest als Basis, änderst es ab und speicherst es unter anderem Namen. Dabei solltest du in dem Forum in dem du testest das rekompilieren veralteter Stylekomponenten unter Serverlast aktivieren so dass du deine Änderungen sehen kannst ohne ständig den Cache leeren zu müssen.

Die wichtigsten Befehle:

Code: Alles auswählen

$template->assign_vars(array('TEMPLATE_VARIABLE' => $wert, 'NAECHSTE_VAR' => $naechster_wert,));
$template->assign_block_vars('blockname', array('VARIABLENLISTE' => $wert));
 
Ein beispielhaftes Template:

Code: Alles auswählen

<!-- INCLUDE overall_header.html -->
<h1>{TEMPLATE_VARIABLE}</h1>
<!-- BEGIN blockname -->
Wert: {blockname.VARIABLENLISTE}
<!-- END blockname -->
ENDE!
<!-- INCLUDE overall_footer.html -->
Für den genauen Seitenaufbau solltest du einen Blick ins Wiki werfen, da ist auch das erstellen neuer Seiten beschrieben.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
DeliCJouS
Mitglied
Beiträge: 20
Registriert: 04.11.2008 20:00

Re: Select_where aus 3 unterschiedlichen tables

Beitrag von DeliCJouS »

Nun habe ich die SQL Abfrage so abgeändert, dass diese im phpmyadmin funktioniert... und die Daten so wie gewünscht ausgibt! Müsste also auch im PHPBB funktionieren...

Das habe ich dann wie in den WIKI's und KB's nachzulesen auch in dem template-Syntax eingebaut und an das Template gesendet... dort wird nun auch die Seite, ohne jeglich SQL etc. Fehler angezeigt ... aber es sind keine Datensätze drin :-(
PHP:

Code: Alles auswählen

$dstgrdgroup_id = 7;

$sql_arr = array(
    'SELECT'    => 'u.user_id, u.username, ug.group_id, f.pf_dstgrd_id',
    'FROM'        => array(
        USERS_TABLE        => 'u',
        USER_GROUP_TABLE    => 'ug'
        ),
	'LEFT_JOIN'		=> array(
		array(
					'FROM'	=> array(PROFILE_FIELDS_DATA_TABLE		=> 'f'),
					'ON'	=> 'f.user_id = u.user_id'
				)
		),
		
    'WHERE'        => 'ug.group_id = ' . $dstgradgroup_id . ' AND ug.user_id = u.user_id AND u.user_id = f.user_id',
    'ORDER_BY'			=> 'RAND()');

$sql = $db->sql_build_query('SELECT', $sql_arr);

$result = $db->sql_query($sql);

	
foreach ($result as $row)
{
    $template->assign_block_vars('dstgrd_list', array(
        'USER'        => $row['username'],
        'DSTGRDID'    => $row['pf_dstgrd_id'],
    ));
}

$db->sql_freeresult($result);	
HTML (Template):

Code: Alles auswählen

<!-- INCLUDE list_header.html -->

<h2>DSTGRD-Liste</h2>

<div class="panel">
<div class="inner"><span class="corners-top"><span></span></span>

	<div class="postbody"><div class="content">
		<!-- BEGIN dstgrd_list -->
    <tr class="<!-- IF block_name.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
        <td>{dstgrd_list.USER}</td>
        <td>{dstgrd_list.DSTGRDID}</td>
    </tr>
    <!-- END dstgrd_list -->
	</div>
  </div>

	<span class="corners-bottom"><span></span></span></div>
</div>
<a  href="#" onclick="window.close(); return false;">{L_CLOSE_WINDOW}</a>

<!-- INCLUDE simple_footer.html -->
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Select_where aus 3 unterschiedlichen tables

Beitrag von gn#36 »

Dein HTML ist nicht sonderlich valide, <tr> gehört zu einer Tabelle, drum herum ist aber keine, ich weiß nicht wie der Browser auf sowas reagiert.

Einen grundsätzlichen Aufbaufehler kann ich aber nicht sehen, wenn die SQL Abfrage funktioniert. Wenn du oberhalb des dargestellten Codes das Template einbindest dann sollte das eigentlich so funktionieren (mal abgesehen von dem HTML Fehler). Bleiben also nur wenige Möglichkeiten:
  • Die SQL Abfrage funktioniert doch nicht so wie sie soll (wenn du die phpMyAdmin Variante hast kannst du auch einfach genau die in dein Skript einbauen, im Zweifel dürfte da aber ein phpBB "Bluescreen" kommen. Wenn natürlich nur keine Daten rauskommen passiert nix. Das kannst du einfach testen indem du ein echo in die Schleife einbaust. Wenn was ausgegeben wird dann kommen Daten an.
  • Der HTML Code wird nicht angezeigt weil er invalide ist, du solltest also eine Tabelle um deinen Block bauen.
  • Die Einbindung des Templates ist falsch (aber in dem Fall wird entweder ein anderes Template angezeigt oder ein "Bluescreen").
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
DeliCJouS
Mitglied
Beiträge: 20
Registriert: 04.11.2008 20:00

Re: Select_where aus 3 unterschiedlichen tables

Beitrag von DeliCJouS »

Wie oberhalb des dargestellten Codes das Template einbinden???


Bei mir ist das so wie im Wiki beschrieben unterhalb des codes:

Code: Alles auswählen

$template->set_filenames(array(
	'body' => 'beispiel_mysite.html')
);
Muss ich das noch anders einbinden?
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“