Query al db

Aperto da lg965, Giovedì - 18 Marzo 2021 - 23:58

0 Utenti e 1 Visitatore stanno visualizzando questa discussione.

lg965

Dovrei fare delle query al db e vorrei usare le pagine (o blocchi) php creati con SimplePortal.
Devo quindi fare l'accesso al db in ogni pagina (o blocco) in modo classico e poi chiudere o esiste una alternativa?
Se esiste (come penso) mi mostrate un'esempio o dove cercarlo?
Non conosco la struttura di smf, ed oltretutto sono un'autodidatta... e per fortuna che c'è questo sito!

Flavio93Zena


Darknico

#2
Se crei un blocco php puoi fare quello che ti pare, quindi anche chiamate al db

Ora non so cosa devi fare esattamente, ma se devi utilizzare qualcosa che smf ha già di pronto, puoi utilizzare ed includere il file SSI.php.
Senza doverti fare tu le query, e senza conoscere le struttura di SMF,  hai varie funzioni che puoi richiamare e tirarti fuori varie cosette, dagli un occhiata ;)
Non supporto privatamente, non risponderei e ci rimarreste male....

lg965

Citazione di: Flavio93Zena il Venerdì - 19 Marzo 2021 - 00:09
Ti linko un blocco poi fai te... https://simpleportal.net/index.php?topic=14168.0

~SP Support :)

Questo blocco (con qualche modifica) potrebbe fare al caso mio se funzionasse... parlano del bug nello stesso topic, in pratica quando c'è un secondo membro nel gruppo, la formattazione va a farsi benedire.
E non capisco come sistemarlo....

Darknico

Forse se ci dici cosa vorresti visualizzare in quel blocco può essere di aiuto.. :)
Non supporto privatamente, non risponderei e ci rimarreste male....

lg965

#5
Volentieri, devo mostrare tutti i membri (potrebbero diventare un centinaio) appartenenti ad uno o più gruppi e un campo personalizzato relativo al membro, quelli infilati nella tabella themes per capirsi.

edit

ho sistemato il blocco preso da SP support adattandolo alle mie esigenze, ho tolto la visualizzazione del gruppo di appartenza in modo da diminuire il numero di righe e non farlo diventare un blocco lunghissimo.
Ora devo aggiungere ad ogni utente il "campo personalizzato del profilo" prelevandolo dalla tabella themes.
Qualche aiuto su come è meglio procedere? (intanto io provo....)



<?php

/**
 * @block Show Members
 * @author Rhode Fey (Sayaka Maizono)
 * @version 1.0.2
*/

/*
Usage:
fill the array with group ids of the groups you want to show.
Example for showing just one group, from group 1;
$groups_to_use = array(1);
Example for showing three groups, from group 1, 3, and 8
$groups_to_use = array(1, 3, 8);
*/

$groups_to_use = array(1);

/*
Usage:
fill the array with member ids you don't want to show up.
Example for hiding one member, user #1
$members_to_ignore = array(1);
Example for hiding multiple members, user #1, #3, and #8
$members_to_ignore = array(1, 3, 8);
*/

$members_to_ignore = array();

/*
 *
*/

global $smcFunc$sourcedir$scripturl$modSettings$txt;

// These are strings for errors...
$txt['no_groups'] = 'No groups have been defined! Please refer to the comments in the Block code!';
$txt['no_members'] = 'No members have been found...';

$groups = array();
foreach (
$groups_to_use as $group)
$groups[] = (int) $group;
$groups array_unique($groups);

$ignored_members = array();
foreach (
$members_to_ignore as $id)
$ignored_members[] = (int) $id;
$ignored_members array_unique($ignored_members);

if (empty(
$groups))
{
echo '
<span class="smalltext" style="color: red;">
'
$txt['no_groups'] . '
</span>'
;

return;
}

$request $smcFunc['db_query']('''
SELECT
mem.id_member, mem.real_name, mem.avatar, mem.id_group, mem.id_post_group, mg.group_name,
a.id_attach, a.attachment_type, a.filename
FROM {db_prefix}members AS mem
LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = mem.id_member)
LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:reg_group_id} THEN mem.id_post_group ELSE mem.id_group END)
WHERE mem.id_group IN ({array_int:groups_to_use}) OR mem.id_post_group IN ({array_int:groups_to_use})'
,
array(
'groups_to_use' => $groups,
'reg_group_id' => 0,
)
);

$member_list = array();
while (
$row $smcFunc['db_fetch_assoc']($request))
{
if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize')
{
$avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' $modSettings['avatar_max_width_external'] . '"' '';
$avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' $modSettings['avatar_max_height_external'] . '"' '';
}
else
{
$avatar_width '';
$avatar_height '';
}

$member_list[$row['id_member']] = array(
'id' => $row['id_member'],
'name' => $row['real_name'],
'link' => '<a href="' $scripturl '?action=profile;u=' $row['id_member'] . '">' $row['real_name'] . '</a>',
'group' => $row['group_name'],
'avatar' => array(
'name' => $row['avatar'],
'image' => $row['avatar'] == '' ? ($row['id_attach'] > '<img src="' . (empty($row['attachment_type']) ? $scripturl '?action=dlattach;attach=' $row['id_attach'] . ';type=avatar' $modSettings['custom_avatar_url'] . '/' $row['filename']) . '" alt="" class="avatar" border="0" />' '') : (stristr($row['avatar'], 'http://') ? '<img src="' $row['avatar'] . '"' $avatar_width $avatar_height ' alt="" class="avatar" border="0" />' '<img src="' $modSettings['avatar_url'] . '/' htmlspecialchars($row['avatar']) . '" alt="" class="avatar" border="0" />'),
'href' => $row['avatar'] == '' ? ($row['id_attach'] > ? (empty($row['attachment_type']) ? $scripturl '?action=dlattach;attach=' $row['id_attach'] . ';type=avatar' $modSettings['custom_avatar_url'] . '/' $row['filename']) : '') : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' $row['avatar']),
'url' => $row['avatar'] == '' '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' $row['avatar'])
),
);
}
$smcFunc['db_free_result']($request);

if (empty(
$member_list))
{
echo '
<span class="smalltext" style="color: red;">
'
$txt['no_members'] . '
</span>'
;

return;
}

ksort($member_list);
$member_count count($member_list);
$count 0;

echo 
'
<table class="sp_fullwidth">'
;

foreach (
$member_list as $member)
{
if (!empty($ignored_members))
if (in_array($member['id'], $ignored_members))
return;

$member_count != ++$count;

echo '
<tr>
<td class="sp_staff sp_center">'
,  '<a href="' $scripturl '?action=profile;u=' $member['id'] . '" alt="' $member['name'] . ' width="40" /></a>''</td>
<td class="sp_staff_info">
'
$member['link'], ' <br />

</td>
</tr>'
;


}
echo '
</table>'
;
?>




Flavio93Zena

Questo chiama i custom fields in display.template.php
// Any custom fields for standard placement?
if (!empty($message['member']['custom_fields']))
{
foreach ($message['member']['custom_fields'] as $custom)
if (empty($custom['placement']) || empty($custom['value']))
echo '
<li class="custom">', $custom['title'], ': ', $custom['value'], '</li>';
}

Per cui ho idea che sarà qualcosa tipo $member['custom_fields'], ma usando l'ID specifico del custom field che ti interessa. Il come esattamente al momento non ho davvero testa su come tirarlo fuori.

lg965

#7
Si mi pare una buona idea quella di vedere come fa altrove a tirare fuori i dati, ora ci ragiono.

Nel frattempo io mi sto scervellando cosi



$request = $smcFunc['db_query']('', '
SELECT
mem.id_member, mem.real_name, mem.avatar, mem.id_group, mem.id_post_group, mg.group_name,
t.id_member, t.variable, t.value
FROM {db_prefix}members AS mem
LEFT JOIN (db_prefix)themes AS t ON (t.id_member = mem.id_member)
LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:reg_group_id} THEN mem.id_post_group ELSE mem.id_group END)
WHERE mem.id_group IN ({array_int:groups_to_use}) AND t.variable="cust_aircra" OR mem.id_post_group IN ({array_int:groups_to_use}) AND t.variable="cust_aircra"',
array(
'groups_to_use' => $groups,
'reg_group_id' => 0,
)
);



cosiderando che i dati che mi interessano sono quelli cerchiati in figura allegata, ma non funziona... "You have an error in your SQL syntax"

lg965

#8
Un passo avanti l'ho fatto, non ho più il SQL syntax error ma "The database value you're trying to insert does not exist: cust_aircra"

Eppure c'è come visibile dallo screenshot... è evidente che sbaglio ancora qualcosa...



$request = $smcFunc['db_query']('', '
SELECT
mem.id_member, mem.real_name, mem.id_group, mem.id_post_group, mg.group_name,
t.id_member,t.variable,t.value
FROM {db_prefix}members AS mem
LEFT JOIN {db_prefix}themes AS t ON (t.id_member = mem.id_member)
LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:reg_group_id} THEN mem.id_post_group ELSE mem.id_group END)
WHERE mem.id_group IN ({array_int:groups_to_use}) AND t.variable IN ({string:cust_aircra} OR mem.id_post_group IN ({array_int:groups_to_use}) AND t.variable IN ({string:cust_aircra}',
array(
'groups_to_use' => $groups,
'reg_group_id' => 0,
)
);




EDIT

Studiando il problema (grazie a "W3schools.com") ho risolto.

cosi funziona



$request = $smcFunc['db_query']('', '
SELECT
mem.id_member, mem.real_name, mem.id_group, mem.id_post_group, mg.group_name,
t.id_member,t.variable,t.value
FROM {db_prefix}members AS mem
LEFT JOIN {db_prefix}themes AS t ON (t.id_member = mem.id_member)
LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = CASE WHEN mem.id_group = {int:reg_group_id} THEN mem.id_post_group ELSE mem.id_group END)
WHERE mem.id_group IN ({array_int:groups_to_use}) AND t.variable = "cust_aircra" OR mem.id_post_group IN ({array_int:groups_to_use}) AND t.variable = "cust_aircra"',
array(
'groups_to_use' => $groups,
'reg_group_id' => 0,
)
);



ora devo dare una sistemata alla formattazione html del blocco

Discussioni simili (3)