解決PHP json_encode() MySQL抓取中文字資料顯示空白、問號、null、亂碼問題

 

以下有兩種方法分別為mysqli_query與mysql_query連結資料庫的方式,然後使用json_encode()將資料庫轉為json資料格式呈現在網頁上。

 

MySQL json_encode()中文字空白頁面、問號符號、亂碼

主要嘗試抓取mysql資料碰到的大問題就是中文資料問題,一開始抓取資料,我使用的是自行用架設的XAMPP Server做測試,結果抓取資料時我一次SELECT * 所有的欄位,然後json_edcode(),結果頁面完全沒有任何的東西,空白頁面,測試之後SELECT 其中欄位,只有數值或英文的表單欄位,正常顯示。結果SELECT有中文欄位資料,就發現是空白頁面,大致上可以了解是中文json_encode()時無法出現。

又嘗試一個小實驗,測試一下json_encode()中文的問題,是否可以正常顯示,只是文件上沒有指定為utf8會為亂碼,手動將遊覽器編碼為utf8就可以正常顯示。

 

<?php
echo json_encode(array('id' => '123', 'data' => 'abc'), JSON_NUMERIC_CHECK);
echo json_encode(array('id' => '123', 'data' => '中文', JSON_UNESCAPED_UNICODE);
echo json_encode(array('id' => 123, 'data' => 'abc'));
?>

 

輸出結果:
 

 

{"id":123,"data":"abc"}{"id":"123","data":"中文"}{"id":123,"data":"abc"} 

 

以上結果代表只有抓取MySQL時json_encode()中文會有無法顯示的問題。

我也懷疑自己架設的XAMPP是不是設定哪些功能沒有開啟,而導致這個空白結果,於是又使用自行租用的主機測試了一下,結果 MySQL抓取資料庫json_encode()中文部分有顯示出來,只是所有的值都是“?”問號,在XAMPP是空白任何東西(是完全空白頁面),在這租用的主機上有顯示數值,真是個怪現象。


後來我在網路上找到了,以下連結mysql json_encode()的程式,標榜能正常顯示中文,果真顯示出來了,但這次不是問號“?”都是為亂碼:
 

 

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?php
//建立数据库连接
//$con = mysql_connect ( "localhost", "name", "yourpwd" );
if (! $con) {
    die ( 'Could not connect: ' . mysql_error () );
}
//选择查询的数据库
mysql_select_db ( "china_city", $con );
//设置字符集为UTF-8
mysql_query ( "set names utf8" );
$query = "select * from provincial";
//执行SQL语句
$result = mysql_query ( $query );
//循环 将查询的数据存入数组
while ( $row = mysql_fetch_assoc ( $result ) ) {
    $response [] = $row;
}
//使用Foreach遍历数组 同时使用urlencode处理 含有中文的字段
foreach ( $response as $key => $value ) {
    $newData[$key] = $value;
    $newData [$key] ['Provincial'] = urlencode ( $value ['Provincial'] );
}
echo urldecode ( json_encode ( $newData ) );
mysql_close ( $con );
?>

 

輸出結果中文亂碼顯表現如下:

 

{"a":"\u8292\u679c\u5c0f\u7ad9"}

 

後來將json_encode部分加入JSON_UNESCAPED_UNICODE(不編碼成Unicode),成功正常顯示中文字。(網路教學urldecode ()可以解決編碼的問題,但也不知為什麼在這行不通,只好使用"JSON_UNESCAPED_UNICODE " PHP 5.4才支援)

以上程式碼其實直接json_encode($respons)就可以,好像下面一行urlencode幾乎沒意義了,我將他改寫為以下方式。
 

 

<?php
//建立数据库连接
$con = mysql_connect ( "localhost", "name", "yourpwd" );
if (! $con) {
    die ( 'Could not connect: ' . mysql_error () );
}
//選擇查詢的數據庫
mysql_select_db ( "china_city", $con );
//設置字符集為UTF-8
mysql_query ("set names utf8" );
$query = "select title from `provincial`";
//執行SQL語句
$result = mysql_query ( $query );
//循環 將查詢的數據存入數組
while ( $row = mysql_fetch_assoc ( $result ) ) {
    $response [] = $row;
}
echo json_encode($response,JSON_UNESCAPED_UNICODE);
mysql_close ( $con );
?>

 

mysql_query與mysqli_query兩者差別

 

回頭查詢為什麼這樣的方式,可以成功讀取MySQL然後使用 json_encode()的中文資料出來,後來有比對與我之前用的程式碼有不同的地方,他是使用mysql_query而我之前用的是mysqli_query,兩者之間有什麼差別,我也搞不清楚,查詢了一下。

功用性有什麼差別我這就不多說了,但重點在這兩者之間連結資料庫的方式有所不同。
 

想了解兩者連結資料庫的寫法差異可連結以下網址比較:

 

mysql:http://php.net/manual/en/function.mysql-select-db.php
mysqli:http://php.net/manual/en/mysqli.select-db.php

然而mysql使這個正常讀取中文資料的程式,我將程式的mysql_query ("set names utf8" );,這短註解掉執行看看,發現用mysql這個原先正常可顯示中文的程式,中文部分也變成問號符號,在XAMPP主機也成為空白頁面,這讓我對mysqli這個程式,是否也是因為set names utf8的原因,手動加入mysqli這支程式mysql_query ("set names utf8" ),卻沒有動作,一樣的同樣是問號的符號。


知道mysql與mysqli兩者連結的寫法有所不同,然而set names utf8也有所不同,怪不得設了等於沒有設,正確mysqli需要這樣寫
 

 

$link = mysqli_connect("myhost","myuser","mypassw","mybd") or die("Error " . mysqli_error($link)); 
mysqli_query($link,"set names utf8");

 

這樣終於是了解其中的問題。以下為mysqli連結mysql json_encode()程式方法
 

 

<?php
    //open connection to mysql db
    $connection = mysqli_connect("myhost","myuser","mypassw","mybd") or die("Error " . mysqli_error($connection));

    //fetch table rows from mysql db
    $sql = "SELECT name from mytable";
    mysqli_query($connection,"set names utf8");
    $result = mysqli_query($connection, $sql) or die("Error in Selecting " .  mysqli_error($connection));

    //create an array
    //$emparray[] = array();
    while($row =mysqli_fetch_assoc($result))
    {
        $emparray[] = $row;
    }
 echo $row;
    echo json_encode($emparray,JSON_UNESCAPED_UNICODE);
    mysqli_close($connection);
?>

 

註:Windows 下的XAMPP 使用mysqli還是無法取得中文資料,一樣的空白頁面。也不知道是什麼原因。
 

 

使用PHP產生的MySQL JSON轉換到 JSON檔 

如過想產生一個.json的檔案可以用下的方法。(只需要先有個.json檔,再將檔案寫入至這個檔案)
 

<?php
    //write to json file
    $fp = fopen('empdata.json', 'w');
    fwrite($fp, json_encode($emparray));
    fclose($fp);
?>

 

Posted in 電腦技巧

Find the last offers by SkyBet at www.bettingy.com BettingY.com Bonuses