微信公众平台开发 - 数据库操作_PHP教程
【PHP微信公众平台开发系列】
01.配置微信接口
02.公众平台示例代码分析
03.订阅事件(subscribe)处理
04.简单回复功能开发
05.天气预报功能开发
06.翻译功能开发
07.聊天机器人功能开发
08.自定义菜单功能
09.数据库操作
本文地址:http://www.phpchina.com/archives/view-43411-1.html
本系列由PHPChina特邀作者@David_Tang供稿,转载请注明作者信息与本文地址。
一、简介
前面讲解的功能开发都是简单的调用API 完成的,没有对数据库进行操作。在接下来的高级功能开发中,需要使用到数据库,所以在这一篇中,将对MySQL 数据库的操作做一下简单的介绍,以供读者参考。
二、思路分析
百度开发者中心提供了强大的云数据库(包括MySQL, MongoDB, Redis),在这一节教程中,我们将对大家比较熟悉的MySQL 数据库进行操作演示,实现微信与数据库的交互。
在BAE应用中使用云数据库十分简单,数据库列表中的名称即是连接数据库时的dbname。用户名、密码、连接地址和端口在应用中通过环境变量取出。
可使用标准的PHP Mysql 或PHP Mysqli 扩展访问数据库,BAE的PHP中已提供这两个扩展,应用可直接使用。
官方文档,请参考:http://developer.baidu.com/wiki/index.php?title=docs/cplat/rt/mysql
三、创建BAE MySQL数据库
3.1 登陆百度开发者中心 -> 管理中心 -> 选择应用 -> 云环境 -> 服务管理 -> MySQL(云数据库) -> 创建数据库
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 操作
数据库及数据表的创建到此结束,下面将编写代码对数据库及数据表的使用做详细讲解。
四、官方示例(PHP MySQL)
BAE 官方提供的demo(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"); ?>
测试使用:
执行成功。
五、修改成可调用的函数形式(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 文件,供下面测试使用。
六、测试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);
测试结果:
与微信交互测试成功。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.

PHP8에서 매치 표현식은 표현식의 값에 따라 다른 결과를 반환하는 새로운 제어 구조입니다. 1) 스위치 명령문과 유사하지만 실행 명령문 블록 대신 값을 반환합니다. 2) 경기 표현식은 엄격하게 비교되어 (===) 보안을 향상시킵니다. 3) 스위치 명세서에서 가능한 파손을 피하고 코드의 단순성과 가독성을 향상시킵니다.

PHP에서는 예측할 수없는 토큰을 사용하여 CSRF 공격을 효과적으로 방지 할 수 있습니다. 특정 방법은 다음과 같습니다. 1. 형태로 CSRF 토큰을 생성하고 포함시킨다. 2. 요청을 처리 할 때 토큰의 유효성을 확인하십시오.

H5. 미니 프로그램과 앱의 주요 차이점은 다음과 같습니다. 기술 아키텍처 : H5는 웹 기술을 기반으로하며 미니 프로그램 및 앱은 독립적 인 응용 프로그램입니다. 경험과 기능 : H5는 가볍고 사용하기 쉽고 기능이 제한되어 있습니다. 미니 프로그램은 가벼우 며 상호성이 우수합니다. 앱은 강력하고 부드러운 경험이 있습니다. 호환성 : H5는 크로스 플랫폼 호환성이며 애플릿 및 앱은 플랫폼에 의해 제한됩니다. 개발 비용 : H5는 개발 비용이 낮고 중간 미니 프로그램 및 최고 앱이 있습니다. 적용 가능한 시나리오 : H5는 정보 표시에 적합하고 애플릿은 가벼운 응용 프로그램에 적합하며 앱은 복잡한 기능에 적합합니다.

회사 보안 소프트웨어 및 응용 프로그램을위한 호환성 문제 및 문제 해결 방법. 많은 회사들이 인트라넷 보안을 보장하기 위해 보안 소프트웨어를 설치할 것입니다. 그러나 보안 소프트웨어 가끔 ...

php의 엄격한 유형은 declare (strict_types = 1)를 추가하여 활성화됩니다. 파일 상단에서. 1) 함정 유형 변환을 방지하기 위해 함수 매개 변수 및 리턴 값의 검사 유형 검사를 강요합니다. 2) 엄격한 유형을 사용하면 코드의 신뢰성과 예측 가능성을 향상시키고 버그를 줄이며 유지 관리 및 가독성을 향상시킬 수 있습니다.
