Seite 1 von 2

Select_where aus 3 unterschiedlichen tables

Verfasst: 02.11.2009 21:34
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

Re: Select_where aus 3 unterschiedlichen tables

Verfasst: 02.11.2009 23:28
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

Re: Select_where aus 3 unterschiedlichen tables

Verfasst: 03.11.2009 20:02
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...

Re: Select_where aus 3 unterschiedlichen tables

Verfasst: 04.11.2009 12:35
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.

Re: Select_where aus 3 unterschiedlichen tables

Verfasst: 04.11.2009 22:12
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ß

Re: Select_where aus 3 unterschiedlichen tables

Verfasst: 11.11.2009 20:34
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

Re: Select_where aus 3 unterschiedlichen tables

Verfasst: 12.11.2009 00:55
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.

Re: Select_where aus 3 unterschiedlichen tables

Verfasst: 12.11.2009 20:36
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 -->

Re: Select_where aus 3 unterschiedlichen tables

Verfasst: 12.11.2009 22:00
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").

Re: Select_where aus 3 unterschiedlichen tables

Verfasst: 13.11.2009 18:20
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?