К вопросу о кодировке базы

Discussion in 'PHP' started by serg-php, 9 Nov 2008.

  1. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Был скриптец буржуйский. Решил его использовать для работы с русским языком.

    Раньше был хостинг с кодировкой ср1251.

    Все работало.

    По определенным причинам пришлось поменять хостера, а там кодировка утф-8

    Начались проблемы с кодировкой. Скриптом дампером
    перенес базу с кодировкой ср1251 и принудительным ее воостановлением в кодировке утф

    Но проблема не решилась!


    Советуют сделать
    PHP:
    mysql_query("set CHARACTER SET cp1251");
    Но я не знаю точно, куда его вставить?

    Есть файл коннекта

    PHP:





    <?php


    define
    ('DB_SERVER','localhost');
    define('DB_NAME','');
    define('DB_USER','');
    define('DB_PW','');


    define('SITE_PATH',str_replace('\\','/',substr(dirname(__FILE__),0,-3)));
    define('TPL_PATH', SITE_PATH.'tpl/');

    error_reporting(E_ALL ^ E_NOTICE); // | E_STRICT (php5)
    // ini_set('log_errors', 'On');
    // ini_set('error_log', '/usr/local/apache/logs/error_log');
    ini_set('display_errors', 'On');
    //ini_set('memory_limit','30M');

    // Prefix that all database tables have
    define('TBL_PREFIX','eu_');

    // Thumbnails background color
    define('THUMB_BG', 'FFFFFF');
    define('THUMB_FILL', true);

    // Browsing thumbnail width, set this to 0 to display photo icon instead of the thumbnail photo
    define('THUMB_WIDTH', 50);

    /*
    Possible debug levels:
    0: None - Don't show any debug information
    1: Show server load, page generation time, gzip compression stats and query count
    2: Show level 1 (above) and GET and POST information
    3: Show level 1 + 2 and database queries
    */
    define('DEBUG_LEVEL', 0);

    /*
    ENABLE SQL Debug Mode? (0/1)
    (If yes, add '&debug=1' to any page to view SQL debug info)
    */
    define('EN_DEBUG_SQL', 0);

    /*
    Default index page - which file from /inc/pages/ should be loaded by default,
    w/o extension, e.g. browse = browse.php
    */
    define('IDX_PAGE', 'browse');

    /*
    Listing Title DB field name (shared across all fieldsets).
    It must be present in each fieldset as Ad Title
    */
    $TITLE_FIELD = 'v_title';

    require 
    SITE_PATH.'inc/app_init.php';









    Куда вставить данную строку

    PHP:
    mysql_query("set CHARACTER SET cp1251");

    Какие другие способы решения данной проблемы?
     
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    http://www.denwer.ru/faq/other.html

     
  3. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    PHP:
    mysql_query('SET NAMES CP1251');
    и это пишешь после функций подлючения к БД, mysql_connect() и mysql_select_db()
     
  4. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    .:EnoT:.,

    я так понял у меня данные функции в файле соследующим содержанием:

    PHP:

    <?php



    define
    ('DB_FETCH_ORDERED', 1);
    define('DB_FETCH_ASSOC', 2);



    if(!
    function_exists('mysql_connect')){

     

      if(
    function_exists('mysqli_connect')) { // MySQLi workaround

        
    function mysql_connect($server,$user,$pass){ return mysqli_connect($server,$user,$pass); }
        function 
    mysql_fetch_row($res) { return mysqli_fetch_row($res); }
        function 
    mysql_fetch_assoc($res) { return mysqli_fetch_assoc($res); }
        function 
    mysql_data_seek($res,$i) { return mysqli_data_seek($res,$i); }
        function 
    mysql_free_result($res) { return mysqli_free_result($res); }
        function 
    mysql_num_rows($res) { return mysqli_num_rows($res); }
        function 
    mysql_error($conn) { return mysqli_error($conn); }
        function 
    mysql_errno($conn) { return mysqli_errno($conn); }
        function 
    mysql_real_escape_string($s, $conn) { return mysqli_real_escape_string($conn, $s); }
        function 
    mysql_query($sql, $conn) { return mysqli_query($conn, $sql); }
        function 
    mysql_insert_id($conn) { return mysqli_insert_id($conn); }
        function 
    mysql_affected_rows($conn) { return mysqli_affected_rows($conn); }
        function 
    mysql_get_server_info($conn) { return mysqli_get_server_info($conn); }
        function 
    mysql_select_db($name,$conn) { return mysqli_select_db($conn, $name); }
        function 
    mysql_num_fields($res) { return mysqli_num_fields($res); }
        function 
    mysql_field_name($res, $i){
          
    mysqli_field_seek($res,$i);
          
          
          
          
    $finfo = mysqli_fetch_field($res);
          return 
    $finfo->name;
        }
      }
      elseif(
    class_exists('PDO')){
        include 
    SITE_PATH.'inc/pdo.inc.php'; // experimental layer
      
    }
    }

    // if PHP < 4.3.0
    if(!function_exists('mysql_real_escape_string')){
      function 
    mysql_real_escape_string($s, $conn){ return mysql_escape_string($s); }
    }

    class 
    Es_DB_Stats {
        
        var 
    $a_sql = array();
      var 
    $a_time = array();
        var 
    $a_mem = array();
      var 
    $o_tm;
      
      function 
    logSQL($sql){ 
        
    //$sql.=' /* '.$this->_stack_trace().' */';
        
    $this->a_sql[] = $sql; 
      }
      function 
    startQuery(){
        
    $this->o_tm = &Factory::create('HwTimer');
        
    $this->o_tm->startTimer();
      }
      function 
    endQuery(){ 
        
    $this->a_time[] = $this->o_tm->endTimer();
        if(
    function_exists('memory_get_usage')) $this->a_mem[] = memory_get_usage();
      }
      function 
    _stack_trace(){
        
    $stack = array();
        
    $trace = debug_backtrace();
        
    array_splice($trace, 0, 3);
        
    // push each function onto the stack
        
    $len = strlen(SITE_PATH);
        foreach(
    $trace as $t) $stack[] = $t['function'].'() ['.substr($t['file'],$len).']';
        
    $stack = array_reverse($stack);
        return 
    implode(' > ', $stack);
      }
    }

    class 
    Database {

        var 
    $CONN = '';
        var 
    $CURDB = '';
        var 
    $ERR_EXIT = TRUE;
        var 
    $ERR_MSG = '';

      var 
    $DEBUG = FALSE;
      
      var 
    $o_stats;
      var 
    $is_1st_obj = TRUE;

      function 
    Database(){
        
    $this->DEBUG = (EN_DEBUG_SQL==1 && $_GET['debug']);
        if(
    $this->DEBUG || DEBUG_LEVEL>0){
          
    $this->o_stats = &Factory::singleton('Es_DB_Stats');
        }
        if(!isset(
    $GLOBALS['MYSQL_CONN'])) $GLOBALS['MYSQL_CONN'] = '';
        else 
    $this->is_1st_obj = false;
      }
       
      function 
    __destruct(){
        
    // for session_db.php
        
    if($this->is_1st_obj && !is_resource($GLOBALS['MYSQL_CONN'])) $GLOBALS['MYSQL_CONN'] = $this->CONN;
      }
      
        function 
    error($text = '')    {

            if(
    $this->ERR_EXIT){

              
    $v = array();
              
    $v['mysql_error'] = mysql_error();
              
    $v['mysql_errno'] = mysql_errno();
              
    $v['date'] = date('l dS of F Y h:i:s A');
              
    $v['ADMIN_EMAIL'] = ADMIN_EMAIL;
              
    $v['EC_TITLE'] = EC_TITLE;
          
    $v['REQUEST_URI'] = html_esc($_SERVER['REQUEST_URI']);
          
    $v['HTTP_REFERER'] = html_esc($_SERVER['HTTP_REFERER']);
              
    EvalAdvTpl(TPL_PATH.'error_db_query.htm',$v,1);
          
          
    // FileWrite("/path/error_sql_log", $text."\n".$v['mysql_error']."\n".$v['REQUEST_URI']."\n\n", true);
              // Display Error Details if debug option is enabled only
              
    if(EN_DEBUG_SQL==1){ 
            echo 
    $text;
            
    // print_r(debug_backtrace());
            // debug_print_backtrace(); // php5
          
    }
              exit;
            }
            else 
    $this->ERR_MSG = mysql_error();
        }





        function 
    connect($server, $user = '', $pass = '', $dbase = '', $new_link = FALSE) {

            if(
    $user=='' && $pass==''){
              
    $user = ini_get('mysql.default_user');
              
    $pass = ini_get('mysql.default_password');
        }

        if(!
    function_exists('mysql_connect')) die('No MySQL extension found');
            
    $this->CONN = @mysql_connect($server,$user,$pass,$new_link);
            if(!
    $this->CONN) return false; // since 4.0.5
            
    if($dbase) $this->set_db($dbase);
        
    // possible mysql 5.x tweaks
    //    mysql_query('SET SQL_MODE="MYSQL40"', $this->CONN);
    //    mysql_query('SET SESSION storage_engine=MyISAM', $this->CONN);
            
    return true;
        }

    /*
    Valid SQL examples :
    $db->query('SELECT * FROM TABLE WHERE COND="'.$db->quote($val).'"');
    $db->query('SELECT * FROM TABLE WHERE COND='.$db->esc($val));
    $db->query('SELECT * FROM TABLE WHERE COND=?', array($val));
    $db->query('SELECT * FROM TABLE WHERE COND=:val', array(':val'=> $val));
    */

      
    function query($sql, $a_in = NULL) {

          if(
    $this->DEBUG) $this->o_stats->startQuery();

        
    $res = NULL;
        if(!
    is_null($a_in)){
          if(!
    is_array($a_in)) $a_in = array($a_in);

          if(
    is_object($this->CONN)){ // PDO
            
    $res = $this->CONN->prepare($sql);
            
    $res->execute($a_in);
          }
          elseif(
    key($a_in)===0){
            
    $a_sql = explode('?', $sql);
            
    $sql = '';
            
    $cnt = count($a_in);
            for(
    $k=0;$k<$cnt;$k++){
              if(
    $a_in[$k]!='') $a_in[$k] = mysql_real_escape_string($a_in[$k],$this->CONN);
              
    $sql.=$a_sql[$k].'"'.$a_in[$k].'"';
            }
            
    $sql.=$a_sql[$k];
          }
          else{
            foreach(
    array_keys($a_in) as $k){
              if(
    $a_in[$k]!='') $a_in[$k] = mysql_real_escape_string($a_in[$k],$this->CONN);
              
    $sql = str_replace( ($k[0]!=':' ? ':' : '').$k , '"'.$a_in[$k].'"', $sql);
            }
          }
        }

        if(!
    $res) $res = mysql_query($sql, $this->CONN);

        if(!
    $res) $this->error("QUERY failed : $sql");
        if(
    $this->DEBUG || DEBUG_LEVEL>0){ 
          if(
    $this->DEBUG) $this->o_stats->endQuery();
          
    $this->o_stats->logSQL($sql);
        }
        return 
    $res;
      }

        function 
    insert_id() {
            return (int)
    mysql_insert_id($this->CONN);
        }

      function 
    affected_rows() {
            return (int)
    mysql_affected_rows($this->CONN);
      }

      function 
    set_db($name){
        if(!
    $name || $this->CURDB==$name) return;
            if(!@
    mysql_select_db($name,$this->CONN)) $this->error('DB select failed');
            
    $this->CURDB = $name;
      }

      function 
    esc($s) {
        if(
    $s=='') return '""';
        return 
    '"'.mysql_real_escape_string($s,$this->CONN).'"';
      }

      function 
    quote($s) { // deprecated, use esc() instead ?
        
    if($s=='') return '';
        return 
    mysql_real_escape_string($s,$this->CONN);
      }

        function 
    one_data($sql, $a_in = NULL) { 
          
    $res = $this->query($sql, $a_in);
           if(empty(
    $res)) return;
        
    $v = mysql_fetch_row($res); 
        return 
    $v[0];
        } 

        function 
    one_assoc($sql, $a_in = NULL) {
          
    $res = $this->query($sql, $a_in);
           if(empty(
    $res)) return array();
          return 
    mysql_fetch_assoc($res);
        }

        function 
    one_row($sql, $a_in = NULL) {
        
    $res = $this->query($sql, $a_in);
           if(empty(
    $res)) return array();
        return 
    mysql_fetch_row($res);
        }

      function 
    one_col_array($sql, $a_in = NULL){
           
    $res = $this->query($sql, $a_in);
          if(empty(
    $res)) return array();
          
    $data = array();
        while (
    $v = mysql_fetch_row($res)) $data[] = $v[0];
        
    mysql_free_result($res);
          return 
    $data;
      }

      function 
    two_col_assoc($sql, $a_in = NULL){
           
    $res = $this->query($sql, $a_in);
          if(empty(
    $res)) return array();
        
    $data = array();
        while(
    $v = mysql_fetch_row($res))    $data[$v[0]] = $v[1];
        
    mysql_free_result($res);
          return 
    $data;
      }

      function 
    select($sql, $a_in = NULL, $mode = DB_FETCH_ASSOC){
            
            
    $res = $this->query($sql, $a_in);
        if(empty(
    $res)) return array();
            
    $data = array();

        if(
    $mode == DB_FETCH_ORDERED){
              while (
    $v = mysql_fetch_row($res)) $data[] = $v;
        }
        else{
              while (
    $v = mysql_fetch_assoc($res)) $data[] = $v;
        }
          
    mysql_free_result($res);
            return 
    $data;
      }

      function 
    version() {
        if(
    defined('DB_VERSION')) return DB_VERSION;
        
    $s = explode('.', mysql_get_server_info($this->CONN));
        
    define('DB_VERSION', (int)sprintf('%d%02d%02d', $s[0], $s[1], intval($s[2])));
        return 
    DB_VERSION;
      }

      function 
    get_server_info() { return mysql_get_server_info($this->CONN); }

    // some extra functions

        
    function getAll($sql, $params = NULL){    return $this->select($sql, $params); }

      function 
    getCol($sql, $col = 0, $a_in = NULL){
           
    $res = $this->query($sql, $a_in);
          if(empty(
    $res)) return array();
          
    $data = array();
        if(
    is_int($col)){
            while (
    $v = mysql_fetch_row($res)) $data[] = $v[$col];
        }
        else{
            while (
    $v = mysql_fetch_assoc($res)) $data[] = $v[$col];
        }
        
    mysql_free_result($res);
          return 
    $data;
      }

      function 
    getAssoc($sql, $force_array = false, $a_in = NULL, $mode = DB_FETCH_ORDERED){
           
           
    $res = $this->query($sql, $a_in);
          if(empty(
    $res)) return array();

        
    $data = array();

        if(!
    $force_array && mysql_num_fields($res) == 2){
          while(
    $v = mysql_fetch_row($res))    $data[$v[0]] = $v[1];
        }
        else{
          if(
    $mode == DB_FETCH_ASSOC){
              
    $fid = mysql_field_name($res, 0);
              while(
    $v = mysql_fetch_assoc($res)){
              
    $k = $v[$fid];
              unset(
    $v[$fid]);
              
    $data[$k] = $v;
            }
          }
          else{
              while(
    $v = mysql_fetch_row($res)){ 
              
    $k = $v[0];
              unset(
    $v[0]);
              
    $data[$k] = $v; // array_values ??
            
    }
          }
        }
        
    mysql_free_result($res);
          return 
    $data;
      }

    }


    А кудуда ставить именно здесь?
     
  5. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Да, вот еще нашел еще один фалй:

    PHP:



    <?php


    if ( !function_exists( "mysql_connect" ) && class_exists( "PDO" ) )
    {
        class 
    esPDO extends PDO
        
    {

            public 
    $_aff_rows = 0;
            

            public function 
    exec( $sql )
            {
                return 
    $this->_aff_rows = parent::exec( $sql );
            }

            public function 
    affected_rows( )
            {
                return 
    $this->_aff_rows;
            }

        }

        function 
    mysql_connect( $server, $user, $pass )
        {
            try
            {
                return new 
    esPDO( "mysql:host=".$server, $user, $pass );
            }
            catch ( 
    PDOException $e )
            {
                exit( 
    $e->getMessage( ) );
            }
        }
        function 
    mysql_fetch_row( $st )
        {
            return 
    $st->fetch( PDO::FETCH_NUM );
        }
        function 
    mysql_fetch_assoc( $st )
        {
            return 
    $st->fetch( PDO::FETCH_ASSOC );
        }
        function 
    mysql_data_seek( $st, $i )
        {
            if ( 
    $i == 0 )
            {
                
    $st->execute( );
            }
            else
            {
                
    trigger_error( "N/a in PDO mode", E_USER_ERROR );
            }
        }
        function 
    mysql_free_result( $st )
        {
            unset( 
    $st );
        }
        function 
    mysql_num_rows( $st )
        {
            return 
    $st->rowCount( );
        }
        function 
    mysql_error( $conn )
        {
            
    $v = $conn->errorInfo( );
            return 
    $v[2];
        }
        function 
    mysql_errno( $conn )
        {
            return 
    $conn->errorCode( );
        }
        function 
    mysql_real_escape_string( $s, $conn )
        {
            return 
    substr( $conn->quote( $s, PDO::PARAM_STR ), 1, -1 );
        }
        function 
    mysql_query( $sql, $conn )
        {
            if ( 
    preg_match( "/^(?:DELETE|UPDATE|INSERT)/i", $sql ) )
            {
                return 
    $conn->exec( $sql );
            }
            return 
    $conn->query( $sql );
        }
        function 
    mysql_insert_id( $conn )
        {
            return 
    $conn->lastInsertId( );
        }
        function 
    mysql_affected_rows( $conn )
        {
            return 
    $conn->affected_rows( );
        }
        function 
    mysql_get_server_info( $conn )
        {
            return 
    $conn->getAttribute( PDO::ATTR_SERVER_VERSION );
        }
        function 
    mysql_select_db( $name, $conn )
        {
            
    $conn->query( "USE ".$name );
            return 
    true;
            
        }
        
        
        function 
    mysql_num_fields( $st )
        {
            return 
    $st->columnCount( );
        }
        function 
    mysql_field_name( $st, $i )
        {
            
    $finfo = $st->getColumnMeta( $i );
            return 
    $finfo['name'];
        }
        
        
    }

    ?>





     
  6. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    я например вот так делаю:
    PHP:
    @mysql_query('SET NAMES ' . $this->encoding . ' COLLATE ' . $this->encoding);
    @
    mysql_query('SET character_set_results=' . $this->encoding);
    @
    mysql_query('SET character_set_client=' . $this->encoding);
    @
    mysql_query('SET character_set_connection=' . $this->encoding);
    где $this->encoding - кодировка
     
    2 people like this.
  7. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Мне необходимо найти функции подключения к базе в приведенных и точно определить место!
     
  8. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Зачем такие извращения? Напиши нормальные классы для mysql и mysql с отдельными полиморфными функциями для автоопределения.
     
  9. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Сие извращение не я писал!
     
  10. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Так правильно?

    PHP:

    if(function_exists('mysqli_connect')) { // MySQLi workaround

        
    function mysql_connect($server,$user,$pass){ return mysqli_connect($server,$user,$pass); }
        function 
    mysql_fetch_row($res) { return mysqli_fetch_row($res); }
        function 
    mysql_fetch_assoc($res) { return mysqli_fetch_assoc($res); }
        function 
    mysql_data_seek($res,$i) { return mysqli_data_seek($res,$i); }
        function 
    mysql_free_result($res) { return mysqli_free_result($res); }
        function 
    mysql_num_rows($res) { return mysqli_num_rows($res); }
        function 
    mysql_error($conn) { return mysqli_error($conn); }
        function 
    mysql_errno($conn) { return mysqli_errno($conn); }
        function 
    mysql_real_escape_string($s, $conn) { return mysqli_real_escape_string($conn, $s); }
        function 
    mysql_query($sql, $conn) { return mysqli_query($conn, $sql); }
        function 
    mysql_insert_id($conn) { return mysqli_insert_id($conn); }
        function 
    mysql_affected_rows($conn) { return mysqli_affected_rows($conn); }
        function 
    mysql_get_server_info($conn) { return mysqli_get_server_info($conn); }
        function 
    mysql_select_db($name,$conn) { return mysqli_select_db($conn, $name); }
        
        
    ########## Исправление кодировки 
        
        
    @mysql_query('SET NAMES ' . $this->encoding . ' COLLATE ' . $this->encoding); 
    @
    mysql_query('SET character_set_results=' . $this->encoding); 
    @
    mysql_query('SET character_set_client=' . $this->encoding); 
    @
    mysql_query('SET character_set_connection=' . $this->encoding); 
        
        
    ###############################
            
        
    function mysql_num_fields($res) { return mysqli_num_fields($res); }
        function 
    mysql_field_name($res, $i){
          
    mysqli_field_seek($res,$i);
     
  11. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Нет. Объявление функции и её вызов - разные вещи. Определене кодировки должно идти после вызова mysql_connect и mysql_select_db
     
  12. serg-php

    serg-php Elder - Старейшина

    Joined:
    28 Jan 2008
    Messages:
    313
    Likes Received:
    9
    Reputations:
    0
    Проблема решена! Благодарю всех!