Strona 1 z 2

PHP w sygnaturze

: 20 kwietnia 2009, 22:56
autor: Nosek
Witam,

Jestem administratorem C&N Servers i ostatnio chcieliśmy założyć forum. Użyliśmy oczywiście do tego najnowszej paczki phpbb itp itd. Forum naturalnie sprawuje się świetnie. Jest proste w obsłudze i przejrzyste. Niemniej jednak coś jest nie tak...

Jako, że serwer, którego jestem administratorem, dotyczy gry MMORPG, to stworzyłem dzisiaj sygnaturki dla graczy. Skrypt PHP sprawdza nick gracza i tworzy sygnature na obrazku PNG.

Przykład

Kod: Zaznacz cały

[url]http://cnots.pl/signature.php?character=Nym&image=0[/url]
Stworzona została oczywiście z myślą o forum, w którym to użytkownicy wkleili by własne statystyki w podpis. Jednak nie jest to możliwe (przynajmniej ja nie wiem jak), żeby skrypt PHP pojawił się w sygnaturze. Chyba, że ja coś robię źle ;/ Czy jest więc jakaś możliwość, by dodać do podpisu kod PHP wyświetlający właśnie tą sygnaturkę? Lub czy jest może jakaś inna możliwość utworzenia takiego czegoś?

Pozdrawiam,
Nosek, C&N Team

Re: PHP w sygnaturze

: 21 kwietnia 2009, 15:49
autor: jaroslw
Powinien zainteresować Cię temat phpBB3 Dynamic signature, a w szczególnośći pkt. 3.

Re: PHP w sygnaturze

: 22 kwietnia 2009, 00:19
autor: Nosek
Wszystko ładnie pięknie - dobrze działa, ale...

Mój skrypt wygląda następująco:

Kod: Zaznacz cały

www.cnots.pl/signature.png/?character=Nosek&image=0

Co z tego wynika? Że samo przekierowanie folderu signature.png na plik index.php nie daje mi kompletnie nic ze względu na dynamiczną sygnaturkę w zależności od parametrów character= ~ oraz image= ~.

Co robić?

Re: PHP w sygnaturze

: 22 kwietnia 2009, 15:05
autor: jaroslw
Dodaj do swojego pliku .htaccess:

Kod: Zaznacz cały

RewriteEngine on
RewriteRule ^signature.png$ signature.php
Wstawiając obrazek do podpisu dodawaj go w sposób:

Kod: Zaznacz cały

[img]http://www.cnots.pl/signature.png?character=Nosek&image=0[/img]
Parser phpBB przepuszcza takie adresy. Jeśli dalej nie będzie działać, wstaw kod pliku signature.php. Testowałem u siebie na przykładzie kodu z odnośnika podanego w moim pierwszym poście i działało ;)

Re: PHP w sygnaturze

: 23 kwietnia 2009, 11:37
autor: Nosek
Po dodaniu pliku .htaccess nie ładuje mi w ogóle strony :| A tak przy okazji, htaccess do folderu signature.png, tak?

Re: PHP w sygnaturze

: 23 kwietnia 2009, 14:15
autor: jaroslw
Do pliku .htaccess z głównego katalogu forum. Wstaw treść tego pliku. Ta regułka pozwala odwołać się do pliku signature.php poprzez inne rozszerzenie (.png) przez co obrazek jest przepuszczany przez parser.

Re: PHP w sygnaturze

: 23 kwietnia 2009, 14:29
autor: Nosek
Forum znajduje się na http://kolo1pzw.home.pl/pliki/forum/
Strona i folder signature.png znajduje się na moim hoście http://cnots.pl (http://212.122.214.139/cnots/gesior/)

Poradziłem sobie z .htaccess - wyświetla obrazek. ALE nie pobiera danych z bazy ;/ daje host 212.122.214.139, user i hasło jak trzeba, wybieram bazę... Może nie ma uprawnień w bazie? Jak w takim razie takowe nadać?

Kod: Zaznacz cały

<?PHP

    class signature
    {
        
        # v-- CONFIGURATION BELOW --v #
        var $config = array
        (
            'database'    => array ( "212.122.214.139" , "root" , "************************" , "*****" ),
            'vocations'   => array ( "No Vocation" , "Sorcerer" , "Druid" , "Paladin" , "Knight" , "Master Sorcerer" , "Elder Druid" , "Royal Paladin" , "Elite Knight" ),
            'towns'       => array ( 1 => "Ab'Dendriel", 2 => "Kazordoon", 3 => "Thais", 4 => "Venore", 5 => "Carlin", 6 => "Ankrahmun", 7 => "Darashia", 8 => "Port Hope", 9 => "Edron", 11 => "Greenshore", 15 => "Yalahari" ),
            'groups'      => array ( 2 => "Tutor" , 3 => "Senior Tutor" , 4 => "Gamemaster" , 5 => "Community Manager" , 6 => "God" ),
            'hidechars'   => array ( 'Account Manager' , 'Rook Sample' , 'Sorcerer Sample' , 'Druid Sample' , 'Paladin Sample' , 'Knight Sample' ),
            'backgrounds' => array ( 'signatures/blue' , 'signatures/red' , 'signatures/green' ),
            'color'       => "#FFFFFF",
            'statuscolor' => array ( "#358f0d" /* online */ , "#c40808" /* offline */ ),
            'font'        => "signatures/arial.ttf",
            'size'        => array ( 2 /* without font */ , 8 /* with font */ )
        );
        # ^-- CONFIGURATION ABOVE --^ #
        
        
        
        
        
        // Database functions.
        function connectDatabase ( $database ) { @mysql_connect ( $database[0] , $database[1] , $database[2] ); @mysql_select_db ( $database[3] ); }
        function query ( $query ) { return @mysql_query ( $query ); }
        function fetchArray ( $query ) { return @mysql_fetch_array ( $query ); }
        function secure ( $query ) { return @mysql_real_escape_string ( $query ); }
        function numRows ( $query ) { return @mysql_num_rows ( $query ); }
        
        
        function convertHex ( $hex )
        {
            
            $hex   = ereg_replace ( "#" , "" , $hex );
            $color = array();
        
            if ( strlen ( $hex ) == 6 ):
            
                $color['r'] = hexdec ( substr ( $hex , 0 , 2 ) );
                $color['g'] = hexdec ( substr ( $hex , 2 , 2 ) );
                $color['b'] = hexdec ( substr ( $hex , 4 , 2 ) );
            
            endif;
            
            return $color;
            
        }


        // Signature functions.
        function character ( $character )
        {
            
            // Define presets.
            $query     = "SELECT `id` , `account_id` , `group_id` , `name` , `sex` , `promotion` , `vocation` , `town_id` , `rank_id` , `online` , `level` , `lastlogin` FROM `players` WHERE `name` = '{$character}'";
            $fetchRow  = $this -> fetchArray ( $this -> query ( $query ) );
            $numRows   = $this -> numRows    ( $this -> query ( $query ) );
            $rank      = $this -> fetchArray ( $this -> query ( "SELECT `guild_id` , `name` FROM `guild_ranks` WHERE `id` = '{$fetchRow[rank_id]}'" ) );
            $guild     = $this -> fetchArray ( $this -> query ( "SELECT `name` FROM `guilds` WHERE `id` = '{$rank[guild_id]}'" ) );
            $premium   = $this -> fetchArray ( $this -> query ( "SELECT `premdays` FROM `accounts` WHERE `id` = '{$fetchRow[account_id]}'" ) );
            
            // Define certain arrays into one variable.
            $arrays['name']        = ( addslashes ( $fetchRow["name"] ) );
            $arrays['status']   = ( $fetchRow['online'] == 1 ? ' ONLINE' : 'OFFLINE' );
            $arrays['gender']   = ( $fetchRow['sex'] == 1 ? 'Male' : 'Female' );
            $arrays['vocation'] = ( $fetchRow['group_id'] < 2 ) ? "Profession: " . ( $fetchRow['promotion'] != 0 ? $this -> config['vocations'][$fetchRow['vocation'] + ( 4 * $fetchRow['promotion'] )] : $this -> config['vocations'][$fetchRow['vocation']] ) . "\q" : NULL;
            $arrays['guild']    = ( ( $fetchRow['rank_id'] > 0 and $fetchRow['group_id'] < 2 ) ? "Guild: " . ( $fetchRow['sex'] == 1 ? 'He' : 'She' ) . " is " . $rank['name'] . " of the " . $guild['name'] . "\q" : NULL );
            $arrays['position'] = ( $fetchRow['group_id'] > 1 ? "Position: " . $this -> config['groups'][$fetchRow['group_id']] . "\q" : NULL );
            $arrays['lastlogin']= ( $fetchRow['lastlogin'] != 0 ? date ( "M d Y, H:i:s" , $fetchRow['lastlogin'] ) : 'Never logged in' );
            $arrays['premium']  = ( ( $fetchRow['group_id'] < 2 ) ? $premium['premdays'] > 0 ? '(Premium Account)' : '(Free Account)' : NULL );
            $arrays['level']    = ( $fetchRow['group_id'] < 2 ? "Level: " . $fetchRow['level'] . "\q" : NULL );
            
            // Showable fields (\q equals new line, had to create my own shortcut as I clear all whitespaces further down in the script).
            $return = "
                Name:         {$arrays[name]}     {$arrays[premium]}            \q
                Sex:         {$arrays[gender]}                                \q
                            {$arrays[level]}
                            {$arrays[vocation]}
                Residence:     {$this -> config[towns][$fetchRow[town_id]]}    \q
                            {$arrays[guild]}
                            {$arrays[position]}
                Last Login: {$arrays[lastlogin]}
            ";
            
            // Make certain fields bold.
            $bolds = "Name: \nSex: \n" . ( $fetchRow['group_id'] < 2 ? "Level: \n" : NULL ) . ( ( $fetchRow['group_id'] < 2 ) ? "Profession: \n" : NULL ) . "Residence: \n" . ( ( $fetchRow['rank_id'] > 0 and $fetchRow['group_id'] < 2 ) ? "Guild: \n" : NULL ) . ( $fetchRow['group_id'] > 1 ? "Position: \n" : NULL ) . "Last Login:";
            
            // Return output.
            if ( $numRows == 1 and !in_array ( $fetchRow['name'] , $this -> config['hidechars'] ) )
                return $return . "|||" . $bolds . "|||" . $arrays['status'];
            else
                return "A character with that name does not exist.";
            
        }
        
        // Create a function to generate the signature.
        function generate ( $character , $background )
        {
            
            // Connect to the database.
            $this -> connectDatabase ( $this -> config['database'] );
            $split = explode ( "|||" , $this -> character ( $this -> secure ( $character ) ) );
            
            if ( strtolower ( substr ( $split[2] , -5 , 1 ) ) == 'n' )
                $statuscolor = $this -> convertHex ( $this -> config['statuscolor'][0] );
            else
                $statuscolor = $this -> convertHex ( $this -> config['statuscolor'][1] );
        
            header ( "Content-type: image/png" );
            
            // Check if the background exists, if not - create one.
            if ( file_exists ( "{$this -> config[backgrounds][$background]}.png" ) != 1 ):
                              
                $image = imagecreatetruecolor ( 500 , 120 );
                imagefilledrectangle ( $image , 0 , 0 , 500 , 120 , imagecolorallocate ( $image , 255 , 255 , 255 ) );
                $color = imagecolorallocate ( $image , 0 , 0 , 0 );
                imagesetthickness ( $image , 1 );
                imagerectangle ( $image , 0 , 0 , 499 , 119 , $color );
                $split[0] = "The requested image does not exist.";
                $split[1] = NULL;
                
            else:
            
                $image = imagecreatefrompng ( $this -> config['backgrounds'][$background] . ".png" );
                $color     = $this -> convertHex ( $this -> config['color'] );
                   
            endif;
            
            $content = explode ( "\q" , str_replace ( array ( "\n" , "\r" , "\t" , "\o" , "\xOB" ) , '' , $split[0] ) );
            $bolds   = explode ( "\n" , str_replace ( array ( "\r" , "\t" , "\o" , "\xOB" ) , '' , $split[1] ) );
            
            // Print text.
            if ( $this -> config['font'] != "" ):
                for ( $i = 0; $i <= count ( $content ); $i++ ):
                    $o = ( $i == 0 ) ? 2.4 : $i + 2.4;
                    imagettftext ( $image , $this -> config['size'][1] , 0 , 7, 12 * $o , imagecolorallocate ( $image , $color['r'] , $color['g'] , $color['b'] ) , "./{$this -> config[font]}" , "    " . $content[$i] );
                endfor;
                for ( $i = 0; $i <= count ( $bolds ); $i++ ):
                    $o = ( $i == 0 ) ? 2.4 : $i + 2.4;
                    imagettftext ( $image , $this -> config['size'][1] , 0 , 8, 12 * $o , imagecolorallocate ( $image , $color['r'] , $color['g'] , $color['b'] ) , "./{$this -> config[font]}" , "    " . $bolds[$i] );
                endfor;
                if ( $split[0] != "The requested image does not exist." ):
                    imagettftext ( $image , $this -> config['size'][1] , 0 , 250 , 10+round ( ( imagesy ( $image ) / 2 ) - ( imagefontheight ( $this -> config['size'][1] ) / 2 ) ) , imagecolorallocate ( $image , 0 , 0 , 0 ) , "./{$this -> config[font]}" , $split[2] );
                    imagettftext ( $image , $this -> config['size'][1] , 0 , 249 , 10+round ( ( imagesy ( $image ) / 2 ) - ( imagefontheight ( $this -> config['size'][1] ) / 2 ) )-1 , imagecolorallocate ( $image , $statuscolor['r'] , $statuscolor['g'] , $statuscolor['b'] ) , "./{$this -> config[font]}" , $split[2] );
                endif;
            else:
                for ( $i = 0; $i <= count ( $content ); $i++ ):
                    $o = ( $i == 0 ) ? 1.5 : $i + 1.5;
                    imagestring ( $image, $this -> config['size'][0] , -4, 12 * $o, "    " . $content[$i], imagecolorallocate ( $image , $color['r'] , $color['g'] , $color['b'] ) );
                endfor;
                for ( $i = 0; $i <= count ( $bolds ); $i++ ):
                    $o = ( $i == 0 ) ? 1.5 : $i + 1.5;
                    imagestring ( $image, $this -> config['size'][0] , -3, 12 * $o, "    " . $bolds[$i], imagecolorallocate ( $image , $color['r'] , $color['g'] , $color['b'] ) );
                endfor;
                if ( $split[0] != "The requested image does not exist." ):
                    imagestring ( $image, $this -> config['size'][0] , 250, round ( ( imagesy ( $image ) / 2 ) - ( imagefontheight ( $this -> config['size'][1] ) / 2 ) )-1, $split[2], imagecolorallocate ( $image , 0 , 0 , 0 ) );
                    imagestring ( $image, $this -> config['size'][0] , 249, round ( ( imagesy ( $image ) / 2 ) - ( imagefontheight ( $this -> config['size'][1] ) / 2 ) )-2, $split[2], imagecolorallocate ( $image , $statuscolor['r'] , $statuscolor['g'] , $statuscolor['b'] ) );
                endif;
            endif;
                
            imagepng ( $image );
            imagedestroy ( $image );
            
        }
        
    }
    
    
    
    
    $signature = new signature();
    
    if ( !empty ( $_GET ) ):
    
        $signature -> generate ( $_GET['character'] , $_GET['image'] );
        
    endif;
    
?>

Re: PHP w sygnaturze

: 23 kwietnia 2009, 14:59
autor: jaroslw
W takim razie utwórz plik .htaccess ale na serwerze gdzie znajduje się strona.

Re: PHP w sygnaturze

: 23 kwietnia 2009, 15:03
autor: Nosek
to nie wczytuje się w ogóle strona wtedy ;/

Kod: Zaznacz cały

[img]http://kolo1pzw.home.pl/pliki/forum/signature.png?character=Cong&image=2[/img]
Obrazek

Wchodzi obrazek teraz już do sygnaturki, ale nie pobiera danych z bazy...

Re: PHP w sygnaturze

: 23 kwietnia 2009, 15:18
autor: jaroslw
Adres obrazka musi wyglądać następująco: http://cnots.pl/signature.png?character=Cong&image=2

Re: PHP w sygnaturze

: 23 kwietnia 2009, 15:20
autor: Nosek
Ale nie działa u mnie .htaccess ;s Dlatego dałem pliki na serwer forum, bo tam .htaccess jest zrobiony i obrazek normalnie jest wyświetlany. Jednak nie pobiera danych z bazy... czemu? ;s Host daje taki jak moje ip:212.122.214.139, baze uzupelniam, usera tez... czego w takim razie nei zrobiłem? ;s

Re: PHP w sygnaturze

: 23 kwietnia 2009, 15:24
autor: jaroslw
Może jest wyłączony dostęp do bazy z zewnętrznych serwerów? Skontaktuj się z administracją serwera.

Re: PHP w sygnaturze

: 23 kwietnia 2009, 15:38
autor: Nosek
Tak, jest wyłączony - już wszystko wiem. No ale w takim razie, czemu na localhoscie po wpisaniu w host mojego ip: 212.122.214.139 nie ładuje charow? Gdzie mam ustawić zezwolenie na wysylanie danych?

Re: PHP w sygnaturze

: 23 kwietnia 2009, 17:02
autor: jaroslw
Możliwość włączenia zdalnego dostępu ma tylko administracja hostingu.

Re: PHP w sygnaturze

: 23 kwietnia 2009, 19:09
autor: Nosek
Mówie o moim prywatnym PC.