Προς το περιεχόμενο

περί php+mysql+ut8+ ελληνικά


assaya

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

 

έχω ένα κομμάτι του κώδικα ως εξής:

 

$area = "\'ΕΛΛΗΝΙΚΑ\'";

 

$stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename WHERE area=?");

 

mysqli_stmt_bind_param($stmt, 'i', $area);

mysqli_stmt_execute($stmt);

 

 

Το τρέχω κανονικά αλλά δεν πιάνει καθόλου το query από το WHERE και έπειτα....

δηλαδή μου βγάζει τα αποτελέσματα που θα μου έβγαζε εάν είχα το εξής query:

"SELECT * FROM $this->tablename"

 

πιστεύω ότι είναι θέμα των ελληνικών... έχετε καμιά ιδέα για το τί μπορώ να κάνω;

 

 

ps έχω ήδη πειράξει τα:

my.cnf

στον php κώδικα: mb_internal_encoding( 'UTF-8' );

$this->connection->query("SET NAMES 'utf8'");

$this->connection->query('SET CHARACTER SET utf8');

τα collation etc της mysql είναι όλα σε utf-8.

Δημοσ.

Το αρχείο με τον κώδικα στο οποίο ορίζεις την $area είναι και αυτό encoded σε utf-8, έτσι;

Δημοσ.

δεν έχω γράψει κάτι τέτοιο όχι.... μου θυμίζεις πώς το ορίζω;

νόμιζα ότι το έκανε το mb_internal_encoding( 'UTF-8' ); ...

Δημοσ.

δεν ξέρω αν βοηθάει, πάρε μια ιδέα από λύση σε ένα παρόμοιο δικό μου πρόβλημα

 

private function setConnection(){

$username="USERNAME";

$password="PASSWORD";

$db_name="DATABASE";

$host="HOSTNAME";

 

$con = mysql_connect($host,$username,$password);

if (!$con)

{

die('Could not connect: ' . mysql_error());

}

 

mysql_select_db($db_name, $con);

mysql_query("SET NAMES 'utf8'", $con);

return $con;

}

 

 

/*******************************/

public function insertValues($title,$date,$text){

$con=Queries::setConnection();

 

$result = mysql_query("INSERT INTO samples (title,date,text) VALUES ('$title','$date','$text')");

mysql_close($con);

}

Δημοσ.

ας στείλω τον κώδικα και για self-reference αλλά και για κάποιον άλλον να μην ψάχνεται...

 

>
<?php
$a = new DBConnect();

class DBConnect
{
var $username = "root";
var $password = "root";
var $server = "localhost";
var $port = "8888";
var $databasename = "databasename";
var $tablename = "tablename";

var $connection;

public function __construct() {
  	$this->connection = mysqli_connect(
  							$this->server,  
  							$this->username,  
  							$this->password, 
  							$this->databasename,
  							$this->port
  						);
	$this->connection->query("SET NAMES 'utf8'");
	$this->connection->query('SET CHARACTER SET utf8');

	$this->throwExceptionOnError($this->connection);
	$this->dbConnect();
}

public function dbConnect()
   {
	mb_internal_encoding( 'UTF-8' );
	
	printf("
		<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
		<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
		<head>
		  <meta http-equiv='content-type' content='text/html; charset=utf-8' />
		</head>
		<body><άλεξ><br/>");
		
	$area = "\'ΕΛΛΗΝΙΚΗ ΠΕΡΙΟΧΗ\'";
	
	$stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename WHERE area=?");
	printf("SELECT * FROM $this->tablename WHERE area=?<br>");
	mysqli_stmt_bind_param($stmt, 'i', $area);
	mysqli_stmt_execute($stmt);
	
	mysqli_stmt_bind_result($stmt, $row->productId, $row->name, $row->area, $row->description);
	
	$counter = 0;
	$rows = array();
	while (mysqli_stmt_fetch($stmt)) {
		$rows[] = $row;
$row = new stdClass();

		mysqli_stmt_bind_result($stmt, $row->productId, $row->name, $row->area, $row->description);
		
		
	printf("productId ".$rows[$counter]->productId."\n");
	printf("name ".$rows[$counter]->name."\n");
	printf("area ".$rows[$counter]->area."<br>");
	printf("description ".$rows[$counter]->description."\n");
	$counter++;
			
    }
	printf( "count(rows) = ".count($rows) );
	
	mysqli_stmt_free_result($stmt);
    mysqli_close($this->connection);
	
	printf("</body></html>");
}
	
/**
 * Utility function to throw an exception if an error occurs 
 * while running a mysql command.
 */
private function throwExceptionOnError($link = null) {
	if($link == null) {
		$link = $this->connection;
	}
	if(mysqli_error($link)) {
		$msg = mysqli_errno($link) . ": " . mysqli_error($link);
		throw new Exception('MySQL Error - '. $msg);
	}		
}
}
?>

 

 

 

"Το τρέχω κανονικά αλλά δεν πιάνει καθόλου το query από το WHERE και έπειτα....

δηλαδή μου βγάζει τα αποτελέσματα που θα μου έβγαζε εάν είχα το εξής query:

"SELECT * FROM $this->tablename""

 

 

ps. έχω ένα κάρο debug κώδικα μέσα... στο τέλος θα το χρησιμοποιήσω

σαν service για να return $rows;

Δημοσ.
δεν έχω γράψει κάτι τέτοιο όχι.... μου θυμίζεις πώς το ορίζω;

νόμιζα ότι το έκανε το mb_internal_encoding( 'UTF-8' ); ...

 

Η mb_internal_encoding λέει στην PHP να χρησιμοποιεί τη συγκεκριμένη κωδικοποίηση για τα δεδομένα που ανταλάσονται μέσω HTTP, ή ως default επιλογή για κάποιες συναρτήσεις, ή δε ξέρω τι άλλο, όμως υπάρχει και το παρακάτω θέμα:

 

Όταν δίνεις στον text editor σου to string "ελληνικά", αυτός αναγκαστικά πρέπει να το κωδικοποιήσει κάπως σε bits πριν το αποθηκεύσει, σύμφωνα με κάποια κωδικοποιήση.

 

Στην PHP και στη MySQL έχεις πει να περιμένουν UTF-8, άρα θα πρέπει και το string να είναι σε UTF-8. Αν ο editor έχει κωδικοποιήσει το αρχείο (και άρα το string "ελληνικά") π.χ. σε iso-8859-7, η PHP θα ερμηνεύσει ασυνάρτητα bytes αντί για "ελληνικά", επειδή, στον πίνακα του UTF-8, τα συγκεκριμένα bytes αντιστοιχούν σε κάτι άλλο (ή σε τίποτα).

 

Οπότε θα πρέπει να δεις στις επιλογές του editor που χρησιμοποιείς για να γράφεις τον κώδικα τι default encoding χρησιμοποιεί, ή να χρησιμοποιήσεις από κονσόλα την εντολή "file" (file αρχείο.php) -νομίζω η εντολή υπάρχει στο Mac OS.

 

Και να μην το υποστηρίζει ο editor, την κωδικοποίηση μπορείς να την αλλάξεις εκ των υστέρων με κάποιο εργαλειάκι όπως η recode ή η iconv, αλλά θα πρέπει να ξέρεις σε τι κωδικοποίηση βρίσκεται.

 

Δε ξέρω αν είναι αυτό το πρόβλημα, πολύ πιθανόν ο editor σου να χρησιμοποιεί ήδη UTF-8 by default, μου φαίνεται κι όλας ότι ούτως ή άλλως η PHP θα περνούσε οτιδήποτε στην libmysql και είτε δε θα επέστρεφε τίποτα το query είτε θα χτυπούσε η mysql, αλλά checkάρε το.

 

[EDIT]

minas:

mysqli_stmt_bind_param($stmt, 'i', $area);

πες του να βγάλει το "i", είναι για integer, και να βάλει "s" για string

$area = "\'ΕΛΛΗΝΙΚΑ\'"; δεν χρειάζονται και τα μονά αυτακια το κάνει το bind_stmt

Δημοσ.

Ψιτ, κερνάω καφέ. Το "i"->"s" ήταν. Σας ευχαριστώ!

Ελπίζω να μείνει ο κώδικας και για κανέναν άλλο.

Τώρα μένει να το βάλω να γυρνάει array για να το

ρουφάω από το flex προγραμμά μου :)

 

ps. τελικά αυτό $area = "\'ΕΛΛΗΝΙΚΑ\'"; έπρεπε επίσης να γίνει έτσι: $area = "ΕΛΛΗΝΙΚΑ";

και ναι θα έπρεπε να το είχα δει το "i"....

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...