Κωδικοποίηση χαρακτήρων σε καταχωρήσεις στη βάση

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Panos_Smr
Δημοσιεύσεις: 6
Εγγραφή: 05 Αύγ 2010 03:35

Κωδικοποίηση χαρακτήρων σε καταχωρήσεις στη βάση

Δημοσίευση από Panos_Smr » 07 Σεπ 2010 15:26

Γειά σε όλους!
Στο project που δουλεύω, από το οποίο παραθέτω πιο κάτω ένα κομμάτι κώδικα, υπάρχει το εξής πρόβλημα:
Παρότι δουλεύει, και καταχωρεί στη βάση κανονικά στοιχεία, αυτά πολλές φορές καταχωρούνται "ακαταλαβίστικα", ή δεν εμφανίζονται κανονικά μετα(όταν σε κάποια άλλη σελίδα τα παίρνω από τη βάση δεδομένων εμφανίζει ερωτηματικά) ακόμα και αν έχουν καταχωρηθεί σωστά στη βάση.
Το θέμα είναι οτι αυτό δεν συμβαίνει πάντα.
Έχει συμβεί να είναι τα δεδομένα κανονικά καταχωρημένα στη βάση και να μου δείχνει ερωτηματικά στη σελίδα, και με ένα refresh να τα δείχνει κανονικά όπως πρέπει.

Παραθέτω παρακάτω ένα κομμάτι κώδικα, το οποίο είναι ένα script που δημιουργεί ένα καινούριο φάκελο στο σύστημα αρχείων και καταχωρεί τα στοιχεία του φακέλου στη βάση δεδομένων. Δημιουργεί κανονικά τους φακέλους και καταχωρεί τα επιθυμητά στη βάση. Αλλά ενώ έχει δουλέψει, πλέον καταχωρεί στη βάση "ακαταλαβίστικα" τα στοιχεία.
Για να σας δώσω μια πιο πλήρη εικόνα, το script προορίζεται για να δημιουργεί νέα άλμπουμ φωτογραφιών(φακέλους) για να αποθηκεύονται μετά εκεί οι φωτογραφίες(με άλλο script).

Κώδικας: Επιλογή όλων

<?php
				$albums=$_SERVER&#123;'DOCUMENT_ROOT'&#125;."/ΧΧΧΧΧ/albums/";
				$directory=opendir&#40;$albums&#41;;
			
				require_once&#40;"database_functions.inc.php"&#41;;
				
			
				if&#40;!empty&#40;$_POST&#91;'albumname'&#93;&#41; && isset&#40;$_POST&#91;'create_album'&#93;&#41;&#41;
					&#123;
					
					db_open&#40;&#41;;
					$album_name = mysql_real_escape_string&#40;trim&#40;$_POST&#91;'albumname'&#93;&#41;&#41;;
					$newdirect = $_SERVER&#123;'DOCUMENT_ROOT'&#125;."/eleor/albums/".$album_name;
					if&#40;!file_exists&#40;$newdirect&#41;&#41;
						&#123;
						$albumname = mkdir&#40;$newdirect,'0777'&#41;;
				
						if&#40;$albumname != false&#41;
							&#123;
							$newopen = opendir&#40;$newdirect&#41;;
							$newthumb = $newdirect."/thumbnails";
							$createthumb = mkdir&#40;$newthumb,'0777'&#41;;
								if&#40;$createthumb != false&#41;
									&#123; 
									mysql_query&#40;"SET CHARACHTER SET 'greek'"&#41;;
									mysql_query&#40;"SET CHARACHTER_SET_RESULTS='greek'"&#41;;
									$result = mysql_query&#40;"INSERT INTO image_albums VALUES &#40;NULL,'$album_name','$newdirect',NULL&#41;"&#41;; 
								
										if&#40;$result != false&#41;
											&#123;
											echo"To άλμπουμ δημιουργήθηκε με επιτυχία";
											&#125;
										else
											&#123;
											echo"Παρουσιάστηκε ένα πρόβλημα κατά την καταχώρηση του άλμπουμ".mysql_error&#40;&#41;;
											&#125;
										
								
									&#125;
							closedir&#40;$newopen&#41;;
							&#125;
						&#125;
					else
						&#123;
						echo"Το άλμπουμ υπάρχει ήδη.";
						&#125;
						
					db_close&#40;&#41;;
					
					&#125;	
				else
					&#123;
					echo"<h4>Δημιουργία νέου άλμπουμ φωτογραφιών&#58;</h4>
					<p><form method=\"post\">
					<b>Όνομα&#58; </b><input type='text' name='albumname'>
					<input type=\"hidden\" name=\"create_album\">
					<input type=\"submit\" value=\"Δημιουργία\"></form></p>";
					&#125;
			
				closedir&#40;$directory&#41;;
				?>
Στο αρχείο database_functions.inc.php που καλείται παραπάνω ορίζονται διάφορες συναρτήσεις που αφορουν τη βάση ως εξής(παρατίθενται μόνο εκείνες που αφορούν το συγκεκριμένο κομμάτι κώδικα):

Κώδικας: Επιλογή όλων

<?php


header&#40;'Content-Type&#58; text/html ; charset=ISO-8859-7'&#41;;


global $db;


function db_open&#40;&#41; &#123;
  @ $db = mysql_pconnect&#40;'ΧΧΧΧ', 'ΧΧΧΧ', 'ΧΧΧΧ'&#41; or die&#40;'Δεν μπόρεσε να γίνει σύνδεση με τη βάση δεδομένων'&#41;;
  @ mysql_select_db&#40;'XXXXX', $db&#41; or die&#40;'Η βάση δεδομένων δεν βρέθηκε'&#41;;
	mysql_query&#40;"SET CHARACHTER SET='greek'"&#41;;
  &#125;

function db_close&#40;&#41; &#123;
  mysql_close&#40;&#41;;
&#125;
?>
Τέλος, το collation της βάσης και των πινάκων είναι utf8_general_ci και δουλεύω σε phpmyadmin.
Yπάρχει περίπτωση το πρόβλημα να βρίσκεται στο phpmyadmin?
Κάθε βοήθεια καλοδεχούμενη...
Ευχαριστώ για το χρόνο σας...

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

Κωδικοποίηση χαρακτήρων σε καταχωρήσεις στη βάση

Δημοσίευση από fafos » 07 Σεπ 2010 15:55

pantou utf-8 enconding.. katarghse ta SET greek pou exeis sto proto script kai dose utf-8 sto header charset tou deuterou... oi selides prepei na einai sosmenes se utf-8 xoris BOM..
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Κωδικοποίηση χαρακτήρων σε καταχωρήσεις στη βάση

Δημοσίευση από Apostolis_38 » 07 Σεπ 2010 15:57

Η θα αλλάξεις τη βάση σε greek ή τα SET... σε utf8
Και το charset στο header επίσης.

Ψάξε στο φόρουμ, έχει πάμπολλα παραδείγματα για το πως πρέπει να ρυθμιστούν όλα αυτά ώστε να υπάρχει σωστό αποτέλεσμα.

edit Πιο γρήγορος ο fafos. Πάλι...

Panos_Smr
Δημοσιεύσεις: 6
Εγγραφή: 05 Αύγ 2010 03:35

Κωδικοποίηση χαρακτήρων σε καταχωρήσεις στη βάση

Δημοσίευση από Panos_Smr » 07 Σεπ 2010 16:23

Καταρχάς σας ευχαριστώ για τις απαντήσεις σας, και να σημειώσω οτι δεν έχω και μεγάλη πείρα στο χώρο(είναι το πρώτο μου project ακόμα)..

Επι του θεματος, το utf8_general_ci(collation της βάσης) εφόσον είναι πολυγλωσσικό δεν έπρεπε να συνεργάζεται?
Κι άν όχι, δεν έπρεπε παντού και πάντα να εμφανίζει ερωτηματικά?
Επίσης, κάτι που ξέχασα να αναφέρω πρίν, οτι στο head της σελίδας δηλώνεται:

Κώδικας: Επιλογή όλων

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7" />
Σε κάθε περίπτωση, θα ξαναπροσπαθήσω με αυτά που μου είπατε και θα ενημερώσω.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Κωδικοποίηση χαρακτήρων σε καταχωρήσεις στη βάση

Δημοσίευση από Apostolis_38 » 07 Σεπ 2010 16:51

Panos_Smr έγραψε:Επι του θεματος, το utf8_general_ci(collation της βάσης) εφόσον είναι πολυγλωσσικό δεν έπρεπε να συνεργάζεται?
Ισως, μιας και το utf φτιάχτηκε βάση του iso-8859 και με σκοπό να το κάνει extend για όλες τις γλώσσες που δεν χρησιμοποιούν latin χαρακτήρες.
http://en.wikipedia.org/wiki/Unicode
Απ' ότι βλέπεις όμως στην πράξη γίνονται άλλα πράγματα και ίσως να είναι λογικό μιας και υπάρχουν άλλες διαφορές. Κυρίως από τη μεριά της mysql και πως χειρίζεται τα data.
Panos_Smr έγραψε:Κι άν όχι, δεν έπρεπε παντού και πάντα να εμφανίζει ερωτηματικά?
Αυτό όντως είναι λίγο μυστήριο. Πιθανώς έχει να κάνει με τους κοινούς χαρακτήρες.

Panos_Smr
Δημοσιεύσεις: 6
Εγγραφή: 05 Αύγ 2010 03:35

Κωδικοποίηση χαρακτήρων σε καταχωρήσεις στη βάση

Δημοσίευση από Panos_Smr » 07 Σεπ 2010 17:17

λίγο δύσκολο πιστεύω να αφορά τους κοινούς χαρακτήρες διότι αυτό που συμβαίνει είναι το εξής:
εστω οτι έχω καταχωρημένα στη βάση τα στοιχεία μου με ελληνικά. Μπορεί να μου τα βγάλει όλα ερωτηματικά, και με μια ανανέωση της σελίδας όλα να τα δείξει όπως πρέπει... Γι'αυτό είχα ρωτήσει στην αρχή εάν μπορεί να είναι θέμα της εφαρμογής.
Σε ο,τι αφορά την καταχώρηση, το πρώτο άλμπουμ που είχα καταχωρήσει μου το έβαλε κανονικά. Μετά άρχισε τα κουλά. Το ίδιο και σε άλλες φόρμες αλλά επανήλθε....
Πριν από όλα αυτά ο κώδικάς μου ήταν χωρίς SET και δεν μου τα αποθήκευε σωστά. Τα έβαλα και έφτιαξε... Ετσι είχε φανεί τουλάχιστον....
Το θέμα ήταν το εξής:

http://www.freestuff.gr/forums/viewtopic.php?t=51453

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Κωδικοποίηση χαρακτήρων σε καταχωρήσεις στη βάση

Δημοσίευση από Apostolis_38 » 07 Σεπ 2010 21:03

Γενικά για αυτό το θέμα δεν ξέρω να σου πω ακριβώς τι παίζει. Μου έχει τύχει και μένα αλλά δεν μπόρεσα να καταλάβω πως γίνεται αυτό το πράγμα.

Οσον αφορά τη δική σου συγκεκριμένη περίπτωση μάλλον έχει γίνει μπάχαλο.
Καταρχάς είναι "άλλοι" οι χαρακτήρες που εμφανίζει μια σελίδα html και "άλλοι" οι χαρακτήρες που καταχωρεί μια βάση δεδομένων. Και φυσικά από βάση σε βάση (sql και mysql π.χ.) υπάρχουν διαφορές.
Μπορεί σε μας να εμφανίζονται ίδιοι αλλά για την database δεν είναι έτσι τα πράγματα.
Χαρακτηριστικότατη διαφορά οτι ένας χαρακτήρας σε iso-8859-7 "καταλαμβάνει" ένα byte στο table field ενώ ο ίδιος χαρακτήρας σε utf "καταλαμβάνει" δύο bytes.
Αυτό για την βάση παίζει πολύ μεγάλο ρόλο.
Επίσης, διαφορετικές "ενέργειες" κάνει η mysql όταν απλώς καταχωρεί δεδομένα και διαφορετικές όταν τα καταχωρεί χρησιμοποιώντας τις SET NAME,CHARACTER κ.λ.π. κ.λ.π.
Πάλι σε επίπεδο bytes.

Εσύ χρησιμοποιώντας SET CHARACTER='greek' σε βάση με utf8 "ψιλοτρελαίνεις" τη mysql.
Υπάρχει λόγος που πρέπει τα SET να έχουν το ίδιο encoding με τη βάση. Μη νομίζεις οτι οι τύποι στην Oracle δεν έχουν τι άλλο να κάνουν και λένε "ας φτιάξουμε καμμιά 200αριά διαφορετικές εντολές για όλα τα character sets".
Να είσαι σίγουρος οτι αν υπήρχε κωδικοποίηση πασπαρτού δεν θα πειράζανε τίποτα.

Θα μου πεις "μα παίζει".
Ναι, γιατί τα data σου και το html encoding έχουν την ίδια κωδικοποίηση.
Παίζει αλλά δεν παίζει σωστά.
Αν δείς τα data σου από mysql command prompt (όπου εκτός απροόπτου θα τρέχει 8859-1) θα στα δείξει αλαμπουρνέζικα.
Αργότερα πολύ πιθανόν να αντιμετωπίσεις προβλήματα. Και αν πάς να κάνεις restore τα data σου επίσης μπορεί να αντιμετωπίσεις πρόβλημα.
Αυτό που σε "σώζει" είναι οτι η mysql κρατάει σταθερό τον τύπο των data.
Για παράδειγμα, αν γράψεις κάτι σε html με encoding 8859-7 και μετά γυρίσεις το encoding σε utf8 κατά 90% θα σου δείχνει "ιερογλυφικά"
Ξαναγυρνώντας σε 8859-7 δεν σώνεται η κατάσταση. Θα συνεχίσει να σου δείχνει "ιερογλυφικά".
Ευτυχώς αυτό δεν γίνεται στην mysql.

Τώρα, σχετικά με το phpmyadmin. Νομίζω πως κρατάει μία "ουδέτερη" στάση δουλεύοντας την κωδικοποίησή του σύμφωνα με το collation της database.
Κάποτε είχα ρίξει μια ματιά στον κώδικα αλλά δεν θυμάμαι και πολύ καλά αν όντως έτσι δουλεύει. Ασε που από τότε έχουν βγει κι άλλες εκδόσεις :P

Εν κατακλείδει. Το σωστό είναι όλες οι παράμετροι που αφορούν το encoding να έχουν την ίδια κωδικοποίηση.
Μπορεί τώρα να φαίνονται όλα εντάξει αλλά δυστυχώς ο Μέρφυ με τους νόμους του πιθανότατα θα επιβεβαιωθεί.



Ούφ, τα 'φτυσα να γράφω τόση ώρα. Πάω για kaiser... :pint:

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Κωδικοποίηση χαρακτήρων σε καταχωρήσεις στη βάση

Δημοσίευση από korgr » 07 Σεπ 2010 22:28

Apostolis_38 έγραψε:bla bla bla bla... Ούφ, τα 'φτυσα να γράφω τόση ώρα. Πάω για kaiser... :pint:
Κράτα την ουσία! :lol:

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 2 επισκέπτες