微信平台之数据查询

Posted by Struggle on May 12, 2016

功能需求:

实现一个如下的查询方法,在微信中直接发送关键字查询

chaxun1

概要

配置config文件

复制以下代码生成config.php文件,修改其中的数据库账号密码信息,修改你的appid和appsecret,将它保存你服务器的根目录

<?php
$conn = @mysql_connect("localhost","数据库账号","数据库密码") or die ("数据库连接错误!");//填写你的账号,密码
if(!$conn)
{
	die("mysql conn failed");
}
else{

	mysql_query("set names uft-8");
	mysql_select_db("数据库名称",$conn);//填写你的数据库名称
	if(!$conn)
	{
		die("database selected failed");
	}
}

define('appid','wx9...');//你自己的appid
define('appsecret','e28...');//你自己的appsecret
?>
其中数据库名称如下,然后账号密码是我们在第一篇文章中介绍的。

chaxun2

生成数据库文件

下面我们学会将我们现有的xls表格数据导入到我们的数据库中,可看以下动画

chaxun3

  • 基本操作是
    1. 将xls/xlsx变成csv文件
    2. 使用Notepad++打开csv文件更改编码为utf-8
    3. 在数据库中导入csv文件
    4. 更改表名为合适的名称比如我的是cx_score
      • 保存后记得再次查看是否更改成功
      • 如果仍旧看不懂我说的,可以参考 mysql导入excel数据

生成查询代码

我们首先先去验证上述操作是否成功

  • 操作是 ->1. 新建一个cxtest.php,写入以下代码
 <?php
 include("../config.php");
$sql="select * from cs_score";  //可以把cs_score改成你自己取的名字
$query=mysql_query($sql);
echo '< pre>';
while($row=mysql_fetch_array($query))
{
print_r($row);
 }
?>
->2.在你服务器新建一个文件夹,如我的是shuju,如图 ![chaxun4](/img/blog/jc5-cx-file.JPG)
->3. 在浏览器中输入你的域名/shuju/cxtest.php,如我的是http://hi.wxhand.cn/shuju/cxtest.php,如图所示 ![chaxun5](/img/blog/jc5-cx-show.JPG)
->4.如果有问题请检查是否是config.php,数据库信息那里是否正确。

下面我们去设置查询代码

<?php

//
// 响应用户消息
// 查询系统:by 助梦者
//

define("TOKEN", "weixin");                    //token自己改
include "../config.php";

$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
	$wechatObj->responseMsg();
}else{
    $wechatObj->valid();
}

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);

        if($tmpStr == $signature){
            return true;
        }else{
            return false;
        }
    }

    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);

            //用户发送的消息类型判断
            switch ($RX_TYPE)
            {
                case "text":
                    $result = $this->receiveText($postObj);
                    break;
                case "image":
                    $result = $this->receiveImage($postObj);
                    break;
                case "voice":
                    $result = $this->receiveVoice($postObj);
                    break;
                case "video":
                    $result = $this->receiveVideo($postObj);
                    break;
                default:
                    $result = "unknow msg type: ".$RX_TYPE;
                    break;
            }
            echo $result;
        }else {
            echo "";
            exit;
        }
    }
    
    private function receiveText($object)
    {
		$openid=$object->FromUserName;
		$keyword= $object->Content;
		//$key='分数';    //这里设置查询方式的关键字,如我设置的是:分数 
		preg_match('/分数(.*)/',$keyword, $match); 
		$cx = $match[1]; 

				$sql="select * from cs_score where name='{$cx}' ";  //这里cx_score可以改成你自己的表名,name改成你要设置的字段名
				$result2 = mysql_query($sql);
				$row = mysql_fetch_assoc($result2);

				if(empty($row)){
				$content = array();
				$content[] = array("Title"=>"⚠亲,没有查到相关信息!请检查所查对象是否存在!也有可能你的信息。", 
										"Description"=>"", 
										"PicUrl"=>"", 
										"Url" =>"");
				$content[] = array("Title"=>"【查询格式】\n分数+姓名,如【分数小明】",   //显示的内容可以修改
										"Description"=>"", 
										"PicUrl"=>"", 
										"Url" =>"");		
				$content[] = array("Title"=>"👉🏫 欢迎推荐给你的好友哦", 
										"Description"=>"", 
										"PicUrl"=>"", 
										"Url" =>"");			
				$result = $this->transmitNews($object, $content);
				
				}
				else{
				
				/*
				id		name	score
				*/
				$sql="select * from cs_score where name='{$cx}' ";
				$query=mysql_query($sql);
				$content = array();
				$content[] = array("Title"=>"📝亲,你查询的信息如下所示!", 
										"Description"=>"", 
										"PicUrl"=>"", 
										"Url" =>"");
				while($row2=mysql_fetch_array($query)){
					
						$name=$row2['name']; //姓名
						$score=$row2['score']; //姓名
						/*
						$bj=$row2['bj']; //班级...你们可以按照这个格式自己添加
						*/
						
					$xs="【信息如下】\n姓名:".$name."\n分数:".$score;
					
					$content[] = array("Title"=>$xs,  
										"Description"=>"", 
										"PicUrl"=>"", 
										"Url" =>"");
				    }
					$content[] = array("Title"=>"👉🏫感谢使用",  //显示的内容可以修改
										"Description"=>"", 
										"PicUrl"=>"", 
										"Url" =>"");
					$result = $this->transmitNews($object, $content);
					}
				return $result;
    }

    /*
     * 回复文本消息
     */
    private function transmitText($object, $content)
    {
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }
    
    /*
     * 回复图文消息
     */
    private function transmitNews($object, $arr_item)
    {
        if(!is_array($arr_item))
            return;

        $itemTpl = "    <item>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <PicUrl><![CDATA[%s]]></PicUrl>
        <Url><![CDATA[%s]]></Url>
    </item>
";
        $item_str = "";
        foreach ($arr_item as $item)
            $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);

        $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";

        $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item));
        return $result;
    }

}
?>

最终效果

chaxun5


如果仍然有疑问,联系

qqgroup ___