วันศุกร์ที่ 16 สิงหาคม พ.ศ. 2556

สอน Web Services PHP ตอนที่ 2 การแสดงข้อมูลสินค้าโดย return ค่าแบบ Array


     วันนี้ประสบความสำเร็จในการศึกษา วิธีสร้าง Web Services ด้วย PHP โดยใช้libraryของ nusoap  ให้สามารถคืนค่าข้อมูลที่เรียกใช้งานไปยังฝั่งClient ในรูปแบบของArrayได้ ผมได้เจอปัญหางงๆอยู่พักนึง คือ ไม่แสดงผลลัพธ์แบบในบทความของฝรั่งที่ผมได้ศึกษา ทั้งที่โค๊ดก็ถูกต้องหมดแล้ว และแสดง Error ประมาณว่า XML error parsing SOAP payload on line 2: Invalid document end

     ซึ่งก็สรุปได้ว่า มันไม่ค่อยรองรับการรีเทิร์นค่าแบบอาเรย์หลายมิติใน PHP เวอร์ชั่นที่ผมใช้งานอยู่ครับ คือ 5.4.2 ก็เลยกลับมาใช้ 5.2.10 และเวอร์ชั่น 5.3 ก็รองรับเหมือนกันครับ ดาวน์โหลดได้จาก http://sourceforge.net/projects/nusoap/    ให้แตกไฟล์ออกมาจะได้โฟลเดอร์ lib กับ samples แล้วCopyเอาไว้ในโฟลเดอร์โปรเจ็คของคุณได้เลย  สำหรับของผม ผมเอาไว้ในโฟเดอร์โปรเจ็คชื่อ soap ซึ่งก็ถือว่าเราได้ติดตั้ง nusoap Web Services สมบูรณ์แล้วครับ
     ต่อไปเราจะมาทดลองเขียนโค๊ดง่ายๆ ในการดึงข้อมูลสินค้าจากฐานข้อมูลร้านค้าออนไลน์มาแสดงกัน โดยเราจะเขียนCodeในฝั่ง Server กับ ฝั่ง Client กันครับ
     ผมได้สร้างโค๊ดฝั่ง Server โดยตั้งชื่อไฟล์ว่า myserver.php และฝั่ง Client ตั้งชื่อว่า myclient.php
ไฟล์ myserver.php เราจะเขียนโค๊ดดังนี้

<?php
require_once("lib/nusoap.php");
$server = new nusoap_server();
$server->configureWSDL('products_wsdl', 'urn:products_wsdl');
$server->soap_defencoding = 'UTF-8';

$server->wsdl->addComplexType(
//ส่งพารามิเตอร์จาก login
        'Login', 'complexType', 'struct', 'all', '', array(
    'username' => array('name' => 'username', 'type' => 'xsd:string'),
    'password' => array('name' => 'password', 'type' => 'xsd:string')
        )
);
$server->wsdl->addComplexType('returnProducts', 'complexType', 'struct', 'all', '', array(
//กำหนดว่าให้ return ค่าอะไรได้บ้าง
    'id_pd' => array('name' => 'id_pd', 'type' => 'xsd:int'),
    'name_pd' => array('name' => 'name_pd', 'type' => 'xsd:string'),
    'detail_pd' => array('name' => 'detail_pd', 'type' => 'xsd:string'),
    'price_pd' => array('name' => 'price_pd', 'type' => 'xsd:int'),
    'img_pd' => array('name' => 'img_pd', 'type' => 'xsd:string')
        )
);
$server->wsdl->addComplexType('Products', 'complexType', 'array', '', 'SOAP-ENC:Array', array(), array(
//รีเทิร์นค่าเป็นแบบ array
    array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:returnProducts[]')
        ), 'tns:returnProducts'
);
$server->register('showProducts', array('login' => 'tns:Login'), array('return' => 'tns:Products'), 'products_wsdl', 'products_wsdl#show', 'rpc', 'encoded', 'Returns matching returnProducts'
);

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

function showProducts($login) {//ฟังก์ชั่นแสดงสินค้า แต่ต้องมีรหัสผ่าน จึงจะดึงสินค้าไปแสดงได้
    $conn = connectDB();
    $results = array();
    $query_check_auth = mysql_query("SELECT COUNT(id_user) AS cUser FROM user WHERE username='" . $login['username'] . "' AND password='" . $login['password'] . "' ");
    $show_check_auth = mysql_fetch_assoc($query_check_auth); //ตรวจสอบรหัสผ่าน เพื่ออนุญาตให้เข้ามาดึงข้อมูลจาก Table product ไปใช้
    if ($show_check_auth['cUser'] == 1) {//แสดงว่ารหัสผ่านถูกต้อง
        $query_products = mysql_query("SELECT * FROM product  ORDER BY name_pd ASC");
        while ($show_products = mysql_fetch_assoc($query_products)) {
            //กำหนดว่าให้แสดงข้อมูลจากฟิลด์ไหนได้บ้าง
            $results[] = array('id_pd' => $show_products['id_pd'],
                'name_pd' => $show_products['name_pd'],
                'detail_pd' => $show_products['detail_pd'],
                'price_pd' => $show_products['price_pd'],
                'img_pd' => $show_products['img_pd']);
        }
    }
    closeDB($conn); //ปิดการเชื่อมต่อกับฐานข้อมูล
    return $results;
    exit();
}

function connectDB() {//ฟังก์ชั่นเชื่อมต่อกับฐานข้อมูล
    $conn = mysql_connect('localhost', 'root', 'root');
    mysql_select_db('db_jpcom', $conn);
    mysql_query('SET NAMES UTF8') or die(mysql_error());
    return $conn;
}

function closeDB($connection) {//ฟังก์ชั่นปิดการเชื่อมต่อกับฐานข้อมูล
    mysql_close($connection);
}

?>

อย่างทีบอกไว้ตั้งแต่ตอนที่ 1 (ศึกษา Web Services (เว็บเซอร์วิส) PHP ตอนที่ 1 ) ครับ Web Services จะใช้มาตรฐานในการแลกเปลี่ยนข้อมูลคือ ภาษา XML
เวลาเรารันโค๊ด myserver.php ขึ้นมาที่เบราเซอร์ โดยพิมพ์ http://localhost/soap/myserver.php?wsdl จะได้ผลลัพธ์เป็น XML ดังรูป


ซึ่งเราจะห็นโครงสร้างต่างๆของคำสั่งที่เราจะส่งพารามิเตอร์เข้าไป เพื่อดึงเอาค่าออกมาแสดง
เราจะเขียนCodeในฝั่ง client คือ ไฟล์ myclient.php ดังนี้
<?php
//require_once('lib/nusoap.php');
//$client = new nusoap_client('http://localhost/soap/myserver.php?wsdl', true); // nusoap มีปัญหากับภาษาไทย
//$result = $client->call('showProducts', array('login' => array('username' => 'user1234', 'password' => 'password1234')));
//เปลี่ยนมาใช้ SoapClient แทน nusoap_client เพื่อแก้ปัญหาภาษาไทยแสดงผลเป็น ???
$client = new SoapClient('http://localhost/soap/myserver.php?wsdl', array(
    "trace" => 1, // enable trace to view what is happening
    "exceptions" => 0, // disable exceptions
    "cache_wsdl" => 0)   // disable any caching on the wsdl, encase you alter the wsdl server
);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>ทดสอบ Web Service ดึงสินค้ามาโชว์</title>
    </head>

    <body>
        <?php
        $result = $client->showProducts(array('username' => 'user1234', 'password' => 'password1234'));
        ?>
        <table width="100%" border="1">
            <tr>
                <td align="center" style="width:60px;"><strong>รูปสินค้า</strong></td>
                <td align="center" style="width:80px;"><strong>รหัสสินค้า</strong></td>
                <td><strong>ชื่อสินค้า</strong></td>
                <td align="center" style="width:80px;"><strong>ราคา</strong></td>
            </tr>
            <?php
            foreach ($result as $k => $v) {
                ?>
                <tr>
                    <td><img src="img_product/thumb/<?= $v->img_pd ?>"  /></td>
                    <td align="center"><?= $v->id_pd ?></td>
                    <td><?= $v->name_pd ?></td>
                    <td align="center"><?= $v->price_pd ?></td>
                </tr>
<?php } ?>
        </table>

    </body>
</html>

คำสั่งที่น่าสนใจคือคำสั่ง

$client = new SoapClient('http://localhost/soap/myserver.php?wsdl', array(
    "trace" => 1, // enable trace to view what is happening
    "exceptions" => 0, // disable exceptions
    "cache_wsdl" => 0)   // disable any caching on the wsdl, encase you alter the wsdl server
);


ผมเรียกใช้ Library อีกตัวนึงครับ ชื่อว่า SoapClient เพื่อแก้ปัญหาการแสดงผลภาษาไทยในฝั่ง Client ถ้าใช้ Libray Nusoap จะแสดงผล ??? ครับ
โดยที่เราต้องไปเปิดใช้งาน SoapClient จากไฟล์ php.ini ก่อน โดยเอาเครื่องหมาย ; หน้าคำสั่ง extension=php_soap.dll ออก แล้วรีสตาร์ท Apache 1 ครั้ง

และคำสั่งที่น่าสนใจ
$result = $client->showProducts(array('username' => 'user1234', 'password' => 'password1234'));


showProducts คือชื่อฟังก์ชั่นที่ผมกำหนดในไฟล์ myservice.php และส่งค่าพารามิเตอร์ไป 2 ค่า คือ username กับ password เพื่อป้องกันไม่ให้คนอื่นเข้ามาดึงข้อมูลของเราไปใช้ ซึ่งจะมีเพียงผู้ที่มีรหัสผ่านเท่านั้น จึงจะสามารถดึงข้อมูลสินค้าจากเว็บขายของมาแสดงได้

ซึ่งจะได้ผลลัพธ์ดังนี้



ไม่มีความคิดเห็น :

แสดงความคิดเห็น