jjzjj

艰难的起步---微信小程序访问MSSQL数据库实例

我是雨果 2024-07-02 原文

一直做单机版应用程序开发,这不客户都需要手机端的小程序嘛!眼看着客户要纷纷“掉粉”,急了!必须马上学起!起步的确有点难,好在掉了些头发(摸摸还好)突破了通路,高兴之余写下来,希望能够帮到大家(瞧瞧这大局观~~~哈哈)。

微信小程序的创建就不赘述了,只是打开微信开发者工具后,眼前黑乎乎的背景,脑子里一片片空白,该怎么搞啊!大家就不用着急了,还好有我经历过,从这里开始吧!

设想一个场景---你的客户需要通过微信小程序查询积分情况,简单的只需要输入会员卡号,点击查询就显示出积分额等信息。好了,有了需求流,程序流也就很快画出来了:

一、介绍四个小程序文件

js---逻辑层控制脚本文件,主要是它发送请求和接收数据,
json--- 用于此页面局部,配置并且覆盖全局app.json配置,
wxss---页面样式设置,相当于html的CSS配置文件,
wxml---渲染层,就是页面,相当于html

二、简单的页面设计

哈哈,UI不是特长,说明问题就好^~^ 

1、index.wxml代码

<!--index.wxml-->
<view class="container" style="width: 750rpx; height: 153rpx; display: flex; box-sizing: border-box">

  <view class="title">加油站客户积分查询</view>

  <view class="top_tip">I love “油”</view>

  <cloud-tip-modal showUploadTipProps="{{showUploadTip}}"></
  
  cloud-tip-modal>
  
</view>

<view>
  <!-- 图片直接 -->
  <image bindload='imgLoad' src="../../images/petrol.jpg" style="width: 756rpx; height: 306rpx; display: inline-block; box-sizing: border-box; left: -4rpx; top: 10rpx; position: relative"></image>
</view>

<navigator url="test.wxml"  open-type="navigate" target="self" ><view class="top_tip">加油!我们一直在一起!
  
</view></navigator>

<form bindsubmit="formSubmit" >
<view class="section" style="width: 750rpx; height: 82rpx; display: block; box-sizing: border-box">
  <input class="class_input" name="card_id" placeholder="请输入卡号" />
  <button formType="submit" class="button" style="width: 168rpx; height: 46rpx; display: block; box-sizing: border-box; left: 114rpx; top: -96rpx; position: relative">提交</button> 
</view>
<view class="btn-area">
  <text class="my-name">{{Str_Custom}}</text>
</view>
</form>

 

注意:

(1)Form表单,需要绑定一个属性为bindsubmit事件,bindsubmit=”formSubmit”   这里的属性值formSubmit,命名可以为符合规范的任意值,相当于以前html中的  οnsubmit=”formSubmit()”,是一个函数名,当提交的时候触发formSubmit这个函数事件,这个函数写在js中。

(2)input控件一定要有name="card_id"属性,后端处理和以前一样,比如name="card_id" PHP用 $_POST[‘card_id']来接收。

(3)由于小程序没有input submit这个按钮,所以在每个form表单中都要有一个提交按钮,<button formType="submit">提交</button>,这个按钮就是用来开启提交事件的。

(4)在页面上设置一个<text>控件,将来用来返现数据查询结果。

<view class="btn-area">
  <text class="my-name">{{Str_Custom}}</text>
</view>

其中:{{Str_Custom}}是渲染层的动态变量,通过改变这个变量,返回查询结果。

2、index.js代码

// index.js
const { envList } = require('../../envList.js');
const app = getApp()

Page({
  //图片加载完成后执行的方法
  imgLoad(image) {
    console.log(image.detail.width);
  },

  data: {
    Str_Custom:'查询结果',
    defaultClass:'my-name',
    backgroudColor:'#e4393c'
  },

  formSubmit: function (e) {     
      console.log(e.detail.value);
      let that = this;
      if (e.detail.value.card_id.length == 0 || e.detail.value.card_id.length >= 25) {
        wx.showToast({
          title: '卡号不能为空或过长!',
          icon: 'loading',
          duration: 1500
        })
        setTimeout(function () {
          wx.hideToast()
        }, 2000)
      } else {
        wx.request({
          url: 'https://www.ygcomputer.cn/points/show_sql.php', //替换成你们的php后台程序
          header: {
            "Content-Type": "application/x-www-form-urlencoded"
          },
          method: "POST",
          data: { card_id: e.detail.value.card_id },
          success: function (res) {
            console.log(res.data);
            if (res.data.status == 0) {
              wx.showToast({
                title: '提交失败!!!',
                icon: 'loading',
                duration: 1500
              })
            } else {
              that.setData({ 
                 Str_Custom: res.data.name + '积分余额[' + res.data.ye + ']' //显示姓名+余额
               }); 
              wx.showToast({
                title: '提交成功!!!',//这里打印出登录成功
                icon: 'success',
                duration: 1000
              })
            }
          }
        })
      }
  }

})

要点:

(1)初始数据的赋值

data: {
    Str_Custom:'查询结果',
    ...
  },

通过data给渲染层Str_Custom变量赋值。

(2)函数 formSubmit解释

  formSubmit: function (e) {     ----e代表事件引起的本函数

      console.log(e.detail.value);   ----主控台显出,便于调试

      let that = this; ---- 关键点,这里将page的保存至that容器中,此后this会改变

......

     that.setData({  ---- 关键点,上面代表page的that在这里,通过setData改变Str_Custom值

                 Str_Custom: res.data.name + '积分余额[' + res.data.ye + ']'

     }); 

3、index.wxss代码

/**index.wxss**/

page {
  padding-top: 54rpx;
  background-color: #e2dddd;
  padding-bottom: 60rpx;
}

.title {
  font-family: PingFang SC;
  font-weight: 500;
  color: #e04343;
  font-size: 44rpx;
  margin-bottom: 40rpx;
}

.top_tip {
  font-size: 28rpx;
  font-family: PingFang SC;
  font-weight: 400;
  color: #000000;
  margin-bottom: 28rpx;
  text-align: center;
}

.button {
  width: 300rpx;
  text-align: center;
  margin: 5% auto 5% auto;
  height: 70rpx;
  color: white;
  border-radius: 5rpx;
  line-height: 10rpx;
  background-color: #07c160;
  text-align: center;
  font-size: 30rpx;
}

.box>text:first-child {
  color: #e4393c;
}

input:active {
  border: 1px solid #ddd;
}

.class_input{
  width: 150px;
  text-align: center;
  height: 70rpx;
  color: rgb(0, 0, 0);
  border-radius: 3px;
  line-height: 70rpx;
  background-color: #b5f7d4;
}

.box{
  width: 400rpx;
  height: 400rpx;
  display: block;
  background-color: antiquewhite;
}

.my-name {
  height: 30px;
  width: 168px;
  text-align: center;
  line-height: 30px;
  color: rgb(83, 81, 81);
  background-color: #b5f7d4;
}

.section{
  text-align: center;
  align-items:center;
}

一些class文件,为控件的样式,不重要。

三、后台PHP文件

我的数据库为sqlserver2016,php版本为4.2,后台php文件编写方法为(说明:php4.2以上版本MSSQL访问函数变化,不适用这个脚本):

<?php
  //说明:测试的时候是连接的是远程的mssql数据库,没有在本机运行
  //初始化mssql数据库连接,分别是 主机(ip:端口号默认1433), 用户名, 密码
  //header("Content-Type: text/html;charset=utf-8");
  header("Cache-Control: no-cache");
  $card_id=$_POST['card_id']; //接收参数
  $serverName = "XXXXXXXX";
  
  $conn=mssql_connect( $serverName ,'userxxx','passwordxxx') or die("SQL SERVER 数据库连接失败!"); 
  //选择数据库
  mssql_select_db('points',$conn); 
  ini_set("date.timezone", "PRC");
  //sql语句
  $sql="SELECT id,name,shouji,ye FROM sell_user where id = '".$card_id."'"; 
  $result= mssql_query( $sql );
  $num = mssql_num_rows($result); 
  if($num){
      while( $row = mssql_fetch_assoc( $result) ){
          $row[name] = iconv("GB2312","UTF-8//IGNORE",$row[name]);
          foreach ( $row as $key => $value ) { 
              $row[$key] = urlencode ( $value ); 
          }      
          echo urldecode( json_encode($row ) );
      }
  }
  //关闭连接
  mssql_close($conn);
?>

重点:

(1)header("Cache-Control: no-cache"); 清理服务器缓存

(2)ini_set("date.timezone", "PRC"); 同步时区;

(3) $row[name] = iconv("GB2312","UTF-8//IGNORE",$row[name]); 注意json只接受utf-字符集,而mssl汉字为GBk类型,因此必须在这里首先将汉字编码转变为UTF-8类型;(独立知识产权哦,老费劲了!)

(4)foreach ( $row as $key => $value ) {     ----- 遍历字符
              $row[$key] = urlencode ( $value );   ------ 转换为16进制,为 json_encode函数转换
          }      
          echo urldecode( json_encode($row ) );------  json_encode函数后,再将字符由16进制转换为正常

四、运行结果

 哈哈,大功告成,整个流程跑通,剩下就是细节了,如果要求低一些,这也是一个商用小程序哦~(不知道能不能通过微信审核~哈哈)。

有关艰难的起步---微信小程序访问MSSQL数据库实例的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  3. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  4. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  7. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

  8. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  9. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐