Pagina 1 van 2
Onderschriften citeren
Geplaatst: 15 jul 2009, 13:16
door Agenia
Crea-Dome, mijn forum
Hallo allemaal,
Ik kreeg van een lid laatst een idee, om een onderschriften wedstrijd te houden. Sommige leden maken hun onderschriften groots en mooi op, en/of hebben mooie teksten, etc etc. Maar omdat het in de meeste gevallen om de lay-out gaat, moet je daar dus de codes (dus kleur, grootte, [...]) voor hebben om erop te kunnen stemmen. Nu vroeg ik me af... Bestaat/Is er een MOD te maken waarmee je een onderschrift kunt citeren? Of bijvoorbeeld een aangepastte BB-code, zoals je ze kunt aanmaken en aanpassen in het beheerderspaneel? Bijvoorbeeld dat je iets hebt als [onderschrift]Gebruikersnaam, gebruikersID, iets wat de gebruiker kan identificeren[/onderschrift] ?
Ik heb geen idee of dit überhaupt wel mogelijk is, maar als dit zo zou zijn hoor ik het graag ^^
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 10:07
door Ger
Ben een beetje aan het spelen geweest, volgens mij moet je zo een aardig eind komen.
LET OP:
Onderstaande is niet uitvoerig getest, en er is dus
geen enkele garantie! Zorg dus dat je
vóórdat je onderstaande uitvoert, een goede backup van zowel de bestanden als de database hebt!
OPEN
includes/message_parser.php
VIND
Code: Selecteer alles
if (!$this->bbcodes)
{
$this->bbcode_init();
}
global $user;
ZET ERACHTER
Code: Selecteer alles
//START siggie-bbcode
//We beginnen met het zoeken van de BBcode en die in een array stoppen
preg_match_all('#\[sig\](\d+)\[/sig\]#i',$this->message, $m );
//Vervolgens halen we voor alle signature-BBcode de gebruikersnaam en de signature op
foreach($m[1] as $gebruiker){
$q = 'SELECT u.user_id, u.username, u.user_sig
FROM ' . USERS_TABLE . ' u
WHERE u.user_id ='.$gebruiker;
$r = mysql_query($q);
$s = mysql_fetch_assoc($r);
$siggie = $s[user_sig];
$gebruikersnaam = $s[username];
//Met deze gegevens maken we een mooi geheel ervan
$siggie_neat = '[b]Signature van gebruiker '.$gebruikersnaam.':[/b]
'.$siggie;
//Nog even de BBcode fixen:
$siggie_neat = preg_replace("#\[(.+?):(.+?)](.*?)\[/\\1:\\2]#is", "[$1]$3[/$1]", $siggie_neat);
//En natuurlijk moet dat weer terug in het bericht gestopt worden
$this->message = preg_replace('#\[sig\]'.$gebruiker.'\[/sig\]#i', $siggie_neat, $this->message);
//Niet vergeten netjes de loop af te sluiten
}
//EINDE siggie-BBcode
Hiermee kun je een signature in je bericht plaatsen met
[sig]{user_id}[/sig]
en dat verschijnt dan als
E.e.a. is natuurlijk nog aan te passen qua opmaak en dergelijke, maar dat laat ik aan jouzelf over.
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 10:10
door Paul
Waarom gebruik je mysql_query, en niet de DBAL zoals hoort?
Verder moet je $gebruiker intvallen, omdat je anders kans op SQL injection hebt.
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 10:21
door Ger
paul schreef:Waarom gebruik je mysql_query, en niet de DBAL zoals hoort?
Wat is er mis met mysql_query? Da's gewoon een standaard (en volgens mij veelgebruikt) php commando... DBAL is blijkbaar een phpBB-specifiek commando? Die heb ik nog nooit gebruikt, maar dit is ook de eerste keer dat ik iets knutsel via de database van phpBB.
paul schreef:Verder moet je $gebruiker intvallen, omdat je anders kans op SQL injection hebt.
Hoezo? Hij matcht alleen nummers, (
\d+
), als er iets anders staat wordt het niet gematcht en kom je dus ook de loop niet in.
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 10:44
door Paul
Ger schreef:paul schreef:Waarom gebruik je mysql_query, en niet de DBAL zoals hoort?
Wat is er mis met mysql_query? Da's gewoon een standaard (en volgens mij veelgebruikt) php commando... DBAL is blijkbaar een phpBB-specifiek commando? Die heb ik nog nooit gebruikt, maar dit is ook de eerste keer dat ik iets knutsel via de database van phpBB.
Omdat als je nu een andere DBMS gebruikt het niet gaat werken. Als je in phpBB een query wilt draaien, altijd $db->sql_query gebruiken. Deze called de correct *_query function intern, en saved result data.
paul schreef:Verder moet je $gebruiker intvallen, omdat je anders kans op SQL injection hebt.
Hoezo? Hij matcht alleen nummers, (
\d+
), als er iets anders staat wordt het niet gematcht en kom je dus ook de loop niet in.
Nu toevallig wel, maar je hoeft maar net 1 foutje te maken en opeens is het er wel.
Altijd data escapen of intvallen, beter 1 keer teveel als 1 keer te weinig.
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 11:43
door Ger
paul schreef:Omdat als je nu een andere DBMS gebruikt het niet gaat werken. Als je in phpBB een query wilt draaien, altijd $db->sql_query gebruiken. Deze called de correct *_query function intern, en saved result data.
Hmmm... als ik het zo toepas:
Dan krijg ik een fatal error:
Wat doe ik daar mis dan?
paul schreef:Nu toevallig wel, maar je hoeft maar net 1 foutje te maken en opeens is het er wel. Altijd data escapen of intvallen, beter 1 keer teveel als 1 keer te weinig.
Tsja. Ik snap je punt, in zijn algemeenheid heb je ook zeker gelijk, maar de beveiliging zit er nu reeds in. Op een andere plaats dan je zou verwachten, maar knappe gozer die hier misbruik van kan maken hoor.
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 11:49
door Paul
Je moet wel $db globalisen

.
En zoals ik al zei, beter één maal teveel casten is dan eenmaal te weinig
Een betere versie die voldoet aan de coding guidelines grotendeels (Except comments):
Code: Selecteer alles
//START siggie-bbcode
//We beginnen met het zoeken van de BBcode en die in een array stoppen
preg_match_all('#\[sig\](\d+)\[/sig\]#i',$this->message, $match );
global $db;
//Vervolgens halen we voor alle signature-BBcode de gebruikersnaam en de signature op
foreach($match[1] as $user_id)
{
$sql = 'SELECT u.user_id, u.username, u.user_sig
FROM ' . USERS_TABLE . ' u
WHERE u.user_id = ' . (int)$user_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
if(!$row)
{
continue;
}
//Met deze gegevens maken we een mooi geheel ervan
$sigb = '[b]Signature van gebruiker ' . $row['username'] . " :[/b]\n" . $row['user_sign'];
//Nog even de BBcode fixen:
$sign = preg_replace("#\[(.+?):(.+?)](.*?)\[/\\1:\\2]#is", "[$1]$3[/$1]", $siggie_neat);
//En natuurlijk moet dat weer terug in het bericht gestopt worden
$this->message = preg_replace('#\[sig\]' . $row['username'] . '\[/sig\]#i', $siggie_neat, $this->message);
//Niet vergeten netjes de loop af te sluiten
}
//EINDE siggie-BBcode
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 11:55
door Ger
Daarin globalize je $db toch ook niet? Of zie ik dat nu over het hoofd?
En wat is er mis met de comments (of moet dat in het engels)?
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 12:10
door Paul
Hmm, die regel was inderdaad weggevallen ja.
Volgens de coding guidelines moet er een spatie na de //, en moet het inderdaad in het engels.
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 12:28
door Ger
paul schreef:Volgens de coding guidelines moet er een spatie na de //, en moet het inderdaad in het engels.
Hm, die spatie vind ik een beetje over de top, maar goed. Hoe de braces en het inspringen gaat is een kwestie van smaak natuurlijk. En Engels is niet meer dan logisch als je het internationaal wil uitbrengen, maar die ambitie heb ik niet.
Nog een paar kleine puntjes op de "i", want in jouw code staan nu wat oude variabelen van mij en nieuwe van jou door elkaar waardoor het niet meer klopt. Onderstaande werkt iig goed bij mij:
Code: Selecteer alles
//START siggie-bbcode
//We beginnen met het zoeken van de BBcode en die in een array stoppen
preg_match_all('#\[sig\](\d+)\[/sig\]#i',$this->message, $match );
global $db;
//Vervolgens halen we voor alle signature-BBcode de gebruikersnaam en de signature op
foreach($match[1] as $user_id)
{
$sql = 'SELECT u.user_id, u.username, u.user_sig
FROM ' . USERS_TABLE . ' u
WHERE u.user_id = ' . (int)$user_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
if(!$row)
{
continue;
}
//Met deze gegevens maken we een mooi geheel ervan
$sigb = '[b]Signature van gebruiker ' . $row['username'] . " :[/b]\n" . $row['user_sig'];
//Nog even de BBcode fixen:
$sign = preg_replace("#\[(.+?):(.+?)](.*?)\[/\\1:\\2]#is", "[$1]$3[/$1]", $sigb);
//En natuurlijk moet dat weer terug in het bericht gestopt worden
$this->message = preg_replace('#\[sig\]' . $row['user_id'] . '\[/sig\]#i', $sigb, $this->message);
//Niet vergeten netjes de loop af te sluiten
}
//EINDE siggie-BBcode
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 12:36
door Agenia
Dank je voor de support, beiden. Hier kan ik wel veel mee =) Ik moet helaas bekennen dat ik echt atechnisch ben, en ik er dus niet zo veel van snap xD Ik heb in ieder geval na de back-ups dit toegepast, en het werkt nu bijna. Ik krijg alleen vreemde codes. Waarbij ik normaal bij een bepaalde gebruiker
The sweet piano writing down my life
zou moeten krijgen, krijg ik
[i:28tpoevg]The sweet piano writing down my life[/i:28tpoevg]
Ik heb hier geen verstand van, sorry "^^
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 12:39
door Ger
Dat lijkt te zitten in de BBcode, welke voor de signatures reeds is omgezet naar uids. Welke versie van bovenstaande codes heb je toegepast, en welke versie van phpBB gebruik je?
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 12:42
door Agenia
Jouw laatste versie, en we gebruiken versie 3.0.4
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 13:06
door Ger
Ok. Het leek fout te gaan bij het matchen van meerdere BBcodes. Probeer deze eens?
Code: Selecteer alles
//START siggie-bbcode
//We beginnen met het zoeken van de BBcode en die in een array stoppen
preg_match_all('#\[sig\](\d+)\[/sig\]#i',$this->message, $match );
global $db;
//Vervolgens halen we voor alle signature-BBcode de gebruikersnaam en de signature op
foreach($match[1] as $user_id)
{
$sql = 'SELECT u.user_id, u.username, u.user_sig
FROM ' . USERS_TABLE . ' u
WHERE u.user_id = ' . (int)$user_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
if(!$row)
{
continue;
}
//Met deze gegevens maken we een mooi geheel ervan
$sigb = '[b]Signature van gebruiker ' . $row['username'] . " :[/b]\n" . $row['user_sig'];
//Nog even de BBcode fixen:
preg_match("#\[(.+?):(.+?)](.*?)\[/\\1:\\2]#is", $sigb, $sig_uid);
$sign = str_replace(':'.$sig_uid[2], '', $sigb);
//En natuurlijk moet dat weer terug in het bericht gestopt worden
$this->message = preg_replace('#\[sig\]' . $row['user_id'] . '\[/sig\]#i', $sign, $this->message);
//Niet vergeten netjes de loop af te sluiten
}
//EINDE siggie-BBcode
PS @ Paul: hoort dit niet meer bij MOD ontwikkeling thuis?
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 13:12
door Agenia
Hmm, hij werkt nu bij mijn voorbeeld, maar bij ingewikkeldere onderschriften geeft hij nog foutmeldingen (thanks iig nog ^^) Het ziet er misschien een beetje absurd uit, maar we hebben bijvoorbeeld ook dit onderschrift:
[gold]Lac[/gold]rimosa dies illa
Qua resurget ex favilla
Judicandus homo reus
Huic ergo parce Deus
Pie Jesu Domine
Dona eis requiem
[gold]Amen[/gold]
Maar ik krijg dit met de [sig]...[/sig]
Code: Selecteer alles
[center17fdqbdu][size=8017fdqbdu][gold17fdqbdu]Lac[/gold17fdqbdu][color=#ffbf4017fdqbdu]rim[/color17fdqbdu][color=#ffbf4017fdqbdu]osa[/color17fdqbdu] [color=#e7b65717fdqbdu]die[/color17fdqbdu][color=#dfb35f17fdqbdu]s il[/color17fdqbdu][color=#cfae6f17fdqbdu]la[/color17fdqbdu]
[color=#ffbf4017fdqbdu]Qua[/color17fdqbdu] [color=#ffbf4017fdqbdu]res[/color17fdqbdu][color=#e7b65717fdqbdu]urg[/color17fdqbdu][color=#dfb35f17fdqbdu]et e[/color17fdqbdu][color=#cfae6f17fdqbdu]x fa[/color17fdqbdu][color=#c7ac7717fdqbdu]vil[/color17fdqbdu][color=#bfa97f17fdqbdu]la[/color17fdqbdu]
[color=#ffbf4017fdqbdu]Jud[/color17fdqbdu][color=#e7b65717fdqbdu]ica[/color17fdqbdu][color=#dfb35f17fdqbdu]ndu[/color17fdqbdu][color=#cfae6f17fdqbdu]s ho[/color17fdqbdu][color=#c7ac7717fdqbdu]mo r[/color17fdqbdu][color=#bfa97f17fdqbdu]eus[/color17fdqbdu]
[color=#e7b65717fdqbdu]Hui[/color17fdqbdu][color=#dfb35f17fdqbdu]c er[/color17fdqbdu][color=#cfae6f17fdqbdu]go p[/color17fdqbdu][color=#c7ac7717fdqbdu]arc[/color17fdqbdu][color=#bfa97f17fdqbdu]e De[/color17fdqbdu][color=#b7a78717fdqbdu]us[/color17fdqbdu]
[color=#dfb35f17fdqbdu]Pie[/color17fdqbdu] [color=#cfae6f17fdqbdu]Jes[/color17fdqbdu][color=#c7ac7717fdqbdu]u Do[/color17fdqbdu][color=#bfa97f17fdqbdu]min[/color17fdqbdu][color=#b7a78717fdqbdu]e[/color17fdqbdu]
[color=#cfae6f17fdqbdu]Don[/color17fdqbdu][color=#c7ac7717fdqbdu]a ei[/color17fdqbdu][color=#bfa97f17fdqbdu]s re[/color17fdqbdu][color=#b7a78717fdqbdu]qui[/color17fdqbdu][color=#afa48f17fdqbdu]e[/color17fdqbdu][color=#a7a29717fdqbdu]m[/color17fdqbdu]
[gold17fdqbdu]Amen[/gold17fdqbdu][/size17fdqbdu][/center17fdqbdu]
(De [gold] is overigens een custom tag bij ons, deze geeft kleur #ffbf40)
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 13:27
door Ger
Hmm... Dat krijg ik niet gereproduceerd. Alternatiefje, misschien werkt dat wel bij jou:
Code: Selecteer alles
//START siggie-bbcode
//We beginnen met het zoeken van de BBcode en die in een array stoppen
preg_match_all('#\[sig\](\d+)\[/sig\]#i',$this->message, $match );
global $db;
//Vervolgens halen we voor alle signature-BBcode de gebruikersnaam en de signature op
foreach($match[1] as $user_id)
{
$sql = 'SELECT u.user_id, u.username, u.user_sig, user_sig_bbcode_uid
FROM ' . USERS_TABLE . ' u
WHERE u.user_id = ' . (int)$user_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
if(!$row)
{
continue;
}
//Met deze gegevens maken we een mooi geheel ervan
$sigb = '[b]Signature van gebruiker ' . $row['username'] . " :[/b]\n" . $row['user_sig'];
//Nog even de BBcode fixen:
$sign = str_replace(':'.$row['user_sig_bbcode_uid'], '', $sigb);
//En natuurlijk moet dat weer terug in het bericht gestopt worden
$this->message = preg_replace('#\[sig\]' . $row['user_id'] . '\[/sig\]#i', $sign, $this->message);
//Niet vergeten netjes de loop af te sluiten
}
//EINDE siggie-BBcode
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 14:09
door Agenia
Jaaaaaaaaa! =D Ooh, super, hij werkt ^^ Heel erg bedankt ^^ *Blij* Nu kan ik het doorvoeren, heel erg bedankt ^^ Hij doet het nu dus vanaf de simpelste tot de ingewikkeldste onderschriften =D
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 14:19
door Ger
Graag gedaan. En jij en Paul ook bedankt, ik heb hiervan ook weer wat geleerd.

Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 14:24
door Erik Frèrejean
*kuch*freeresult*kuch*
Na een select query *moet* je altijd de freeresult methode aanroepen binnen de DBAL
Tevens gebruik de
void generate_text_for_edit ( $text, $uid, $flags)
functie om geparsde bbcodes te strippen voor gebruik bij een script.
Re: Onderschriften citeren
Geplaatst: 16 jul 2009, 14:28
door Paul
Erik Frèrejean schreef:*kuch*freeresult*kuch*
Na een select query *moet* je altijd de freeresult methode aanroepen binnen de DBAL
Hoeft niet persee, de DBAL doet dit aan het eind zelf ook nog als het niet gebeurd is, het is enkel wel zo netjes.