PHP SQL Server (PDO) : UTF-8 Encoding (Multiple Language/รองรับภาษาไทย) |
PHP SQL Server (PDO) : UTF-8 Encoding (Multiple Language/รองรับภาษาไทย) ในการเขียน PHP เพื่อติดต่อกับ Database ของ SQL Server ด้วยฟิังก์ชั่นของ PDO กับ sqlsrv ปัญหาที่หลาย ๆ คนเจอคือมีปัญหาเรื่องภาษาไทย และ ภาษาอื่น ๆ เช่น ญี่ปุ่น , จีน หรืออื่น ๆ ซึ่งวิธีการแก้ไขนั้นต้องบอกว่าปัญหาเหล่านี้ในตัว PHP , Connector และ Database ได้ถูกปรับปรุงและแก้ไขได้ 100% แต่เราจะต้องทำการ Config ค่าและเรียกใช้มันให้เป็น มันถึงจะทำงานได้อย่างถูกต้อง และ รองรับได้ทุกภาษาที่ต้องการ
การทำงานที่ถูกต้องจะต้องแสดงผลภาษาได้อย่างถูกต้อง ทั้งดูใน Database และแสดงบนหน้าเว็บ ในกรณีที่แสดงผลผิดเพี้ยนที่ใดที่หนึ่ง แสดงว่ามีการกำหนดค่าที่ผิดแน่นอน และมันจะเป็นปัญหาสะสมในอนาคตแน่นอน ในการใช้งานที่ถูกต้องจะต้องมีขั้นตอนดังนี้
Step 1 : กำหนด DataType ของ Column เป็นแบบ NVARCHAR()
Step 2 : ในหน้าเว็บจะต้องกำหนด meta ในส่วนของ header โดยให้ charset=utf-8
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Step 3 : เพิ่ม SQLSRV_ENCODING_UTF8 ในส่วนของ Connection (ปกติแล้ว Step 3 จะเป็นค่า Default ของ Connector ไม่ต้องกำหนดก็ได้)
$conn = new PDO("sqlsrv:server=$serverName ; Database = $dbName", $userName, $userPassword);
$conn->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8);
โดยจะต้องกำหนดให้ถูกต้องทั้ง 3 ส่วนนี้ให้ถูกก่อน
Note!!. ในกรณีที่ข้อมูลเก่าก่อนการใช้งาน ยังเป็นข้อมูลที่ผิดอยู่ จะไม่สามารถใช้ขั้นตอนนี้ในการแสดงผลภาษาไทยให้ถูกต้องได้ ซึ่งจะต้องกลับไปแก้ไขข้อมูลเก่าให้ถูกต้อง
Example ตัวอย่างการ Insert และแสดงข้อมูลภาษาไทยด้วย UTF-8 (PDO กับ sqlsrv)
add.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ThaiCreate.Com PHP & SQL Server (PDO)</title>
</head>
<body>
<form action="save.php" name="frmAdd" method="post">
<table width="284" border="1">
<tr>
<th width="120">CustomerID</th>
<td width="238"><input type="text" name="txtCustomerID" size="5"></td>
</tr>
<tr>
<th width="120">Name</th>
<td><input type="text" name="txtName" size="20"></td>
</tr>
<tr>
<th width="120">Email</th>
<td><input type="text" name="txtEmail" size="20"></td>
</tr>
<tr>
<th width="120">CountryCode</th>
<td><input type="text" name="txtCountryCode" size="2"></td>
</tr>
<tr>
<th width="120">Budget</th>
<td><input type="text" name="txtBudget" size="5"></td>
</tr>
<tr>
<th width="120">Used</th>
<td><input type="text" name="txtUsed" size="5"></td>
</tr>
</table>
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
save.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ThaiCreate.Com PHP & SQL Server (PDO)</title>
</head>
<body>
<?php
ini_set('display_errors', 1);
error_reporting(~0);
$serverName = "localhost";
$userName = "sa";
$userPassword = "";
$dbName = "mydatabase";
$conn = new PDO("sqlsrv:server=$serverName ; Database = $dbName ", $userName, $userPassword);
$conn->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8);
$sql = "INSERT INTO customer (CustomerID, Name, Email, CountryCode, Budget, Used)
VALUES (?, ?, ?, ?, ?, ?)";
$params = array($_POST["txtCustomerID"], $_POST["txtName"], $_POST["txtEmail"], $_POST["txtCountryCode"], $_POST["txtBudget"], $_POST["txtUsed"]);
$stmt = $conn->prepare($sql);
$stmt->execute($params);
if( $stmt->rowCount() ) {
echo "Record add successfully";
}
$conn = null;
?>
</body>
</html>
list.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ThaiCreate.Com PHP & SQL Server (PDO)</title>
</head>
<body>
<?php
ini_set('display_errors', 1);
error_reporting(~0);
$serverName = "localhost";
$userName = "sa";
$userPassword = "";
$dbName = "mydatabase";
$conn = new PDO("sqlsrv:server=$serverName ; Database = $dbName", $userName, $userPassword);
$conn->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8);
$sql = "SELECT * FROM customer";
$stmt = $conn->prepare($sql);
$stmt->execute();
?>
<table width="600" border="1">
<tr>
<th width="91"> <div align="center">CustomerID </div></th>
<th width="98"> <div align="center">Name </div></th>
<th width="198"> <div align="center">Email </div></th>
<th width="97"> <div align="center">CountryCode </div></th>
<th width="59"> <div align="center">Budget </div></th>
<th width="71"> <div align="center">Used </div></th>
</tr>
<?php
while($result = $stmt->fetch( PDO::FETCH_ASSOC ))
{
?>
<tr>
<td><div align="center"><?php echo $result["CustomerID"];?></div></td>
<td><?php echo $result["Name"];?></td>
<td><?php echo $result["Email"];?></td>
<td><div align="center"><?php echo $result["CountryCode"];?></div></td>
<td align="right"><?php echo $result["Budget"];?></td>
<td align="right"><?php echo $result["Used"];?></td>
</tr>
<?php
}
?>
</table>
<?php
$conn = null;
?>
</body>
</html>
</body>
</html>
Screenshot
ทดสอบการ Insert ข้อมูลภาษาไทย
ทดสอบการ Insert ข้อมูลภาษาญี่ปุ่น
ใน Table จัดเก็บข้อมูลอย่างถูกต้องทั้งภาษาไทยและภาษาญี่ปุ่น
เมื่อดึงมาแสดงผลก็สามารถแสดงผลได้อย่างถูกต้อง
|