php调用远程mssql服务器

最近在弄公司的微信服务号,忽然冒出个想法,想把微信和医疗系统结合一下,让用户能直接在微信上查到自己在医院的资料。

for example几号来的医院,咨询的什么项目,哪个医生接待的,消费了多少钱,什么时候需要去复诊,该跟谁约会,该跟谁搞基。。。

 

心里这么一想似乎能两边都方便点,而且也对吸粉有一点的作用

说干就干。

先说一下环境吧

医院这边用的是一套客户端的服务系统,叫宏脉,具体不解释了。用的是mssql的数据库,服务器就扔在医院的某个阴暗的小角落,装了花生壳,指定了端口对公网开放

而搭载了微擎的那边用的是windows2008的阿里云,我用了西数的网站助手,个人感觉手感还不错,可以一键创建站点数据库之类的。还可以一键安装php5.2到5.5的环境,颇为顺手。

环境解释完了,那么问题来了,如何用php远程调用mssql的数据呢?

中间各种曲折离奇的故事我就不多加赘述了,直接指明道路。

 

第一步开放mssql的远程访问

这个简单,网上一大坨教程,个人建议单独加一个远程调用的账户,我百度了一个传送门http://jingyan.baidu.com/article/6c67b1d6ca06f02787bb1ed1.html

第二步让php支持mssql

因为微擎要求的php版本比较高,而mssql在高于5.3的php就TM不再支持mssql了,得插点东西才行。

来来,我告诉你们要插点什么

 

第三步,好了该装的装了是时候改一下配置文件了

打开php目录下的php.ini

有仇的报仇,有怨的。。不是

;extension=php_sqlsrv.dll
;extension=php_pdo_sqlsrv.dll

这两句的就把前边的;去掉,没有的就补上这两句

再加个

[PHP_PDO_SQLSRV] 
extension = php_pdo_sqlsrv_54_nts.dll 
[PHP_SQLSRV] 
extension = php_sqlsrv_54_nts.dll

根据自己的环境来nts就是非安全线程,ts就是安全。如果不知道了就都试试。

到这里差不多了

第四步,测试

<?
/*连接数据库,5.4的函数不再是mssql_connect了:*/
$conInfo=array('Database'=>'osbst', 'UID'=>'sa', 'PWD'=>'123456');
$conn=sqlsrv_connect('192.168.1.208', $conInfo);
/*判断连接成功与否:*/
if( $conn == false )
{
    die( print_r( sqlsrv_errors(), true));
}
else
{
    echo("yes<br>");
}
$table_name = 'table_name';
/*如果你牛叉的数据库表名是中文,记得加上这句:*/
$table_name = iconv('UTF-8', 'GB2312', '牛叉的中文表名'); 
/*query语句:*/
$rs=sqlsrv_query($conn, "select * from ".$table_name);
if($rs == false)
{
    echo("false<br>");
}
else
{
    while($row = sqlsrv_fetch_array($rs))

    {
        print_r($row);
    }
    sqlsrv_free_stmt($rs);
    sqlsrv_close($conn);
}

?>

输出数组了说明成功了~

 

完结撒花

 

 

 

DUXCMS3.0常用标签 持续更新

duxcms3调用导航:

<!--list{app="site" label="nav" parent_id="0"}-->
名称: {$list.name} ---- 链接: {$list.url}<br>
<!--{/list}-->

parent_id 上级栏目ID
group_id 导航分组ID
name 导航名称
url 导航链接
subname 栏目副名称
image 封面图
keyword 关键词
description 导航描述
sort 排序

 

文章页调用当前页面tag

<!--loop{$tagList as $vo }-->
<a target='_blank' class='tag' href='{$vo.url}' >#{$vo.name}</a>
<!--{/loop}-->

 

DUXCMS3.0 瞎改记录

3.0的DUX完善了自定义模型和筛选模型,负载能力也比2.0有很大提升

so刚出测试版就搭建了一个站点用以测试

在使用中发现了一些细节的问题

1、列表顺序

比方说列表页排列顺序和点击筛选后顺序是正序的,这个需要修改

 /app/article/controller/IndexController.php
$classIds = target('article/ArticleClass')->getSubClassId($classId);
        $where['_sql'] = 'B.class_id in (' . $classIds . ') ORDER BY B.content_id desc';
 
        $attrList = [];
        if($classInfo['filter_id']) {
            $filter = target('site/SiteFilter')->getFilter('article/ArticleClass', $classIds, ['id' => $classId]);
            if ($filter['status']) {
                $where['_sql'] = 'A.content_id in (' . $filter['ids'] . ') ORDER BY B.content_id desc';
            }
            $attrList = $filter['attrList'];
        }

大约36,42行的位置加入ORDER BY B.content_id desc,可以在不影响响应速度的前提下把顺序改为倒序。

2、内页响应时间

/*
        target('site/SiteContent')->where(['content_id' => $info['content_id']])->setInc('view');

        $where = [];
        $where['A.status'] = 1;
        $where['_sql'] = 'A.create_time < ' . $info['create_time'];
        $where['B.class_id'] = $info['class_id'];
        $nextInfo = target('article/Article')->loadList($where, 1);

        $where = [];
        $where['A.status'] = 1;
        $where['_sql'] = 'A.create_time > ' . $info['create_time'];
        $where['B.class_id'] = $info['class_id'];
        $prevInfo = target('article/Article')->loadList($where, 1);*////这里注释用以减少sql查询

/app/article/controller/InfoController.php

注释掉大约62-75行之间的代码,可以极大的提升内页响应时间,3W数据内页响应时间从2S缩短到0.02S

html代码字符转义

开发过程中入库的时候为了避免一些不必要的错误

要把html代码进行转意再入库

用到了如下函数

htmlspecialchars()

会把诸如< > & "'之类的转意成&lt  &gt ,可以避免很多sql语句代码上的错误和麻烦

输出的时候再使用htmlspecialchars_decode() 再把字符转意回html代码

 

duxcms2.X 常用标签整理 持续更新

三级栏目调用

<ul class="dl-menu">
    <li <!--if{!$topCategoryInfo[ 'class_id']}-->class="current" <!--{/if}-->><a href="__ROOT__/" data-description="Get Started">首 页</a></li>
    <!--list{app="DuxCms" label="categoryList" limit=10 parent_id=0 order="sequence desc"}-->
        <li <!--if{$list[ 'class_id']==$topCategoryInfo[ 'class_id']}-->class="current" <!--{/if}-->><a href="{$list.curl}" data-description="{$list.subname}">{$list.name}</a>
            <ul class="dl-submenu">
                <!--submenu{app="DuxCms" label="categoryList" limit=10 parent_id=$list['class_id']}-->
                    <li><a href="{$submenu.curl}">{$submenu.name}</a>
                    <!--assign{app="DuxCms" label="categoryList" limit=10 parent_id=$submenu['class_id'] list="menu" }-->
                    <!--if{ !empty($menu) }-->
                            <ul class="dl-submenu">
                            <!--foreach{ $menu as $vo }-->
                            <li><a href="{$vo.curl}">{$vo.name}</a></li>
                            <!--{/foreach}-->
                        </ul>
                    <!--{/if}-->
            </li>
        <!--{/submenu}-->
     </ul>
    </li>
<!--{/list}-->
</ul>

 自定义模型调用

<!--list{app="Article" label="contentList" expand_id=2 pos_id="1" class_id=1 sub=true limit=5}-->
<div class="item active">
<a target="_blank" href="{$list.aurl}"><img width="100%" src="{$list.sk_big_banner}" alt="{$list.title}"></a>
<div class="carousel-caption">
{$list.title}
</div>
</div>
<!--{/list}-->

如上所示,扩展模型字段在调用时要注意以下几点:

1、要将list标签里的app="DuxCms"改为app="Article"

2、要在list标签里加入扩展模型id,例如expand_id=2,其中2为扩展模型id(如绿箭头所示)

3、扩展字段依据原始标签格式,例如{$list.fa},其中fa为扩展字段名

只要注意这3点,扩展模型调用就会正常出现了。而在列表页和详情页,无需考虑这些直接调用即可。

 

内容多图调用

<!--foreach{$contentInfo['多图字段'] as $vo} -->
<li><img title="{$vo.title}" src="{$vo.url}" /></li>
<!--{/foreach}-->

 

循环I

Duxcms标签手册里的表单序号i实际使用无效,下面说下Duxcms2.0标签万能序号调用实例:

542360846bb285fbee85879045fb0757

如上图,起始序号直接改第一行i的赋值即可。此方法同样适用于其他list循环标签。