panosru Δημοσ. 22 Μαΐου 2006 Δημοσ. 22 Μαΐου 2006 με την αναβάθμιση του MySQL server σε 4.1 αντιμετωπίσαμε όλοι προβλήματα του τύπου να βλέπουμε περίεργους χαρακτήρες στα web site μας τα οποια σχετίζονται με κάποια βάση δεδομένων. Τελικά αργά η γρήγορα όλοι βρήκαμε κάποια λύση, άλλοι επίπονα άλλοι ανώδυνα. παρακάτω θα παρουσιάσω μια class που δημιούργησα για να γίνετε το connaction με τις βάσεις δεδομένων μας. Οι παράμετροι που δέχεται η παρακάνω 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 CONNACTION $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 CONNACTION 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
godlike Δημοσ. 22 Μαΐου 2006 Δημοσ. 22 Μαΐου 2006 Να 'σαι καλά. Πρίν λίγο έκανα post για αυτό το πράγμα. Ευχαριστούμε
panosru Δημοσ. 26 Μαΐου 2006 Μέλος Δημοσ. 26 Μαΐου 2006 Να 'σαι καλά. Πρίν λίγο έκανα post για αυτό το πράγμα. Ευχαριστούμε to eida gi' ayto to ekana post kai edo...
ttommy Δημοσ. 27 Απριλίου 2008 Δημοσ. 27 Απριλίου 2008 ΚΑΙ ΓΩ ΤΟ ΔΟΚΙΜΑΣΑ ΑΛΛΑ ΜΟΥ ΒΓΑΖΕΙ ΣΥΝ ΤΟ ΠΑΡΑΚΑΤΩ ΜΗΝΥΜΑ mysql_query(): supplied argument is not a valid MySQL-Link resource in C:\AppServ\www\actionpc\inc_bara.php on line 6 ΚΑΙ Η 6 ΣΕΙΡΑ ΕΙΝΑΙ Η ΠΑΡΑΚΑΤΩ $sqla="select cat_id , catname from categories order by cat_id"; $erotimas=mysql_query($sqla,$db); $sires=mysql_num_rows($erotimas); ΑΝ ΜΠΟΡΕΙΣ ΛΥΣΕ ΤΟ ΠΡΟΒΛΗΜΑ ΜΟΥ ΕΥΧΑΡΙΣΤΩ
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.