1.db.php 封装好的用于连接数据库的类
- <?php
- class Db{
- static private $_instance;
- static private $_connectSource;
- //因为是连接新浪sae服务器所以下面的参数不生效。
- /*private $_dbConfig=array(
- 'host'=>'127.0.0.1',
- 'user'=>'root',
- 'password'=>'',
- 'database'=>'value'
- ); */
- private function _construct(){
- }
- static public function getInstance(){
- //如果没有实例,则创建, 然后返回已创建的实例
- if(!(self::$_instance instanceof self)){
- self::$_instance =new self();
- }
- return self::$_instance;
- }
- public function connect(){
- if(!self::$_connectSource){
- self::$_connectSource=mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
- //self::$_connectSource = @mysql_connect($this->_dbConfig['host'], $this->_dbConfig['user'], $this->_dbConfig['password']);
- if(!self::$_connectSource){
- //如果数据库连接不成功
- //抛出异常,在调用该connnect()函数时,通过try catch 进行捕获
- throw new Exception ('mysql connect error'.mysql_error);
- //die('mysql connect error'.mysql_error);
- }
- mysql_select_db(SAE_MYSQL_DB,self::$_connectSource);
- //mysql_select_db($this->_dbConfig['database'], self::$_connectSource);
- mysql_query("set names UTF8",self::$_connectSource);
- }
- return self::$_connectSource;
- }
- }
2.response.php 用于封装通信数据(json或者xml)
- <?php
- class Response {
- const JSON = "json";
- /**
- * 按综合方式输出通信数据
- * @param integer $code 状态码
- * @param string $message 提示信息
- * @param array $data 数据
- * @param string $type 数据类型
- * return string
- */
- public static function show($code, $message = '', $data = array(), $type = self::JSON) {
- if(!is_numeric($code)) {
- return '';
- }
- $type = isset($_GET['format']) ? $_GET['format'] : self::JSON;
- $result = array(
- 'code' => $code,
- 'message' => $message,
- 'data' => $data,
- );
- if($type == 'json') {
- self::json($code, $message, $data);
- exit;
- } elseif($type == 'array') {
- var_dump($result);
- } elseif($type == 'xml') {
- self::xmlEncode($code, $message, $data);
- exit;
- } else {
- // TODO
- }
- }
- /**
- * 按json方式输出通信数据
- * @param integer $code 状态码
- * @param string $message 提示信息
- * @param array $data 数据
- * return string
- */
- public static function json($code, $message = '', $data = array()) {
- if(!is_numeric($code)) {
- return '';
- }
- $result = array(
- 'code' => $code,
- 'message' => $message,
- 'data' => $data
- );
- echo json_encode($result);
- exit;
- }
- /**
- * 按xml方式输出通信数据
- * @param integer $code 状态码
- * @param string $message 提示信息
- * @param array $data 数据
- * return string
- */
- public static function xmlEncode($code, $message, $data = array()) {
- if(!is_numeric($code)) {
- return '';
- }
- $result = array(
- 'code' => $code,
- 'message' => $message,
- 'data' => $data,
- );
- //header("Content-Type:text/xml");
- $xml = "<?xml version='1.0' encoding='UTF-8'?>\n";
- $xml .= "<root>\n";
- $xml .= self::xmlToEncode($result);
- $xml .= "</root>";
- echo $xml;
- }
- public static function xmlToEncode($data) {
- $xml = $attr = "";
- foreach($data as $key => $value) {
- if(is_numeric($key)) {
- $attr = " id='{$key}'";
- $key = "item";
- }
- $xml .= "<{$key}{$attr}>";
- $xml .= is_array($value) ? self::xmlToEncode($value) : $value;
- $xml .= "</{$key}>\n";
- }
- return $xml;
- }
- }
3.checklogin.php 提供给客户端 ,让客户端使用GET请求,传入username,passwd 验证登录
- <?php
- //这是app验证登录接口
- //访问方式http://****.com/bee/checklogin.php
- if($_GET['format']=='xml'){
- header("Content-Type:text/xml");}
- require_once('./response.php');//引入数据封装类
- require_once('./db.php');//引入数据库类
- $username=$_GET['username'];
- $passwd=$_GET['passwd'];
- $sql = "select * from user where `username`='$username' and `passwd`='$passwd'";
- try{
- $connect=Db::getInstance()->connect();
- }catch(Exception $e){
- Response::show(403,'数据库连接失败');
- }
- $result=mysql_query($sql,$connect);
- $videos=array();
- //mysql_fetch_assoc()字段名key植是value,方便客户端解析。每行获取,区别与mysql_fetch_array()
- while($video=mysql_fetch_assoc($result)){
- $videos[]=$video;
- }
- //这样就从数据库中获取了数据存到了$videos[]中,接着需要转换成接口数据
- if($videos){
- Response::show(200,'首页数据获取成功',$videos);
- //这样默认生成了json数据,如果需要xml数据,需要在访问时http://...com/list.php?format=xml
- }else{
- Response::show(400,'首页数据获取失败',$videos);
- }
------------------------------------------------------------------------------------------------------------------------------------------------------------
到这里服务端代码已经完成,接受客户端的hhtp get请求,通过查询数据库,验证用户名,密码是否正确。将结果封装成json或者xml,输出在浏览器中。供客户端读取。
下面是安卓客户端部分代码:
布局文件就不展示了,就是两个textview 和两个edittext,还有一个Button
直接上MainActivity.Java
- package com.example.bee;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import org.json.JSONArray;
- import org.json.JSONException;
- import org.json.JSONObject;
- import android.app.Activity;
- import android.content.Intent;
- import android.content.SharedPreferences;
- import android.content.SharedPreferences.Editor;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.Toast;
- public class Login extends Activity {
- /**
- * 用于登录的界面
- */
- String result="",user,passwd;
- Handler myhandler;
- EditText userview,passwdview;
- Button login,register;
- Thread t;
- SharedPreferences sp;
- int code;
- String realname;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.login);
- userview=(EditText) findViewById(R.id.login_edt_user);
- passwdview=(EditText) findViewById(R.id.login_edt_passwd);
- login=(Button) findViewById(R.id.btn_login);
- register=(Button) findViewById(R.id.btn_register);
- sp=getSharedPreferences("login", MODE_PRIVATE);
- String getname=sp.getString("username", null);
- if(getname==null)
- {
- Toast.makeText(Login.this, "sp null", 0).show();
- }else{
- Toast.makeText(Login.this, "sp have", 0).show();
- userview.setText(sp.getString("username", null));
- passwdview.setText(sp.getString("passwd", null));
- }
- //登陆按钮点击事件
- login.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- t=new Thread(new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- try {
- user=userview.getText().toString();
- passwd=passwdview.getText().toString();
- URL url=new URL("http://luo.sinaapp.com/e/checklogin.php?username="+user+"&passwd="+passwd);
- HttpURLConnection urlConnection=(HttpURLConnection) url.openConnection();
- InputStreamReader isr=new InputStreamReader(urlConnection.getInputStream());
- BufferedReader br=new BufferedReader(isr);
- result=br.readLine();
- //对获得的json数据进行解析
- try {
- JSONObject object=new JSONObject(result);
- code=object.getInt("code");
- JSONArray ja= object.getJSONArray("data");
- String data=ja.getString(0);
- JSONObject secondobject=new JSONObject(data);
- realname=secondobject.getString("realname");
- } catch (JSONException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Message m1=myhandler.obtainMessage();
- if(code==400)//登录失败
- {
- m1.what=1;
- myhandler.sendMessage(m1);
- }else if(code==200){//登录成功
- m1.what=2;
- myhandler.sendMessage(m1);
- }else{//其他情况:联网失败,服务器异常等
- m1.what=3;
- myhandler.sendMessage(m1);
- }
- } catch (MalformedURLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- });
- t.start();
- }
- });
- //注册点击事件
- /*register.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Intent i=new Intent(Login.this,RegisterActivity.class);
- startActivity(i);
- }
- });*/
- myhandler=new Handler(){
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- if(msg.what==1){
- Toast.makeText(Login.this, "用户名或密码不正确", 0).show();
- } else if(msg.what==2){
- Toast.makeText(Login.this, "欢迎您:"+realname, 0).show();
- /*登陆成功将数据写到本地保存下来,以便下次自动额登陆*/
- sp=getSharedPreferences("login", MODE_PRIVATE);
- Editor editor=sp.edit();
- editor.putString("username", user);
- editor.putString("passwd", passwd);
- editor.putString("realname", realname);
- editor.commit();
- Intent i = new Intent(Login.this, MainActivity.class);
- startActivity(i);
- finish();
- } else {
- Toast.makeText(Login.this, "网络连接失败", 0).show();
- }
- }
- };
- }
- }