2010-08-23 52 views
0

當我從mySQL數據庫返回一行時,我得到一個?而不是一些字符,例如:ò, 等。我的mysql行和表被設置爲utf8_unicode_ci,所以我認爲數據庫正確存儲它,但PHP沒有正確返回它。mysql結果返回?(問號)而不是Ö等。

認爲它與mysql_set_charset有關,但不能讓它正常工作。任何幫助將不勝感激!!

<?php 
if($row = mysql_fetch_assoc(queryDb("SELECT * FROM customer WHERE uuid='".$_COOKIE['uuid']."'"))) 
{ 
    $first_name = $row['first_name']; 
    $last_name = $row['last_name']; 
    $gender = $row['gender']; 


    $ileach_first_name = $row['ileach_first']; 
    $ileach_last_name = $row['ileach_last']; 

} 

//If Ileach Name is blank 

    if($ileach_last_name == "" || $ileach_first_name == ""){ 


    // Get ileach last name 
    $row = mysql_fetch_assoc(queryDb("SELECT * FROM ileach_last_names WHERE eng_name='$last_name'")); 

    $ileach_last_name = $row['gae_name']; 


    if($ileach_last_name == "") { 
    $row = mysql_fetch_assoc(queryDb("SELECT * FROM ileach_last_names order by rand() limit 1")); 
    $ileach_last_name = $row['gae_name'];} 



    //Get ileach First Name 
    //If Male 
    if($gender == 'M') { 

    $row = mysql_fetch_assoc(queryDb("SELECT * FROM ileach_first_names_m WHERE eng_name='$first_name'")); 

    $ileach_first_name = $row['gae_name']; 

    //If no name is selected, get one randomly 
     if($ileach_first_name == "") { 
     $row = mysql_fetch_assoc(queryDb("SELECT * FROM ileach_first_names_m order by rand() limit 1")); 
    $ileach_first_name = $row['gae_name']; } 
    } 
    //If Female 


    else{ 

    $row = mysql_fetch_assoc(queryDb("SELECT * FROM ileach_first_names_f WHERE eng_name='$first_name'")); 

    $ileach_first_name = $row['gae_name']; 

    //If no name is selected, get one randomly 
    if($ileach_first_name == "") { 
     $row = mysql_fetch_assoc(queryDb("SELECT * FROM ileach_first_names_f order by rand() limit 1")); 
    $ileach_first_name = $row['gae_name'];} 
    } 




    //Save ileach name into db 

    mysql_query("UPDATE customer SET ileach_first = '$ileach_first_name' 
    WHERE uuid='".$_COOKIE['uuid']."' "); 

    mysql_query("UPDATE customer SET ileach_last = '$ileach_last_name' 
    WHERE uuid='".$_COOKIE['uuid']."' "); 
    } 


    //Stitch name together. 

    $full_ileach_name .=$ileach_first_name; 
    $full_ileach_name .= " "; 
    $full_ileach_name .= $ileach_last_name; 





?> 
+0

',但不能讓它的工作properly.' - 那你試試? – 2010-08-23 12:06:13

回答

10

「認爲這是與mysql_set_charset」 - 是的,非常有可能。

$mysql = mysql_connect(...); // TODO: error handling 
mysql_select_db('...', $mysql); // TODO: error handling 
mysql_set_charset('utf8', $mysql); // TODO: error handling 

如需更多我們需要知道更多關於(其中在建立數據庫的連接,如如)功能queryDB()和相關的東西

也看到詳細信息:

+0

連接被存儲在另一個文件中,在mysql_set_charset中插入,它像夢一樣工作!乾杯! – 2010-08-23 13:01:20

+0

在php 5.2.6上本地運行,並且它工作正常,但是一旦id將它部署到運行在5.1.6上的服務器上,它就無法工作。然而,我偶然發現了這一行:\t mysql_query('SET NAMES utf8'); 哪個工作過! – 2010-08-24 12:47:11

5

試着把這mysql_select_db後:

mysql_query ("set character_set_client='utf8'"); 
mysql_query ("set character_set_results='utf8'"); 
mysql_query ("set collation_connection='utf8_unicode_ci'"); 
+0

這讓我們例如mysql_real_escape()在黑暗中改變字符集。請參閱在php 5.2中引入mysql_set_charset之前明顯寫入的http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html。3 – VolkerK 2010-08-23 12:34:51

0

發送作爲第一個查詢這樣的:

SET NAMES 'utf8' 

應工作;)

  • MySQL的存儲文本正確,和PHP被正確格式化,但問題是,在連接的字符集:)

  • 鋪設一樣@VolkerK建議,使用mysql_set_charset func可能是個好主意

+0

這讓我們例如mysql_real_escape()在黑暗中改變字符集。 http://docs.php.net/mysql_set_charset說:「不建議使用mysql_query()來執行SET NAMES ..」 – VolkerK 2010-08-23 12:16:38

+0

我使用的PDO,這是偉大的工作:) 所以我寫了這個「應該工作」,當使用mysql/mysqli驅動程序 – canni 2010-08-23 12:17:39

+0

但你可能也使用PDO的參數化查詢,是嗎? – VolkerK 2010-08-23 12:20:05

0

文件本身的編碼是否正確?

您是否嘗試過使用utf8_encode或utf8_decode? 參見:http://php.net/manual/en/function.utf8-encode.php

如果utf8_encode有效,我會假設數據庫的結果是錯誤的字符集。

如果utf8_decode工作,我會認爲該文件有錯誤的字符集或瀏覽器解析它在錯誤的字符集。 這可以固定頭:

header('Content-Type: text/html; charset=utf-8'); 

或<頭>:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

見:http://tlt.its.psu.edu/suggestions/international/web/tips/declare.html