ANDROID : เชื่อมต่อฐานข้อมูล MYSQL บนเซิฟเวอร์

สวัสดีครับ บทความนี้ผมจะมาอธิบายตัวอย่างซึ้งเป็นที่นิยม (จริงๆก็มีบทความเรื่องนี้อยู่มากแล้วหละ) และ บ่อยครั้งเราต้องนำไปใช้งาน นั้นคือการเชื่อมต่อฐานข้อมูล Mysql บนเซิฟเวอร์ของเราผ่านแอนดรอยด์แอพพลิเคชั่น ก่อนที่เราจะมาดูโค้ดตัวอย่างกันผมจะอธิบายหลักการทำงานคร่าวๆของตัวอย่างให้ผู้อ่านได้เข้าใจก่อนจากหัวข้อข้างล่างครับ

!! บทความนี้เหมาะกับผู้ที่ต้องการเก็บข้อมูลลงบนเซิฟเวอร์ ไม่ใช่บนอุปกรณ์แอนดรอยด์ หรือ การ์ดต่างๆ

!! ควรมีความรู้เรื่องฐานข้อมูล Mysql ก่อนนะครับ

อธิบายการทำงานคร่าวๆ

Screenshot from 2014-12-19 20:18:17

รูปที่ 1 แสดงการเข้าถึงฐานข้อมูล Mysql โดยแอนดรอยด์แอพพลิเคชั่น

จากรูปที่ 1 เราแบ่งการทำงานเป็น 2 ฝั่งคือ แอนดรอยด์ และ เซิฟเวอร์ โดยการทำงานมีขั้นตอนดังนี้

1. แอนดอยด์ (Mysql Connector) สั่งให้ php ทำงาน

2. php ทำการเชื่อมต่อและหาข้อมูลจาก Mysql มาแสดงอยู่ในรูปของ json

3. แอนดอยด์อ่าน json จาก php และนำมาแสดง

!! จะเห็นว่าฝั่งแอนดอยด์ทำหน้าที่แค่สั่งและอ่านข้อมูล ส่วนการเชื่อมต่อและค้นหาข้อมูลนั้นทำโดย php 

เอาหล่ะเมื่อเราทราบการทำงานคร่าวๆของตัวอย่างแล้วต่อไป ก็ทำการนำโค้ดตัวอย่างมาทำความเข้าใจกันก่อน

โค้ดตัวอย่าง

สามารถ ดาวน์โหลดโปรเจ็คตัวอย่างได้ที่ -> MysqlExample เมื่อดาวน์โหลดแล้วให้สร้างฐานข้อมูลใน Mysql ตามด้านล่างนะครับ

!! โดยตัวอย่างนี้จำเป็นต้องสร้างฐานข้อมูล Mysql ขึ้นมาเอง และ แก้ไขข้อมูลของเซิฟเวอร์และฐานข้อมูลในไฟล์ .php เป็นของผู้อ่านเองด้วยครับ ซึ้งแสดงว่าโหลดเสร็จยังใช้งานไม่ได้ก่อนนะ

อธิบายฐานข้อมูล

ในตัวอย่างนี้ให้ทำการสร้างฐานข้อมูล และตาราง 1 ตารางชื่อว่า member โดยมีโครงสร้างของตารางตามที่แสดงใน รูปที่ 2 และเพิ่มข้อมูลตัวอย่างลงไปในตารางตาม รูปที่ 3

Screenshot from 2014-12-18 22:04:18

รูปที่ 2 แสดงรายละเอียดตาราง member

Screenshot from 2014-12-18 22:12:53

รูปที่ 3 ตัวอย่างข้อมูลในตาราง member

อธิบายโค้ดตัวอย่าง

PHP_GET_DATA.PHP

ไฟล์นี้ทำหน้าในการเชื่อมต่อฐานข้อมูล Mysql ที่เราสร้างขึ้นโดยจะไป select หรือค้นหาข้อมูลทั้งหมดในตาราง member

!! ไฟล์นี้อยู่ในเซิฟเวอร์นะครับ หรือ locahost

!! ในไฟล์นี้ผู้อ่านต้องทำการเปลี่ยน รายละเอียดในการเชื่อมต่อฐานข้อมูลเป็นของตัวเองในส่วนที่ผมไฮไลท์สีแดงไว้

1:<?php   
2:  header("content-type:text/javascript;charset=utf-8");    
3:  $con=mysql_connect('hostname','mysql_username','mysql_password')or die(mysql_error());    
4:  mysql_select_db('mysql_db_name')or die(mysql_error());   
5:  mysql_query("SET NAMES UTF8");   
6:  $sql="SELECT * FROM member";   
7:  $res=mysql_query($sql);   
8:  while($row=mysql_fetch_assoc($res)){   
9:      $output[]=$row;   
10:  }   
11:  print(json_encode($output));   
12:  mysql_close();   
13:?>   

ซึ้งผลลัพธ์ที่ได้จากการทำงานของ php_get_data.php จะแสดงในรูปของ json ตามรูปที่ 4

Screenshot from 2014-12-18 22:15:22

รูปที่ 4 ผลลัพธ์ที่ php แสดงผลในรูปแบบ json

MYSQLCONNECTION.JAVA

ไฟล์นี้เป็นส่วนสำคัญของตัวอย่างนี้เลยครับ ซึ้งผมจะแยกอธิบายโค้ดเป็น 3 ส่วน เริ่มจากส่วนบนสุดก่อนเลยนะ ตรงนี้จะเป็นส่วนที่ส่ง httppost ไปยังไฟล์ php_get_data.php ผู้อ่านสามารถแก้ url ในจุดที่ผมไฮไลท์สีแดงไว้ และ คอมเม้นท์ด้านหลังคือตัวอย่างครับ

!! หากไม่สามารถเชื่อมต่อไปยัง url ได้ logcat จะแสดงว่า “Error in http connection” .. แสดงว่า url ผิดหรืออินเตอร์เน็ตไม่สามารถเชื่อมต่อกับ url ได้

 try {  
       ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
                /* Set to Http post*/  
                /* End set Value*/  
       HttpClient httpclient = new DefaultHttpClient();  
                /* Set URL*/  
       HttpPost httppost = new HttpPost("your url"); // https://10.0.2.2/php_get_data.php  
                /* End Set URL*/  
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));  
       HttpResponse response = httpclient.execute(httppost);  
       HttpEntity entity = response.getEntity();  
       is = entity.getContent();  
     } catch (Exception e) {  
       Log.d("log_err", "Error in http connection " + e.toString());  
       return list;  
     }  

ส่วนที่ 2 จะทำการอ่านผลลัพธ์ของ php_get_data.php จากรูปที่ 4 มาเก็บไว้เป็น string

 try {  
       BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));  
       StringBuilder sb = new StringBuilder();  
       String line = null;  
       while ((line = reader.readLine()) != null) {  
         sb.append(line);  
       }  
       is.close();  
       js_result = sb.toString();  
     } catch (Exception e) {  
       Log.e("log_tag", "Error converting result " + e.toString());  
       return list;  
     }  

และส่วนสุดท้ายเราจะนำ string ที่ได้มาแปลงเป็น JSONArray และทำการวนเก็บค่าไว้ใน HashMap ท้ายสุดเราก็จะทำการเก็บ HashMap ไว้ใน ArrayList อีกทีหนึ่งเพื่อเป็นผลลัพธ์ของฟังก์ชั่น (HashMap เก็บข้อมูลของ user หนึ่งคนและเมื่อใส่ใน ArryaList ก็จะแทน user ทั้งหมดที่เป็นคำตอบของการ select)

!! หาก logcat แสดงข้อมูลว่า “Error parsing data ….” แสดงว่าไม่สามารถแปลงผลลัพธ์ที่ได้จาก php มาเป็น JSONArray ส่วนมากแล้วจะมากจากผลลัพธ์ที่ได้จาก php ผิดพลาด

 try {  
       final JSONArray jArray = new JSONArray(js_result);  
       for (int i = 0; i < jArray.length(); i++) {  
         JSONObject jo = jArray.getJSONObject(i);  
         HashMap<String, String> user = new HashMap<String,String>();  
         user.put("id", jo.get("id").toString());  
         user.put("username", jo.get("username").toString());  
         user.put("pass", jo.get("pass").toString());  
         list.add(user);  
       }  
     } catch (JSONException e) {  
       Log.e("log_tag", "Error parsing data " + e.toString());  
       return list;  
     }  

MAINACTIVITY.JAVA

ส่วนของ MainActivity ทำหน้าที่ในการขอผลลัพธ์จากฟังก์ชั่น selectAllUser มาแสดงผลใน ListView (โค้ดบรรทัดที่ 4 และ 5 เป็นการขออนุญาติในการเชื่อมต่ออินเตอร์เน็ตใน main thread)

1:  protected void onCreate(Bundle savedInstanceState) {  
2:      super.onCreate(savedInstanceState);  
3:      setContentView(R.layout.activity_main);  
4:      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();  
5:      StrictMode.setThreadPolicy(policy);  
6:      listView = (ListView)findViewById(R.id.listView);  
7:      ArrayList<HashMap<String,String>> result = MysqlConnector.selectAllUser();  
8:      String[] resultList = new String[result.size()];  
9:      Log.e("test", result.size()+"");  
10:      for(int i = 0;i<result.size();i++){  
11:        resultList[i] = result.get(i).get("username");  
12:      }  
13:      ArrayAdapter<String> atdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,resultList);  
14:      listView.setAdapter(atdapter);  
15:    }  

ในส่วนของการอธิบายโค้ดตัวอย่างก็จบแต่เพียงเท่านี้ครับ ซึ้งตัวอย่างนี้ก็แสดงถึงภาพรวมในการทำให้แอนดรอยด์แอพพลิเคชั่นเชื่อมต่อฐานข้อมูล Mysql ผ่าน php คิดว่าตัวอย่างนี้จะทำให้ผู้อ่านเข้าใจและนำไปประยุกต์ใช้ได้ครับ บทความต่อไปจะนำฟังก์ชั่น พื้นฐานในการทำงานร่วมกับฐานข้อมูลเช่น insert, update, delete มาเป็นตัวอย่างครับ

ผลลัพธ์ตัวอย่าง

Screenshot from 2014-12-18 22:26:00

รูปที่ 5 แสดงผลลัพธ์การเชื่อมต่อฐานข้อมูล Mysql บนแอนดรอยด์แอพพลิเคชั่น

ANDROID: (INSERT) การเพิ่มข้อมูลบน MYSQL

octoboy | January 31, 2015 | Android | 0 Comments

สวัสดีครับ บทความนี้ผมมาอธิบายต่อจากบทความที่แล้ว (เชื่อมต่อฐานข้อมูล Mysql บนเซิฟเวอร์) ซึ้งผมได้แบ่งเนื้อหามาอธิบายทีละเล็กน้อย ในส่วนนี้คือการเพิ่มข้อมูล(Insert) ลงฐานข้อมูล Mysql เอาหละไปดูโค้ดกัน

!! ควรย้อนไปอ่านบทความ “เชื่อมต่อฐานข้อมูล Mysql บนเซิฟเวอร์” ก่อนนะครับ

โค้ดตัวอย่าง

สามารถดาวน์โหลดโปรเจ็คตัวอย่างได้ที่ -> MysqlExample(Insert)

!! ใช้ฐานข้อมูลชุดเดิมจากบทความ เชื่อมต่อฐานข้อมูล Mysql บนเซิฟเวอร์

อธิบายฐานข้อมูล

ขออธิบายถึงฐานข้อมูลของตัวอย่างที่แล้ว ในฐานข้อมูลมี 1 ตารางชื่อว่า member โดยมีโครงสร้างของตารางตามที่แสดงใน รูปที่ 1 และ มีข้อมูลตัวอย่างในตารางตาม รูปที่ 2

Screenshot from 2014-12-18 22:04:18

รูปที่ 1 แสดงรายละเอียดตาราง member

Screenshot from 2014-12-18 22:12:53

รูปที่ 2 ตัวอย่างข้อมูลในตาราง member

INSERT (เพิ่มข้อมูล)

INSERT_DATA.PHP

ไฟล์นี้ทำการรับค่า username และ pass ผ่าน http post (แอนดอร์ยส่งมา) และเพิ่มข้อมูลลงฐานข้อมูล Mysql

!! ไฟล์นี้อยู่ในเซิฟเวอร์นะครับ หรือ localhost

!! ในไฟล์นี้ผู้อ่านต้องทำการเปลี่ยน รายละเอียดในการเชื่อมต่อฐานข้อมูลเป็นของตัวเองในส่วนที่ผมไฮไลท์สีแดงไว้

 <?php   
 header("content-type:text/javascript;charset=utf-8");    
 $con=mysql_connect('mysql_server','mysql_username','mysql_pass')or die(mysql_error());    
 mysql_select_db('db_name')or die(mysql_error());   
 mysql_query("SET NAMES UTF8");   
 $username = $_POST['username'];  
 $pass = $_POST['pass'];  
 $sql="INSERT INTO member (username,pass) VALUES ('$username','$pass')";   
 $res=mysql_query($sql);   
 $arr = array('id' => mysql_insert_id()."");  
 print('['.json_encode($arr).']');   
 mysql_close();   
 ?>   

INSERT_ACTIVITY.JAVA

Activity นี้กำหนดให้เมื่อเรากดคลิ๊กที่ปุ่ม Insert จะทำการเรียกใช้ฟังก์ชั่น insertUser ในคลาส MysqlConnector โดยนำข้อมูลจาก EditText มาเป็นข้อมูลในการเพิ่มครับ (คือ username และ pass)

   @Override  
   public void onClick(View v) {  
     switch (v.getId()){  
       case R.id.btn_Insert:  
         Intent intent = new Intent(this,Insert_Activity.class);  
         startActivity(intent);  
         break;  
       default:  
         break;  
     }  
   }  

MYSQLCONNECTOR.JAVA

ในฟังก์ชั่น insertUser ทำการรับพารามิเตอร์ 2 ค่าคือ username และ pass ในการเพิ่มข้อมูลลงในตาราง member โดยทำการเรียกใช้ insert_data.php

!! หากไม่สามารถเชื่อมต่อไปยัง url ได้ logcat จะแสดงว่า “Error in http connection” .. แสดงว่า url ผิดหรืออินเตอร์เน็ตไม่สามารถเชื่อมต่อกับ url ได้

 try{  
       // Define Data  
       ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
       nameValuePairs.add(new BasicNameValuePair("username",username));  
       nameValuePairs.add(new BasicNameValuePair("pass",pass));  
       // Connect Server  
       HttpClient httpclient = new DefaultHttpClient();  
       HttpPost httppost = new HttpPost("..."); // https://10.0.2.2/  
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));  
       HttpResponse response = httpclient.execute(httppost);  
       HttpEntity entity = response.getEntity();  
       is = entity.getContent();  
     } catch (Exception e) {  
       Log.d("log_err", "Error in http connection " + e.toString());  
       return -1;  
     }  

ส่วนที่ 2 จะทำการอ่านผลลัพธ์ของ insert_data.php (ส่งค่า id ล่าสุดที่ทำการ insert) มาเก็บไว้เป็น string

 try {  
       BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));  
       StringBuilder sb = new StringBuilder();  
       String line = null;  
       while ((line = reader.readLine()) != null) {  
         sb.append(line);  
       }  
       is.close();  
       js_result = sb.toString();  
     } catch (Exception e) {  
       Log.e("log_tag", "Error converting result " + e.toString());  
       return -1;  
     }  

และส่วนสุดท้ายเราจะนำ string ที่ได้มาแปลงเป็น JSONArray และเก็บค่าไว้ในตัวแปร id (ในกรณีนี้เราส่งกลับมาแค่ค่าเดียว)

!! หาก logcat แสดงข้อมูลว่า “Error parsing data ….” แสดงว่าไม่สามารถแปลงผลลัพธ์ที่ได้จาก php มาเป็น JSONArray ส่วนมากแล้วจะมากจากผลลัพธ์ที่ได้จาก php ผิดพลาด

 try {  
       final JSONArray jArray = new JSONArray(js_result);  
       for (int i = 0; i < jArray.length(); i++) {  
         String[] comment = new String[3];  
         JSONObject jo = jArray.getJSONObject(i);  
         id = Integer.parseInt((jo.get("id").toString()));  
       }  
     } catch (JSONException e) {  
       Log.e("log_tag", "Error parsing data " + e.toString());  
       return -1;  
     }  

การเพิ่มข้อมูลลงใน Mysql ก็จบเพียงเท่านี้ครับยังไงบทความต่อไปจะมาอธิบายเพิ่มเติมในส่วน Update ซึ่งก็คล้ายๆกันครับ

ผลลัพธ์ตัวอย่าง

Screenshot_2015-01-31-00-40-52
Screenshot_2015-01-31-00-41-19
Screenshot_2015-01-31-00-41-26