1. 소개
앞서 설명한 기능 개발은 데이터베이스를 운영할 필요 없이 API만 호출하면 완료됩니다. 이후 고급 기능을 개발하려면 데이터베이스를 사용해야 하므로, 이 글에서는 독자들의 참고를 위해 MySQL 데이터베이스의 운영에 대해 간략하게 소개하겠습니다.
2. 아이디어 분석
Baidu 개발자 센터는 MySQL, MongoDB, Redis를 포함한 강력한 클라우드 데이터베이스를 제공하며, 누구나 친숙하게 사용할 수 있는 MySQL을 소개합니다. WeChat과 데이터베이스 간의 상호 작용을 실현하기 위한 운영 시연입니다.
BAE 애플리케이션에서 클라우드 데이터베이스를 사용하는 방법은 매우 간단합니다. 데이터베이스 목록에 표시되는 이름은 데이터베이스에 연결할 때의 dbname입니다. 사용자 이름, 비밀번호, 연결 주소 및 포트는 애플리케이션의 환경 변수를 통해 검색됩니다.
표준 PHP Mysql 또는 PHP Mysqli 확장을 사용하여 데이터베이스에 액세스할 수 있습니다. 이 두 확장은 BAE의 PHP에 이미 제공되어 있으며 애플리케이션에서 직접 사용할 수 있습니다.
공식 문서를 참조하세요: ttp://developer.baidu.com/wiki/index.php?title=docs/cplat/rt/mysql
BAE MySQL 데이터베이스 생성
3.1 Baidu 개발자 센터에 로그인 -> 애플리케이션 선택 -> 서비스 관리 -> 데이터베이스 생성
3.2 데이터베이스 생성
참고: 각 애플리케이션에는 1G 무료 할당량을 누리는 단 하나의 데이터베이스와 다른 데이터베이스가 있습니다. 무료 할당량 할인을 누리지 마십시오. 이 제안은 무료 할당량을 사용한 데이터베이스가 삭제된 경우에만 다시 사용할 수 있습니다.
3.3 생성됨
여기서 나중에 사용할 데이터베이스 이름인 dbname을 볼 수 있습니다.
데이터베이스에 액세스하려면 “phpMyadmin”을 클릭하세요.
3.4 phpMyadmin 인터페이스
새 데이터 테이블을 생성하고 테이블 이름과 필드 수를 입력한 후 "실행"을 클릭하여 테이블을 생성합니다.
3.5 테이블 생성
필드 이름과 필드 유형을 입력한 후 아래 '저장'을 클릭하면 테이블 생성이 완료됩니다.
3.6 생성 완료
id 필드를 기본 키로 수정하고 AUTO_INCREMENT를 추가하여 from_user 필드를 고유(UNIQUE)로 수정합니다. 테이블.
다음 SQL 문을 사용하여 테이블 생성 작업을 완료할 수도 있습니다.
CREATE TABLE IF NOT EXISTS `test_mysql` ( `id` int(11) NOT NULL AUTO_INCREMENT, `from_user` varchar(40) DEFAULT NULL, `account` varchar(40) DEFAULT NULL, `password` varchar(40) DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `from_user` (`from_user`) );
phpMyAdmin 작업
이제 데이터베이스 및 데이터 테이블 생성이 종료됩니다. 아래에서는 데이터베이스 및 데이터 테이블의 사용법을 자세히 설명하는 코드를 작성하겠습니다.
4. 공식 예제(PHP MySQL)
BAE에서 공식적으로 제공하는 데모(PHP MySQL) 예제는 다음과 같습니다.
mysql/basic.php 파일 내용
<?php /** * MySQL示例,通过该示例可熟悉BAE平台MySQL的使用(CRUD) */ require_once("../configure.php"); /*替换为你自己的数据库名(可从管理中心查看到)*/ $dbname = MYSQLNAME; /*从环境变量里取出数据库连接需要的参数*/ $host = getenv('HTTP_BAE_ENV_ADDR_SQL_IP'); $port = getenv('HTTP_BAE_ENV_ADDR_SQL_PORT'); $user = getenv('HTTP_BAE_ENV_AK'); $pwd = getenv('HTTP_BAE_ENV_SK'); /*接着调用mysql_connect()连接服务器*/ $link = @mysql_connect("{$host}:{$port}",$user,$pwd,true); if(!$link) { die("Connect Server Failed: " . mysql_error()); } /*连接成功后立即调用mysql_select_db()选中需要连接的数据库*/ if(!mysql_select_db($dbname,$link)) { die("Select Database Failed: " . mysql_error($link)); } /*至此连接已完全建立,就可对当前数据库进行相应的操作了*/ /*!!!注意,无法再通过本次连接调用mysql_select_db来切换到其它数据库了!!!*/ /* 需要再连接其它数据库,请再使用mysql_connect+mysql_select_db启动另一个连接*/ /** * 接下来就可以使用其它标准php mysql函数操作进行数据库操作 */ //创建一个数据库表 $sql = "create table if not exists test_mysql( id int primary key auto_increment, no int, name varchar(1024), key idx_no(no))"; $ret = mysql_query($sql, $link); if ($ret === false) { die("Create Table Failed: " . mysql_error($link)); } else { echo "Create Table Succeed<br />"; } //插入数据 $sql = "insert into test_mysql(no, name) values(2007,'this is a test message'), (2008,'this is another test message'), (2009,'xxxxxxxxxxxxxx')"; $ret = mysql_query($sql, $link); if ($ret === false) { die("Insert Failed: " . mysql_error($link)); } else { echo "Insert Succeed<br>"; } //删除数据 $sql = "delete from test_mysql where no = 2008"; $ret = mysql_query($sql, $link); if ($ret === false) { die("Delete Failed: " . mysql_error($link)); } else { echo "Delete Succeed<br>"; } //修改数据 $sql = "update test_mysql set name = 'yyyyyy' where no = 2009"; $ret = mysql_query($sql, $link); if ($ret === false) { die("Update Failed: " . mysql_error($link)); } else { echo "Update Succeed<br>"; } //检索数据 $sql = "select id,no,name from test_mysql"; $ret = mysql_query($sql, $link); if ($ret === false) { die("Select Failed: " . mysql_error($link)); } else { echo "Select Succeed<br>"; while ($row = mysql_fetch_assoc($ret)) { echo "{$row['id']} {$row['no']} {$row['name']}<br>"; } } //删除表 $sql = "drop table if exists test_mysql"; $ret = mysql_query($sql, $link); if ($ret === false) { die("Drop Table Failed: " . mysql_error($link)); } else { echo "Drop Table Succeed<br>"; } ?>
configure.php 파일 내용
<?php /***配置数据库名称***/ define("MYSQLNAME", "qzMlSkByflhScPCOFtax"); ?>
테스트 사용:
성공적으로 실행되었습니다.
5. 호출 가능한 함수 형태로 수정(PHP MySQL)
5.1 데이터 테이블 생성
//创建一个数据库表 function _create_table($sql){ mysql_query($sql) or die('创建表失败,错误信息:'.mysql_error()); return "创建表成功"; }
5.2 데이터 삽입
//插入数据 function _insert_data($sql){ if(!mysql_query($sql)){ return 0; //插入数据失败 }else{ if(mysql_affected_rows()>0){ return 1; //插入成功 }else{ return 2; //没有行受到影响 } } }
5.3 데이터 삭제
//删除数据 function _delete_data($sql){ if(!mysql_query($sql)){ return 0; //删除失败 }else{ if(mysql_affected_rows()>0){ return 1; //删除成功 }else{ return 2; //没有行受到影响 } } }
5.4 데이터 수정
//修改数据 function _update_data($sql){ if(!mysql_query($sql)){ return 0; //更新数据失败 }else{ if(mysql_affected_rows()>0){ return 1; //更新成功; }else{ return 2; //没有行受到影响 } } }
5.5 데이터 검색
//检索数据 function _select_data($sql){ $ret = mysql_query($sql) or die('SQL语句有错误,错误信息:'.mysql_error()); return $ret; }
5.6 데이터 테이블 삭제
//删除表 function _drop_table($sql){ mysql_query($sql) or die('删除表失败,错误信息:'.mysql_error()); return "删除表成功"; }
위의 함수와 데이터베이스에 연결하는 코드를 결합하여 다음 테스트를 위한 mysql_bae.func.php 파일을 생성합니다.
6. MySQL 기능 사용법 테스트
6.1 동일한 디렉토리에 dev_mysql.php 파일을 새로 생성하고 mysql_bae.func.php 파일을 도입합니다
require_once './mysql_bae.func.php';
6.2 테스트 생성 테이블
위의 phpMyAdmin을 사용하여 생성된 test_mysql 테이블을 삭제합니다. 테스트 문은 다음과 같습니다.
//创建表 $create_sql = "CREATE TABLE IF NOT EXISTS `test_mysql` ( `id` int(11) NOT NULL AUTO_INCREMENT, `from_user` varchar(40) DEFAULT NULL, `account` varchar(40) DEFAULT NULL, `password` varchar(40) DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `from_user` (`from_user`) )"; echo _create_table($create_sql);
测试正确结果:
到phpMyAdmin中查看
故意将SQL语句写错
测试错误结果:
6.3 测试插入数据
测试语句如下:
//插入数据 $insert_sql = "insert into test_mysql(from_user, account, password, update_time) values('David','860510', 'abcabc', '2013-09-29 17:14:28')"; $res = _insert_data($insert_sql); if($res == 1){ echo "插入成功"; }else{ echo "插入失败"; }
测试结果:
6.4 测试更新数据
测试语句如下:
//更新数据 $update_sql = "update test_mysql set account = 860512 where account = 860510"; $res = _update_data($update_sql); if($res == 1){ echo "更新成功"; }elseif($res == 0){ echo "更新失败"; }elseif($res == 2){ echo "没有行受到影响"; }
测试结果:
再次更新:
6.5 测试删除数据
测试语句如下:
//删除数据 $delete_sql = "delete from test_mysql where account = 860512"; $res = _delete_data($delete_sql); if($res == 1){ echo "删除成功"; }elseif($res == 0){ echo "删除失败"; }elseif($res == 2){ echo "没有该条记录"; }
测试结果:
再次删除:
6.6 测试检索数据
再次执行上面的插入操作做检索测试,测试语句如下:
//检索数据 $select_sql = "select * from test_mysql"; $result = _select_data($select_sql); while($rows = mysql_fetch_array($result,MYSQL_ASSOC)){ echo $rows[id]."--".$rows[from_user]."--".$rows[account]."--".$rows[password]."--".$rows[update_time]; echo "<br>"; }
测试结果:
6.7 测试删除表
测试语句如下:
//删除表$drop_sql = "drop table if exists test_mysql";echo _drop_table($drop_sql);
测试结果:
MySQL 函数测试全部成功。
七、实现与微信的交互(Mysql 扩展)
保证数据库中存在test_msyql表,这里测试微信对MySQL数据库的增删改查操作,不考虑特殊情况,只按照下面的方法测试:
1. 绑定+账户+密码 如:绑定+860512+abc123 2. 查询 如:查询 3. 修改+旧密码+新密码 如:修改+abc123+123456 4. 删除 如:删除
7.1 引入mysql_bae.func.php 文件
//引入数据库函数文件require_once 'mysql_bae.func.php';
7.2 前置操作
A. 将输入的语句拆分成数组,以“+”号分隔
$keywords = explode("+",$keyword);
B. 获取当前时间
//获取当前时间$nowtime=date("Y-m-d G:i:s");
C. 判断用户是否已经绑定
//判断是否已经绑定 $select_sql="SELECT id from test_mysql WHERE from_user='$fromUsername'"; $res=_select_data($select_sql); $rows=mysql_fetch_array($res, MYSQL_ASSOC); if($rows[id] ''){ $user_flag='y'; }
7.3 测试插入操作
测试代码:
if(trim($keywords[0] == '绑定')){ if($user_flag 'y'){ $insert_sql="INSERT INTO test_mysql(from_user, account, password, update_time) VALUES('$fromUsername','$keywords[1]','$keywords[2]','$nowtime')"; $res = _insert_data($insert_sql); if($res == 1){ $contentStr = "绑定成功"; }elseif($res == 0){ $contentStr = "绑定失败"; } }else{ $contentStr = "该账户已绑定"; } }
测试结果:
7.4 测试查询操作
测试代码:
if(trim($keywords[0] == '查询')){ $select_sql="SELECT * FROM test_mysql WHERE from_user='$fromUsername'"; $select_res=_select_data($select_sql); $rows=mysql_fetch_assoc($select_res); if($rows[id] ''){ $contentStr="账户:$rows[account]\n"."密码:$rows[password]\n"."From_user:$rows[from_user]\n"."更新时间:$rows[update_time]"; }else{ $contentStr="您还未绑定账户,查询不到相关信息,请先绑定,谢谢!"; } }
测试结果:
7.5 测试更新操作
测试代码:
if(trim($keywords[0] == "修改")){ $old_password=$keywords[1]; $new_password=$keywords[2]; $select_password_sql="SELECT * FROM test_mysql WHERE from_user='$fromUsername'"; $select_res=_select_data($select_password_sql); $rows=mysql_fetch_assoc($select_res); if($old_password == $rows[password]){ $update_sql="UPDATE test_mysql SET password='$new_password' WHERE from_user='$fromUsername'"; $res = _update_data($update_sql); if($res == 1){ $contentStr = "修改成功"; }elseif($res == 0){ $contentStr = "修改失败"; } }else{ $contentStr = "原密码有误,请确认后重试"; } }
测试结果:
7.6 测试删除操作
测试代码:
if(trim($keywords[0] == "删除")){ $delete_sql="DELETE FROM test_mysql WHERE from_user='$fromUsername'"; $res = _delete_data($delete_sql); if($res == 1){ $contentStr = "删除成功"; }elseif($res == 0){ $contentStr = "删除失败"; } }
测试结果:
与微信的交互测试成功。
八、PHP Mysqli 扩展,封装成类
将Mysqli 扩展封装成类使用,代码如下:
<?php require_once 'includes/configure.php'; class MySQLi_BAE{ private $mysqli; private $host; private $user; private $password; private $port; private $database; //在类之外访问私有变量时使用 function __get($property_name){ if(isset($this->$property_name)){ return($this->$property_name); }else{ return(NULL); } } function __set($property_name, $value){ $this->$property_name=$value; } function __construct(){ /*从平台获取查询要连接的数据库名称*/ $this->database = MYSQLNAME; /*从环境变量里取出数据库连接需要的参数*/ $this->host = getenv('HTTP_BAE_ENV_ADDR_SQL_IP'); $this->user = getenv('HTTP_BAE_ENV_AK'); $this->password = getenv('HTTP_BAE_ENV_SK'); $this->port = getenv('HTTP_BAE_ENV_ADDR_SQL_PORT'); $this->mysqli = new mysqli($this->host, $this->user, $this->password, $this->database, $this->port); if($this->mysqli->connect_error){ die("Connect Server Failed:".$this->mysqli->error); } $this->mysqli->query("set names utf8"); } //dql statement function execute_dql($query){ $res = $this->mysqli->query($query) or die("操作失败".$this->mysqli->error); return $res; //$this->mysqli->close(); } //dml statement function execute_dml($query){ $res = $this->mysqli->query($query) or die("操作失败".$this->mysqli->error); if(!$res){ return 0;//失败 }else{ if($this->mysqli->affected_rows > 0){ return 1;//执行成功 }else{ return 2;//没有行受影响 } } //$this->mysqli->close(); } } ?>
九、测试类的使用
9.1 测试DML操作
测试代码:
<?php require_once "MySQLi_BAE.class.php"; $mysqli_BAE=new MySQLi_BAE(); //**************dml******************* $sql="insert into test_mysql (from_user, account, password, update_time) values('David','860510', 'abcabc', '2013-09-27 17:14:28')"; //$sql="update test_mysql set account = 860512 where account = 860510"; //$sql="delete from test_mysql where account = 860512"; $res=$mysqli_BAE->execute_dml($sql); if($res==0){ echo "执行失败"; }elseif($res==1){ echo "执行成功"; }else{ echo "没有行数影响"; } ?>
测试结果:
9.2 测试DQL操作
测试代码:
<?php require_once "MySQLi_BAE.class.php"; $mysqli_BAE=new MySQLi_BAE(); //**************dql****************** $sql="select * from test_mysql"; $res=$mysqli_BAE->execute_dql($sql); while($row=$res->fetch_row()){ foreach($row as $key=>$val){ echo "$val--"; } echo '<br>'; } $res->free(); ?>
测试结果:
十、实现与微信的交互(Mysqli 扩展)
10.1 前置操作
A. 引入MySQLi_BAE.class.php 文件
//引入数据库函数文件require_once "MySQLi_BAE.class.php";
B. 实例化对象
public function __construct() { $this->mysqli_BAE=new MySQLi_BAE(); }
10.2 测试插入操作
测试代码:
$insert_sql="INSERT INTO test_mysql(from_user, account, password, update_time) VALUES('$fromUsername','$keywords[1]','$keywords[2]','$nowtime')"; $res = $this->mysqli_BAE->execute_dml($insert_sql);
测试结果:
10.3 测试查询操作
测试代码:
$select_sql="SELECT * FROM test_mysql WHERE from_user='$fromUsername'"; $select_res=$this->mysqli_BAE->execute_dql($select_sql); $rows=$select_res->fetch_array(MYSQLI_ASSOC);
测试结果:
10.4 测试更新操作
测试代码:
$update_sql="UPDATE test_mysql SET password='$new_password' WHERE from_user='$fromUsername'"; $res = $this->mysqli_BAE->execute_dml($update_sql);
测试结果:
10.5 测试删除操作
测试代码:
$delete_sql="DELETE FROM test_mysql WHERE from_user='$fromUsername'"; $res = $this->mysqli_BAE->execute_dml($delete_sql);
测试结果:
与微信交互测试成功。
更多WeChat 공개 플랫폼 개발 데이터베이스 운영相关文章请关注PHP中文网!