Onderschriften citeren

Zelf bezig aan een modificatie? Wij kijken graag mee..
Forumregels

LEES: Algemene Voorwaarden. Denk eventueel aan tags (DEV, BETA, RC)!
phpBB3.0.x
Agenia
Berichten: 17
Lid geworden op: 28 feb 2008, 10:49
Contacteer:

Onderschriften citeren

Bericht door Agenia » 15 jul 2009, 13:16

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 ^^

Gebruikersavatar
Ger
Berichten: 4864
Lid geworden op: 03 jan 2006, 22:23
Locatie: 192.68.1.100
Contacteer:

Re: Onderschriften citeren

Bericht door Ger » 16 jul 2009, 10:07

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
Signature van gebruiker Ger:
Stop met emails naar jezelf sturen.
Added Notes, al jouw notities op een rij!
E.e.a. is natuurlijk nog aan te passen qua opmaak en dergelijke, maar dat laat ik aan jouzelf over.

Gebruikersavatar
Paul
Beheerder
Beheerder
Berichten: 20298
Lid geworden op: 23 okt 2003, 11:38
Locatie: Utrecht
Contacteer:

Re: Onderschriften citeren

Bericht door Paul » 16 jul 2009, 10:10

Waarom gebruik je mysql_query, en niet de DBAL zoals hoort?
Verder moet je $gebruiker intvallen, omdat je anders kans op SQL injection hebt.

Gebruikersavatar
Ger
Berichten: 4864
Lid geworden op: 03 jan 2006, 22:23
Locatie: 192.68.1.100
Contacteer:

Re: Onderschriften citeren

Bericht door Ger » 16 jul 2009, 10:21

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.

Gebruikersavatar
Paul
Beheerder
Beheerder
Berichten: 20298
Lid geworden op: 23 okt 2003, 11:38
Locatie: Utrecht
Contacteer:

Re: Onderschriften citeren

Bericht door Paul » 16 jul 2009, 10:44

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.

Gebruikersavatar
Ger
Berichten: 4864
Lid geworden op: 03 jan 2006, 22:23
Locatie: 192.68.1.100
Contacteer:

Re: Onderschriften citeren

Bericht door Ger » 16 jul 2009, 11:43

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:

Code: Selecteer alles

$r = $db->sql_query($q); 
Dan krijg ik een fatal error:

Code: Selecteer alles

Call to a member function sql_query() on a non-object 
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.

Gebruikersavatar
Paul
Beheerder
Beheerder
Berichten: 20298
Lid geworden op: 23 okt 2003, 11:38
Locatie: Utrecht
Contacteer:

Re: Onderschriften citeren

Bericht door Paul » 16 jul 2009, 11:49

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     


Gebruikersavatar
Ger
Berichten: 4864
Lid geworden op: 03 jan 2006, 22:23
Locatie: 192.68.1.100
Contacteer:

Re: Onderschriften citeren

Bericht door Ger » 16 jul 2009, 11:55

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)?

Gebruikersavatar
Paul
Beheerder
Beheerder
Berichten: 20298
Lid geworden op: 23 okt 2003, 11:38
Locatie: Utrecht
Contacteer:

Re: Onderschriften citeren

Bericht door Paul » 16 jul 2009, 12:10

Hmm, die regel was inderdaad weggevallen ja.

Volgens de coding guidelines moet er een spatie na de //, en moet het inderdaad in het engels.

Gebruikersavatar
Ger
Berichten: 4864
Lid geworden op: 03 jan 2006, 22:23
Locatie: 192.68.1.100
Contacteer:

Re: Onderschriften citeren

Bericht door Ger » 16 jul 2009, 12:28

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 

Agenia
Berichten: 17
Lid geworden op: 28 feb 2008, 10:49
Contacteer:

Re: Onderschriften citeren

Bericht door Agenia » 16 jul 2009, 12:36

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 "^^

Gebruikersavatar
Ger
Berichten: 4864
Lid geworden op: 03 jan 2006, 22:23
Locatie: 192.68.1.100
Contacteer:

Re: Onderschriften citeren

Bericht door Ger » 16 jul 2009, 12:39

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?

Agenia
Berichten: 17
Lid geworden op: 28 feb 2008, 10:49
Contacteer:

Re: Onderschriften citeren

Bericht door Agenia » 16 jul 2009, 12:42

Jouw laatste versie, en we gebruiken versie 3.0.4

Gebruikersavatar
Ger
Berichten: 4864
Lid geworden op: 03 jan 2006, 22:23
Locatie: 192.68.1.100
Contacteer:

Re: Onderschriften citeren

Bericht door Ger » 16 jul 2009, 13:06

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?

Agenia
Berichten: 17
Lid geworden op: 28 feb 2008, 10:49
Contacteer:

Re: Onderschriften citeren

Bericht door Agenia » 16 jul 2009, 13:12

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)

Gebruikersavatar
Ger
Berichten: 4864
Lid geworden op: 03 jan 2006, 22:23
Locatie: 192.68.1.100
Contacteer:

Re: Onderschriften citeren

Bericht door Ger » 16 jul 2009, 13:27

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     
 

Agenia
Berichten: 17
Lid geworden op: 28 feb 2008, 10:49
Contacteer:

Re: Onderschriften citeren

Bericht door Agenia » 16 jul 2009, 14:09

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

Gebruikersavatar
Ger
Berichten: 4864
Lid geworden op: 03 jan 2006, 22:23
Locatie: 192.68.1.100
Contacteer:

Re: Onderschriften citeren

Bericht door Ger » 16 jul 2009, 14:19

Graag gedaan. En jij en Paul ook bedankt, ik heb hiervan ook weer wat geleerd. :)

Erik Frèrejean
Berichten: 194
Lid geworden op: 02 apr 2008, 19:29

Re: Onderschriften citeren

Bericht door Erik Frèrejean » 16 jul 2009, 14:24

*kuch*freeresult*kuch*
Na een select query *moet* je altijd de freeresult methode aanroepen binnen de DBAL

Code: Selecteer alles

$db->sql_freeresult($result); 
Tevens gebruik de void generate_text_for_edit ( $text, $uid, $flags) functie om geparsde bbcodes te strippen voor gebruik bij een script.
Proud member of the phpBB Afbeelding

Gebruikersavatar
Paul
Beheerder
Beheerder
Berichten: 20298
Lid geworden op: 23 okt 2003, 11:38
Locatie: Utrecht
Contacteer:

Re: Onderschriften citeren

Bericht door Paul » 16 jul 2009, 14:28

Erik Frèrejean schreef:*kuch*freeresult*kuch*
Na een select query *moet* je altijd de freeresult methode aanroepen binnen de DBAL

Code: Selecteer alles

$db->sql_freeresult($result); 
Hoeft niet persee, de DBAL doet dit aan het eind zelf ook nog als het niet gebeurd is, het is enkel wel zo netjes.

Plaats reactie