PHP & MySQL проблем енкодинга

Discussion in 'PHP' started by ^_WhitE_DeMoN_^, 21 Apr 2010.

  1. ^_WhitE_DeMoN_^

    Joined:
    1 Mar 2009
    Messages:
    102
    Likes Received:
    10
    Reputations:
    0
    Юзаю Mihalism Multi Forum Host + phpBB 3.0.7-PL1, пытаюсь передать базе (MySQL, COLLATE=utf8_bin) данныe на кириллице, но как не крути (енкодинг базы и файлов) - всегда вылазят йероглифы :mad:

    Подозирою что виноваты скрипты работы с базой...
    Но знаний по MySQL не хватает.

    database.php:
    PHP:
    <?php

        
    class mfhclass_mysql_driver
        
    {
            function 
    connect($host "localhost"$username$password$database$new_link NULL)
            {
                global 
    $mfhclass;
                
    $connection_id mysql_connect($host$username$passwordtrue);
                
                if (
    is_resource($connection_id) == false) {
                    
    $this->error();
                } else {
                    if (
    mysql_select_db($database$connection_id) == false) {
                        
    $this->error();
                    } else {
                        if (
    is_resource($this->root_connection) == false) {
                            
    $this->root_connection $connection_id;
                        } else {
                            if (
    $mfhclass->funcs->is_null($new_link) == false) {
                                if (
    is_array($this->alt_connections) == true) {
                                    
    $this->alt_connections = array();
                                }
                                
    $this->alt_connections[$new_link] = $connection_id;
                            }
                        }
                    }
                }
                
                return 
    $connection_id;
            }

            function 
    close()
            {
                if (
    is_resource($this->root_connection) == true) {
                    
    mysql_close($this->root_connection);
                }
                
                if (
    is_array($this->alt_connections) == true) {
                    foreach (
    $this->alt_connections as $id => $connection) {
                        
    mysql_close($this->alt_connections[$id]);
                    }
                }
            }
                
            function 
    set_database_connection($database_id 1) {
                global 
    $mfhclass;
                if (
    $database_id != && $mfhclass->funcs->is_null($database_id) == false) {
                    
    $database_info $this->fetch_array($this->query("SELECT * FROM `mfh_forum_databases` WHERE `database_id` = '{$database_id}';"));
                    
    $this->connect($database_info['sql_host'], $database_info['sql_username'], $database_info['sql_password'], $database_info['sql_database'], $database_info['database_id']);
                }
            }

            function 
    query($query$connection_id NULL)
            {
                global 
    $mfhclass;
                if (
    is_resource($this->root_connection) == false) {
                    
    $this->connect($mfhclass->info->config['sql_host'], $mfhclass->info->config['sql_username'], $mfhclass->info->config['sql_password'], $mfhclass->info->config['sql_database']);
                }
                
                
    $query str_replace("<# QUERY_LIMIT #>", ((($mfhclass->info->current_page $mfhclass->info->config['max_results']) - $mfhclass->info->config['max_results']).", {$mfhclass->info->config['max_results']}"), $query);
                if (
    $mfhclass->info->config['sql_tbl_prefix'] != "mmh_" && $mfhclass->funcs->is_null($mfhclass->info->config['sql_tbl_prefix']) == false){
                    
    $query preg_replace("/mmh_(\S+?)([\s\.,]|$)/", ($mfhclass->info->config['sql_tbl_prefix']."\\1\\2"), $query);
                }
                
                if (
    $mfhclass->funcs->is_null($connection_id) == false && $connection_id != 1) {
                    
    $this->set_database_connection($connection_id);
                    if (
    is_resource($this->alt_connections[$connection_id]) == false) {
                        
    $this->error($query"Unknown alternate connection id: {$connection_id}");
                    }
                }
                
                
    $this->query_result mysql_query($query, (($mfhclass->funcs->is_null($connection_id) == false && $connection_id != 1) ? $this->alt_connections[$connection_id] : $this->root_connection));

                if (
    $this->query_result == false) {
                    
    $this->error($query);
                } else {
                    return 
    $this->query_result;
                }
            }

            function 
    total_rows($query_id)
            {
                return 
    mysql_num_rows($query_id);
            }

            function 
    fetch_array($query_id$result_type MYSQL_ASSOC)
            {
                return 
    mysql_fetch_array($query_id$result_type);
            }

            function 
    error_number()
            {
                global 
    $mfhclass;
                return ((
    $mfhclass->funcs->is_null(mysql_error()) == false) ? mysql_errno() : "Unknown Error Number");
            }

            function 
    error($query "No Query Executed"$custom_error NULL)
            {
                global 
    $mfhclass;
                
    $error_message = (($mfhclass->funcs->is_null($custom_error) == false) ? $custom_error mysql_error());
                
    $error_html "\t\t\t<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">
                <html>
                    <head>
                        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />
                        <title>MySQL Error</title>
                        <style type=\"text/css\">
                                * { font-size: 100%; margin: 0; padding: 0; }
                            body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 75%; margin: 10px; background: #FFFFFF; color: #000000; }
                            a:link, a:visited { text-decoration: none; color: #005fa9; background-color: transparent; }
                            a:active, a:hover { text-decoration: underline; }                        
                            textarea { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; border: 1px dashed #000000; background: #FFFFFF; padding: 5px; background: #f4f4f4; }
                        </style>
                    </head>
                    <body>
                        <p>
                            <b>MySQL Driver Error</b>
                            <br /><br />
                            A MySQL error has occurred. 
                            Please copy the output shown below and email it immediately to <a href=\"mailto:
    {$mfhclass->input->server_vars['server_admin']}\">{$mfhclass->input->server_vars['server_admin']}</a>.
                            <br /><br />
                            <textarea readonly=\"readonly\" rows=\"15\" cols=\"40\" style=\"width:500px;\">Time Encountered: "
    .date("F j, Y, g:i:s a")."\nIP Address: {$mfhclass->input->server_vars['remote_addr']}\rError: {$error_message}\nError Number: ".$this->error_number()."\nQuery Executed: {$query}</textarea>
                        </p>        
                    </body>
                </html>"
    ;
                exit(
    $error_html);
                return;
            }
        }

    ?>
    и часть от install_queries.php (импортируемые данные в ДБ):

    PHP:
    <?php
        
    ...
        
        
    $mfhclass->db->install_queries[] = "DROP TABLE IF EXISTS `{$mfhclass->input->post_vars['access_name']}_acl_groups`;";

    ...

        
    $mfhclass->db->install_queries[] = "CREATE TABLE `{$mfhclass->input->post_vars['access_name']}_acl_groups` (
          `group_id` mediumint(8) unsigned NOT NULL default '0',
          `forum_id` mediumint(8) unsigned NOT NULL default '0',
          `auth_option_id` mediumint(8) unsigned NOT NULL default '0',
          `auth_role_id` mediumint(8) unsigned NOT NULL default '0',
          `auth_setting` tinyint(2) NOT NULL default '0',
          KEY `group_id` (`group_id`),
          KEY `auth_opt_id` (`auth_option_id`),
          KEY `auth_role_id` (`auth_role_id`)
        ) CHARACTER SET `utf8` COLLATE `utf8_bin`
          ENGINE=MyISAM ;"
    ;

        
    $mfhclass->db->install_queries[] = "INSERT INTO `{$mfhclass->input->post_vars['access_name']}_acl_groups` (`group_id`, `forum_id`, `auth_option_id`, `auth_role_id`, `auth_setting`) VALUES (1, 0, 85, 0, 1);";

    ...

    ?>
    Если в VALUES есть кириллица - она записывается йероглифами...

    Спасибо что прочли до конца =) Сейчас - ПОМОГИТЕ !
     
  2. Byte_

    Byte_ Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    143
    Likes Received:
    34
    Reputations:
    2
    честно говоря читать весь код не стал, просто была проблема с кодировкой в связке phpbb3 и самописного скрипта, решил с помощью iconv результат запроса из базы.
     
  3. ZnikiR

    ZnikiR Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    21
    Reputations:
    -5
    1 попробуй в самом документе
    PHP:
    <?php
    header
    ("Content-Type: text/html; charset=utf-8"); 
    ?>
    +
    перед перед записью в бд (я делаю при конекте)
    выполни запрос
    $query= "SET NAMES utf8";
    $result = mysql_query($query) or die("Query failed : " . mysql_error());

    Обязательно отпишись
     
    #3 ZnikiR, 21 Apr 2010
    Last edited: 21 Apr 2010
    2 people like this.
  4. ^_WhitE_DeMoN_^

    Joined:
    1 Mar 2009
    Messages:
    102
    Likes Received:
    10
    Reputations:
    0
    Насколько знаю - лишняя нагрузка на сервер...
    Но опять вариант, хоть корявый
     
  5. ^_WhitE_DeMoN_^

    Joined:
    1 Mar 2009
    Messages:
    102
    Likes Received:
    10
    Reputations:
    0
    Помоему решил проблем (еще тестирую)

    database.php
    PHP:
    ...
            function 
    connect($host "localhost"$username$password$database$new_link NULL)
            {
                global 
    $mfhclass;
                
    $connection_id mysql_connect($host$username$passwordtrue);
                
                if (
    is_resource($connection_id) == false) {
                    
    $this->error();
                } else {
                    if (
    mysql_select_db($database$connection_id) == false) {
                        
    $this->error();
                    } else {
                        @
    mysql_query("SET NAMES 'utf8'"$connection_id);
                        if (
    is_resource($this->root_connection) == false) {
                            
    $this->root_connection $connection_id;
                        } else {
                            if (
    $mfhclass->funcs->is_null($new_link) == false) {
                                if (
    is_array($this->alt_connections) == true) {
                                    
    $this->alt_connections = array();
                                }
                                
    $this->alt_connections[$new_link] = $connection_id;
                            }
                        }
                    }
                }
                
                return 
    $connection_id;
            }

            function 
    close()
    ...
    Спасибо ZnikiR