我们先来看一个简单的Android app例子(这里是一个商品存货清单项目),在Android程序中,我们可以访问(call)PHP脚本来执行简单的CRUD操作(创建,读取,更新,删除)。为了使你对它的体系结构有一个大概的了解,这里先说一下它是怎么工作的。首先你的Android项目访问(call)PHP脚本来执行一条数据操作,我们称它为“创建”。然后PHP脚本连接MySQL数据库来执行这个操作。这样,数据从Android程序流向PHP脚本,最终存储在MySQL数据库中。
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:做网站、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的新北网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
好了,让我们来深入的看一下。
请注意:这里提供的代码只是为了使你能简单的连接Android项目和PHP,MySQL。你不能把它作为一个标准或者安全编程实践。在生产环境中,理想情况下你需要避免使用任何可能造成潜在注入漏洞的代码(比如MYSQL注入)。MYSQL注入是一个很大的话题,不可能用单独的一篇文章来说清楚,并且它也不在本文讨论的范围内,所以本文不以讨论。
1. 什么是WAMP Server
WAMP是Windows,Apache,MySQL和PHP,Perl,Python的简称。WAMP是一个一键安装的软件,它为开发PHP,MySQL Web应用程序提供一个环境。安装这款软件你相当于安装了Apache,MySQL和PHP。或者,你也可以使用 XAMP 。
2. 安装和使用WAMP Server
在浏览器中输入 来测试你的服务器是否安装成功。同样的,也可以打开 来检验phpmyadmin是否安装成功。
3. 创建和运行PHP项目
现在,你已经有一个能开发PHP和MYSQL项目的环境了。打开安装WAMP Server的文件夹(在我的电脑中,是C:\wamp\),打开www文件夹,为你的项目创建一个新的文件夹。你必须把项目中所有的文件放到这个文件夹中。
新建一个名为android_connect的文件夹,并新建一个php文件,命名为test.php,尝试输入一些简单的php代码(如下所示)。输入下面的代码后,打开 ,你会在浏览器中看到“Welcome,I am connecting Android to PHP,MySQL”(如果没有正确输入,请检查WAMP配置是否正确)
test.php
?php
echo"Welcome, I am connecting Android to PHP, MySQL";
?
4. 创建MySQL数据库和表
在本教程中,我创建了一个简单的只有一张表的数据库。我会用这个表来执行一些示例操作。现在,请在浏览器中输入 ,并打开 phpmyadmin。 你可以用PhpMyAdmin工具创建数据库和表。
创建数据库和表:数据库名:androidhive,表:product
CREATE DATABASE androidhive;
CREATE TABLE products(
pid int(11) primary key auto_increment,
name varchar(100) not null,
price decimal(10,2) not null,
description text,
created_at timestamp defaultnow(),
updated_at timestamp
);
5. 用PHP连接MySQL数据库
现在,真正的服务器端编程开始了。新建一个PHP类来连接MYSQL数据库。这个类的主要功能是打开数据库连接和在不需要时关闭数据库连接。
新建两个文件 db_config.php,db_connect.php
db_config.php-------- 存储数据库连接变量
db_connect.php------- 连接数据库的类文件
db_config.php
?php
/*
* All database connection variables
*/
define('DB_USER', "root"); // db user
define('DB_PASSWORD', ""); // db password (mention your db password here)
define('DB_DATABASE', "androidhive"); // database name
define('DB_SERVER', "localhost"); // db server
db_connect.php
?php
/**
* A class file to connect to database
*/
classDB_CONNECT {
// constructor
function__construct() {
// connecting to database
$this-connect();
}
// destructor
function__destruct() {
// closing db connection
$this-close();
}
/**
* Function to connect with database
*/
functionconnect() {
// import database connection variables
require_once__DIR__ . '/db_config.php';
// Connecting to mysql database
$con= mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD) ordie(mysql_error());
// Selecing database
$db= mysql_select_db(DB_DATABASE) ordie(mysql_error()) ordie(mysql_error());
// returing connection cursor
return$con;
}
/**
* Function to close db connection
*/
functionclose() {
// closing db connection
mysql_close();
}
}
?
怎么调用 :当你想连接MySQl数据库或者执行某些操作时,可以这样使用db_connect.php
$db= newDB_CONNECT(); // creating class object(will open database connection)
6. 使用PHP执行基本CRUD操作
在这部分,我将讲述使用PHP对MySQL数据库执行基本CRUD(创建,读取,更新,删除)操作。
如果你是PHP和MySQL新手,我建议你可以先学习 PHP 和 SQL 基础知识。
6. a)在MYSQL中新建一行(创建一行新的产品)
在你的PHP项目中新建一个php文件,命名为create_product.php,并输入以下代码。该文件主要实现在products表中插入一个新的产品。
在下面的代码我使用POST来读取产品数据并把他们存储在products表中。
最后我会输出一些JSON返回值,以便返回给客户端(Android项目)
参考下面代码及代码中的注释即可: PHP代码:conn.php是连接MySQL数据库的。代码如下: ?php $dbhost = "localhost:3306"; $dbuser = "root"; //我的用户名 $dbpass = ""; //我的密码 $dbname = "testlogin"; //我的mysql库名 $cn = mysql_connect($dbhost,$dbuser,$dbpass) or die("connect error"); @mysql_select_db($dbname)or die("db error"); mysql_query("set names 'UTF-8'"); ? login.php代码: ?php include ("conn.php");//连接数据库 $username=str_replace(" ","",$_POST['name']);//接收客户端发来的username; $sql="select * from users where name='$username'"; $query=mysql_query($sql); $rs = mysql_fetch_array($query); if(is_array($rs)){ if($_POST['pwd']==$rs['password']){ echo "login succeed"; }else{ echo "error"; } } ?class LoginHandler implements Runnable { @Override public void run() { // TODO Auto-generated method stub //get username and password; userName = user_name.getText().toString().trim(); password = pass_word.getText().toString().trim(); //连接到服务器的地址,我监听的是8080端口 String connectURL="网站地址/text0/com.light.text/login.php/"; //填入用户名密码和连接地址 boolean isLoginSucceed = gotoLogin(userName, password,connectURL); //判断返回值是否为true,若是的话就跳到主页。 if(isLoginSucceed){ Intent intent = new Intent(); intent.setClass(getApplicationContext(), HomeActivity.class); startActivity(intent); proDialog.dismiss(); }else{ proDialog.dismiss(); // Toast.makeText(ClientActivity.this, "登入错误", Toast.LENGTH_LONG).show(); System.out.println("登入错误"); } } } //登入的方法,传入用户 密码 和连接地址 private boolean gotoLogin(String userName, String password,String connectUrl) { String result = null; //用来取得返回的String; boolean isLoginSucceed = false; //test System.out.println("username:"+userName); System.out.println("password:"+password); //发送post请求 HttpPost httpRequest = new HttpPost(connectUrl); //Post运作传送变数必须用NameValuePair[]阵列储存 List params = new ArrayList(); params.add(new BasicNameValuePair("name",userName)); params.add(new BasicNameValuePair("pwd",password)); try{ //发出HTTP请求 httpRequest.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)); //取得HTTP response HttpResponse httpResponse=new DefaultHttpClient().execute(httpRequest); //若状态码为200则请求成功,取到返回数据 if(httpResponse.getStatusLine().getStatusCode()==200){ //取出字符串 result=EntityUtils.toString(httpResponse.getEntity()); ystem.out.println("result= "+result); } }catch(Exception e){ e.printStackTrace(); } //判断返回的数据是否为php中成功登入是输出的 if(result.equals("login succeed")){ isLoginSucceed = true; } return isLoginSucceed; }
Android客户端直接连接远程MySQL数据库的方法如下:String result = ""; //首先使用NameValuePair封装将要查询的年数和关键字绑定 ArrayListNameValuePair nameValuePairs = new ArrayListNameValuePair(); nameValuePairs/getAllPeopleBornAfter.php"); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); }catch(Exception e){ Log.e("log_tag", "Error in http connection "+e.toString()); } //将HttpEntity转化为String try{ BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close();result=sb.toString(); }catch(Exception e){ Log.e("log_tag", "Error converting result "+e.toString()); }//将String通过JSONArray解析成最终结果 try{ JSONArray jArray = new JSONArray(result); for(int i=0;ijArray.length();i++){ JSONObject json_data = jArray.getJSONObject(i); Log.i("log_tag","id: "+json_data.getInt("id")+ ", name: "+json_data.getString("name")+ ", sex: "+json_data.getInt("sex")+ ", birthyear: "+json_data.getInt("birthyear") ); } } }catch(JSONException e){ Log.e("log_tag", "Error parsing data "+e.toString()); }虽然Android开发中可以直接连接数据库,但是实际中却不建议这么做,应该使用服务器端中转下完成。