freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

Τρόπος επίλυσης προβλημάτων character encoding με MySQL&PHP


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » PHP Προγραμματισμός και εφαρμογές » PHP τα δικά μας scripts
Moderators:  PHP Moderators, Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [1 Μήνυμα]      Bookmarks Tags: phpmysqlcharacter Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
panosru
WebDev Moderator

Μέλος από: 13 Σεπ 2005
Βοηθήματα: 2
Scripts: 2
Μηνύματα: 256+

Περιοχή: Camp
View users profile
ΜήνυμαΣτις: 03 Μαη 2006 11:26    Θέμα: Τρόπος επίλυσης προβλημάτων character encoding με MySQL&PHP Απάντηση με παράθεση  Mark this post and the followings unread

με την αναβάθμιση του MySQL server σε 4.1 αντιμετωπίσαμε όλοι προβλήματα του τύπου να βλέπουμε περίεργους χαρακτήρες στα web site μας τα οποια σχετίζονται με κάποια βάση δεδομένων. Τελικά αργά η γρήγορα όλοι βρήκαμε κάποια λύση, άλλοι επίπονα άλλοι ανώδυνα. παρακάτω θα παρουσιάσω μια class που δημιούργησα για να γίνετε το connection με τις βάσεις δεδομένων μας.

Οι παράμετροι που δέχεται η παρακάνω class είναι το host (η φιλοξενία μας - συνήθως "localhost"-, το username (το όνομα χρηστη μας), το password (το "συνθηματικό" μας), το database name (το όνομα της βάσης δεδομένων μας), και το character encoding (το όνομα της κωδικοποίησης τον χαρακτήρων όπου θέλετε να χρησιμοποιήσετε)

Το όνομα της κωδικοποίησης που χρησιμοποιείτε θα το βρείτε ανάμεσα από τα παρακάτω, στην στήλη Charset (πχ για ελληνικά "greek" για utf-8 "utf8")
κώδικας:

+----------+-----------------------------+---------------------+
| Charset  | Description                 | Default collation   |
+----------+-----------------------------+---------------------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |
| dec8     | DEC West European           | dec8_swedish_ci     |
| cp850    | DOS West European           | cp850_general_ci    |
| hp8      | HP West European            | hp8_english_ci      |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |
| latin1   | cp1252 West European        | latin1_swedish_ci   |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |
| ascii    | US ASCII                    | ascii_general_ci    |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |
| cp1250   | Windows Central European    | cp1250_general_ci   |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |
| utf8     | UTF-8 Unicode               | utf8_general_ci     |
| ucs2     | UCS-2 Unicode               | ucs2_general_ci     |
| cp866    | DOS Russian                 | cp866_general_ci    |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |
| macce    | Mac Central European        | macce_general_ci    |
| macroman | Mac West European           | macroman_general_ci |
| cp852    | DOS Central European        | cp852_general_ci    |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |
| cp1251   | Windows Cyrillic            | cp1251_general_ci   |
| cp1256   | Windows Arabic              | cp1256_general_ci   |
| cp1257   | Windows Baltic              | cp1257_general_ci   |
| binary   | Binary pseudo charset       | binary              |
| geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |
| cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |
+----------+-----------------------------+---------------------+


referrer: MySQL.com

Παρακάτω είναι η class για την οποια αναφερόμουν παραπάνω. Η class αυτή λειτουργεί σε όλες τις εκδόσεις της php.

κώδικας:

<?php
/**
 * @name : MySQLConnect
 * @author : panosru
 * @version : PHP 4 + && < PHP 5
 * @param : host,user,pass,db,char
 */
class MySQLConnect
{
  var $host,$user,$pass,$db,$char,$error;
       
  function MySQLConnect($host,$user,$pass,$db,$char)
  {
     $this->host    = $host;
     $this->user    = $user;
     $this->pass    = $pass;
     $this->db       = $db;
     $this->char    = $char;
     $this->error    = array(); 
     
     $this->Execution();      
  }
 
  function ActualizeDatabaseConnection ()
  {
      if(!@mysql_connect($this->host,$this->user,$this->pass)) {
          array_push($this->error,"Error conecting to database -> ".mysql_error()." Error number: ".mysql_errno());
      }
  }
   
  function SelectDatabase ()
  {
      if(!@mysql_select_db($this->db))
      {
          array_push($this->error,"Error selecting the database {$this->db}");
      }
  }
 
  function DefineDatabaseCharset()
  {
      if(!(@mysql_query("SET CHARACTER SET '{$this->char}'")) && (@mysql_query("SET NAMES '{$this->char}'")))
      {
          array_push($this->error,"Error while changing character set to {$this->char}");
         
      }
  }
 
  function Validator ()
  {          
   if (count($this->error) > 0)
   {
      foreach ($this->error as $key => $value)
      {
         echo "[".($key+1)."] > {$value}<br />";
      }
      die("<p><strong>Can not display web page</strong></p>");
   }     
  }
 
  function Execution ()
  {
   // MAKE THE CONNECTION
   $this->ActualizeDatabaseConnection();
   $this->SelectDatabase();
   $this->DefineDatabaseCharset();
   
   // MAKE VALIDATION
   $this->Validator();          
  }
}
?>


Μπορείτε να αποθηκεύσετε αυτόν τον κώδικα σε κάποιο αρχείο λόγου χάρη MySQLConnect.class.php (σημείωση: το .class δεν χρησιμεύει σε τίποτε παραπάνω απλά για να καταλαβαίνουμε ότι πρόκειται περί class χωρίς να χρειαστεί να μπούμε στον κώδικα του αρχείου) και στο αρχείο όπου θέλετε να δημιουργήσετε την σύνδεση σας με την βάση δεδομένων σας μπορείτε να γράψετε τον παρακάτω κώδικα:

κώδικας:

<?php
require_once("./required/MySQLConnect.class.php");
$myDB = new MySQLConnect("host", "username", "password", "database_name", "character_set");
?>


Παρακάτω θα δώσω μια άλλη class η οποια έχει το ίδιο αποτέλεσμα με την παραπάνω η μονη διαφορα είναι πως είναι ποιο ασφαλής, λειτουργεί καλύτερα από την προηγουμενη και υποστηρίζεται μονο από php5.0 και πάνω.

κώδικας:

<?php
/**
 * @name : MySQLConnect
 * @author : panosru
 * @version : PHP5 +
 * @param : host,user,pass,db,char
 */
class MySQLConnect
{   
   protected static $host,$user,$pass,$db,$char;
   public static $error = array();
   
   const ActualizeDatabaseConnectionErroText1 = 'Error conecting to database -> ';
   const ActualizeDatabaseConnectionErroText2 = ', Error number: ';
   const SelectDatabaseErroText1 = 'Error selecting the database ';
   const DefineDatabaseCharsetErroText1 = 'Error while changing character set to ';
   const ValidationDieMessage = '<p><strong>Can not display web page</strong></p>';
   
   public function __construct($host,$user,$pass,$db,$char)
   {
      self::$host = $host;
      self::$user = $user;
      self::$pass = $pass;
      self::$db    = $db;
      self::$char = $char;                        
      
      self::Execution();
   }
   
   private static function ActualizeDatabaseConnection ()
   {      
      if(!@mysql_connect(self::$host,self::$user,self::$pass))
      {
         array_push(self::$error,self::ActualizeDatabaseConnectionErroText1.mysql_error().self::ActualizeDatabaseConnectionErroText2.mysql_errno());
      }
   }   
   private static function SelectDatabase ()
   {      
      if(!@mysql_select_db(self::$db))
      {
         array_push(self::$error,self::SelectDatabaseErroText1.self::$db);
      }
   }
   private static function DefineDatabaseCharset ()
   {      
      if(!(@mysql_query("SET CHARACTER SET '".self::$char."'")) && (@mysql_query("SET NAMES '".self::$char."'")))
      {
         array_push(self::$error,self::DefineDatabaseCharsetErroText1.self::$char);      
      }
   }
   
   private static function Execution ()
   {
      // MAKE THE CONNECTION
      self::ActualizeDatabaseConnection();
      self::SelectDatabase();
      self::DefineDatabaseCharset();   
      
      // MAKE VALIDATION
      self::Validator();         
   }
   
   private static function Validator ()
   {
      if (count(self::$error) > 0)
      {
         foreach (self::$error as $key => $value)
         {
            echo "[".($key+1)."] > {$value}<br />";
         }
         die(self::ValidationDieMessage);
      }
   }
}
?>


Τέλος να επισημάνω πως εκτος από τα παραπάνω πρέπει να ορίζουμε και εμείς από την πλευρά μας τα collation στα αλφαριθμητικά παιδία μας (πχ VARCHAR, TEXT κτλ) τα collation που μπορείτε να χρησιμοποιήσετε ανάλογα με την γλώσσα που θέλετε μπορείτε να τα βρείτε από τον παραπάνω πινακα που έδωσα στην στήλη Default collation
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [1 Μήνυμα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » PHP Προγραμματισμός και εφαρμογές » PHP τα δικά μας scripts
Τώρα είναι 07 Δεκ 2016 20:18 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos