返回
基础
分类

一般授权用户和超级用户能看到和使用不同的页面,就是关于PHP如何连接MSSQL数据库

日期: 2020-01-25 01:41 浏览次数 : 138

在很多时候,我们都要对某些Web 页面进行安全保护。典型的例子就是前台浏览页面与后台管理页面的安全性。这也是 WEB 上用得最多的一种页面安全模式。在用PHP4 开发一个小型的书籍管理系统中,我也遇到了这个安全问题。于是我想到了PHP4 的新特性----Session ..

一个简单的PHP网站结构

要求目的:同一站点,无权用户,一般授权用户和超级用户能看到和使用不同的页面。

课前小知识普及:MSSQL和SQL Server是同一个软件,叫法不同而已,MSSQL全称是Microsoft SQL Server,MSSQL是简写,有些人则喜欢直接叫SQL Server,我就比较喜欢这种叫法,有韵味、、、

由于之前学习过asp.net mvc的网站开发,因此,在新接触一门新的语言时,也会自然或不自然地参考这种经历,然后做出网站。如果你也是刚开始接触php,并从最原始的方式开始写网站,那么,你可以参考下面一种做法,它也是经过参考和探索而形成的一种可能的PHP网站结构

实现办法:在要保护的页面 include 不同级别的安全检验摸板。

 

一种PHP网站结构

注意事项:

最近有用户在使用PHPWAMP的时候,向我咨询一个问题,就是关于PHP如何连接MSSQL数据库。

必赢手机登录网址 1

1 要避免用户浏览器不使用 cookie 而不能浏览受保护的页面

 

其中,网站名即为项目文件夹,文件夹下分有css、js、images、includes、templates、up等等文件夹,其功能如下:

如何使用:

平时我们搭建网站通常是PHP+Mysql数据库,

目录及功能列表

1 在需要一般保护的页面的代码最前边加上 include (secturity2.php); 就行了

不过在项目中,我们有时候必须要用到PHP+MSSQL数据库,那应该怎么办呢?

目录
功能
css
专门用来存放css文件,一般每个模块独立成一个css文件,如用户(user.css),产品(product.css)等
images
用来存放网站所需的图片,如网站logo,背景图处,增删查改的图标等
includes
存放业务逻辑的代码,每个模块独立成一个文件,如用户(users.php),产品(products.php)等,每个文件是各种业务逻辑的处理方法的集合,如增、删等
js
集中存放js代码,如提交前验证,改善用户体验等,每个模块自成一个文件,如用户(user.js)
templates
这个是模块,如每个网页均需要html头部和html尾部,可以写成header.php,footer.php,然后在每个页面上把头和尾包含(include或require)一次,即可统一网站风格
up 存放用户上传的图片,先按类别,再按时间分成多个文件,如/up/user/2012/2/12/xxxx.jpg

2 在需要特殊保护的页面的代码最前边加上 include (secturity1.php); 和 include (secturity2.php); 就行了

本文案例采用的PHP集成环境是我最新发布的版本PHPWAMP8.1.8.8,不管你用的是其他集成环境,还是自己安装,操作方法都是一样的,不过我还是建议大家使用我的这款PHPWAMP,我所集成的组件全是完整版,完美无错省心省力,放在U盘随时使用(支持自定义PHP版本,多版本同时运行)

根目录下,还会有许多独立的php文件,这些是呈现给用户的php文件,如用户注册(register.php),登录(login.php),首页(index.php)等文件。

程序代码及详细解释:

 

接下来,将更详细地说明每个文件夹下功能的实现方式:

security1.php 特殊用户页面保护摸板

其实早前我就有打算将MSSQL整个数据库也绿化到PHP集成环境里面,不用安装直接使用。

(1)css文件夹

security2.php 一般用户页面保护摸板

不过MSSQL数据库面对企业是收费的,所以我不敢将其绿化,万一追究起来,我就懵逼了。

必赢手机登录网址 2

login2.php 用户登陆页面

你们可以自己先安装好数据库后,按照我的方式去连接就可以了,后面我会详细演示整个流程。

这个文件夹主要是把一个模块的所有css文件集中在一起,可以一处定义多处引用,这样当需要修改时,只需要改一处,比较方便修改和维护。

我们先来看 login2.php 的代码:

 

如上所示,commom.css即是通用的Css属性,如链接的颜色,input元素去边框,统一规定网站文字大小,还有常见的clearfix或透明处理等代码,一般是会放在网站模板的头部(/templates/header.php);home.css则主要用在首页上;jquery-ui-1.8.19.custom.css则是jquery的标准界面文件

?phpsession_register(user);#增加用户名变数session_register(password); #增加密码变数session_register(tmLast); #增加时间变数if($user==){#判断是否是第一次登陆$error=Chooseyounameandinputthepasswordplease!;}$tmLast=date(U); #记录登陆时间if($user1)$user=trim($user1); #记录用户名$password=trim($password1); #记录密码if($user1$password1){if($password1==888){ #判断登陆密码是否是默认密码888结束 PHP 程式$sid=PHPSESSID=.session_id(); #保存当前session的ID号$warning=Yourpasswordisstillthedefaultpassword888,pleasechangeit.;header(Location:changePassword.php?$sidwarning=$warning); #传递警告参数warning到changePassword.php 页面exit(); #立刻结束 PHP 程式}if(strtolower($user)==root){ #判断登陆用户是否是超级用户,可以自行扩充用户$fileName=backend_index.php;}else{if(!$fileName) #判断进入登陆页面的是否是受保护页面$fileName=index.php;}$sid=PHPSESSID=.session_id(); #保存当前session的ID号header(Location:$fileName?$sid); #登陆成功进入指定页面,传递当前session的ID号,防止用户不使用 cookie 而读不到 session 值exit(); #立刻结束 PHP 程式}?htmltitle/titleheadlinkrel=stylesheethref=class/style.cssmeta;charset=gb2312/headh2LoginPage/h2?phpecho$error; #显示登陆提示?formaction=?phpecho$PHP_SELF;#提交到当前页?method=postPbName:/b?phpinclude(class/dbclass.inc); #调用dbclass.inc类,用法和 mysql.inc 类一样$q=newDB_Sql; #定义一个新的对象$q-connect($Host,$Database,$User,$Password); #连接 mysql数据库$query=selectchrUserName,chrFirstName,chrLastName.fromUser.wherechrFirstName!=.orderbychrFirstName;$q-query($query); #执行sql语句echoselectname=user1size=1;while($q-next_record()){ #从数据库中调出一般用户if($user==$q-f(0)) #判断是否是当前用户$select=selected; #是当前用户则设置为默认值else$select=;echooptionvalue=.$q-f(0).$select.ucfirst($q-f(1)).. #用户名首字大写ucfirst($q-f(2))./option;}echo/select;?/PPbPassword:/bINPUTname=password1type=password/PINPUTname=tmLasttype=hiddenvalue=?phpechodate(U)?INPUTname=fileNametype=hiddenvalue=?phpecho$fileName?PINPUTname=submittype=submitvalue=确认/P/formsecurity2.php :?phpsession_register(user); #说明同上session_register(password);session_register(tmLast);if($fileName==)$fileName=$PHP_SELF; #记录当前页面路径if($durtime==)$durtime=300; #设置 session 失效时间$currtime=date(U);if(($currtime-$tmLast)$durtime){ #判断 session是否失效//session_destroy();$error=urlencode(Seesionexpired.Loginagainplease!);header(Location:login2.php?fileName=$fileNameerror=$erroruser=$user); #跳到重新登陆页exit();}else{$tmLast=$currtime; # session 没失效则更新最后登陆时间}include(class/dbclass.inc);$q=newDB_Sql;$q-connect($Host,$Database,$User,$Password);$query=selectidUserfromUser.wherechrUserName=$user.andchrPasswd=$password;$q-query($query);if(!$q-num_rows()){ #判断是否找到密码匹配的用户$error=urlencode(PasswordiswrongorNoprivilegeuser.);header(Location:login2.php?fileName=$fileNameerror=$erroruser=$user); #跳到密码错误登陆页}else{$sid=PHPSESSID=.session_id();$q-next_record();$USERID=$q-f(idUser); #保存通过验证用户的ID号,方便以后使用}?

先来演示“本地测试时”常用的搭建方式,然后再演示网站在服务器上正式运营的搭建方式。

(2)images文件夹

security1.php :

其实没啥区别,主要是演示常规用法以及站点管理里面的用法,让各位更加熟练的使用罢了。

必赢手机登录网址 ,主要是集中存放网站会用到的一些图片资源,如网站不同规格的logo,背景图片,增删查改的图标,加载图标等等

?phpsession_register(user); #说明同上$privilege=root,macro,jackie; #设置超级用户名单列表,用,隔开$pieces=explode(,,$privilege); #取得单个超级用户名单for($i=0;$icount($pieces);$i++){if(strtolower($user)==$pieces[$i]){ #判断是否是超级用户$hasPrivilege=1;break; #跳出判断循环}}if(!$hasPrivilege){if($fileName==)$fileName=$PHP_SELF;$error=urlencode(Youhavenoprivilegetoviewthispage!);header(Location:login2.php?fileName=$fileNameerror=$errorid=$id);exit(); #跳到无权用户登陆页面}?

 

必赢手机登录网址 3

上述程序由 Macro Zeng保留完整解释权。

先来给大家演示php5.3连接MSSQL数据库的具体做法吧(数据库是SQL Server 2008)

(3)includes文件夹

在PHPWAMP中,点这里默认启动的是php5.3,点击启动(其他PHP版本请自行切换)

主要是集中保存业务逻辑处理文件,每个模块独立成一个文件,这些文件使用时,都需要进行包含(include或require):

必赢手机登录网址 4

必赢手机登录网址 5

 

其中,

启动后,点击此处浏览网站

a)_logOn.php是登录状态栏,并有一些快捷菜单,算是快捷通道板:

必赢手机登录网址 6

必赢手机登录网址 7

 

b)baseConfigus.php则是数据库配置信息,是一些常量,方便访问数据库是统一代码,且不易错:

 

必赢手机登录网址 8

在此页面的最底部,点击“点击此处查看phpinfo文件”,查看更加详细的环境内容。

c)commom.php是通用方法,如验证是否登录,是否管理员,上传文件,显示分页等

必赢手机登录网址 9

d)users.php则用来处理与用户有关的业务逻辑,如修改用户信息,登录等

 

必赢手机登录网址 10

 

(4)js文件夹

 

必赢手机登录网址 11

来到phpinfo文件页面,看到这里的Thread Safety显示的是enabled,

功能结构与includes文件夹类似,此不多述。

Thread Safety是线程安全的意思,而enabled是启动的意思,说明目前是线程安全。

(5)templates文件夹

 

用来存放网站模板,整个网站的风格在此统一:

如果Thread Safety显示的不是enabled,而是disabled,那么就是非线程安全。

必赢手机登录网址 12

看图片很明显,目前是线程安全,而且是VC6

其中,header.php定义网页的头部,每个基本页面开头都需要包含它(include /templates/header.php):

必赢手机登录网址 13

必赢手机登录网址 14

 

footer.php定义网页的尾部,每个基本页面的末尾也需要包含它:

PHP5.3以上的版本,连接MSSQL数据库不再是mssql.dll扩展,取而代之的是sqlsrv.dll扩展。

必赢手机登录网址 15

因为要选择对应的驱动程序,所以要判断是非线程安全还是线程安全,微软公司提供了相关驱动,

其中可以包含回顶部,到底部的功能,或者加上网站流量统计代码,如51la

用于PHP支持MSSQL数据库。那么我下面有这么多版本的驱动,应该选哪个呢

header_admin.php和footer_admin.php则是后台页面使用的模板,道理类似。

(PHP各版本支持MSSQL数据库的驱动下载地址请在百度搜索这个标题“PHP支持MSSQL数据库的驱动程序、驱动支持所有PHP版本(最全)”)

(6)up文件夹

必赢手机登录网址 16

这个文件夹保存用户上传的各种图片,如用户头像,产品头像等,各成一个文件夹:

 

必赢手机登录网址 17

 

在用户文件夹下面,按年月日进行保存。

刚才我们开启的PHP版本是5.3,然后又是线程安全,而且phpinfo页面显示是VC6

(7)根目录下的php文件

所以要选择的是php_pdo_sqlsrv_53_ts_vc6.dll和php_sqlsrv_53_ts_vc6.dll这两个。

这些文件,一般就是直接面向用户的,即呈现给用户看的,虽然业务逻辑主要在includes文件夹中集中保存,但页面中不免仍需要一些访问数据库的代码。这些文件的共同特点是,必须包含网站模板,以统一风格:

必赢手机登录网址 18

下面以用户登录(login.php)为例:

所以很多用户说连接失败,就是因为你选择的驱动版本有问题,要对号入座才行。

a)头部

 

必赢手机登录网址 19

 

b)尾部

 

必赢手机登录网址 20

打开PHPWAMP版本文件所在目录。

c)中间

必赢手机登录网址 21

必赢手机登录网址 22

 

注意,这里主要是html语言写成的用户界面,需要一些构成:

 

css或js引用,form,提交前的有效性验证onsubmit="return validateLogin();",以及登录出错时保留用户之前输入的信息if($_SERVER['REQUEST_METHOD']=='POST'){print $_POST['name'];}等

 

d)登录提交(post方式)的处理,这里采用同一个页面进行处理

来到对应的ext目录,把php_pdo_sqlsrv_53_ts_vc6.dll和php_sqlsrv_53_ts_vc6.dll复制进去

必赢手机登录网址 23

这两个驱动文件一个是以pdo的方式连接,另一个则是以sqlsrv_connect的方式连接。

即提交时,仍跳转到当前页面,只是需要对提交方式进行判断(是get还是post),然后做出不同的处理:

必赢手机登录网址 24

其中Get方式时,若已经登录,则自动跳转到首页;若是Post方式时,时进行登录验证,验证成功则跳转到首页,失败时停留在当前页面。

 

(8).一些处理技巧:

复制进去后如下图所示。

a)借鉴C#的String.Format方法(保存在/includes/commom.php中):

必赢手机登录网址 25

必赢手机登录网址 26

 

使用时,很方便,如打印从数据库中读出的数据时:

 

必赢手机登录网址 27

 

b)由于以上一步a)的方式访问时,关于引号(单引号和双引号的问题),有时难以进行转义或转义时即出错,因此,可能灵活使用jquery来进行事件绑定(而非html元素事件的方式),如删除前的确认提示:

好,接着下一步,打开对应版本的PHP配置文件

必赢手机登录网址 28

必赢手机登录网址 29

本文由bluesky原创,具有独立产权,如转载请注明出处。

 


 

 

在打开的php.ini文件中

extension=php_sqlsrv_53_ts_vc6.dll

extension=php_pdo_sqlsrv_53_ts_vc6.dll

加入上面这两行,然后搜索“mssql.secure_connection”这一段内容,

将“mssql.secure_connection = Off”改为“mssql.secure_connection = On”

必赢手机登录网址 30

 

 

修改完成后,双击此处重启当前apache服务器即可。

必赢手机登录网址 31

 

 

重启后,在phpinfo页面如果能搜到sqlsrv,说明已经成功配置好了,如图所示。

必赢手机登录网址 32必赢手机登录网址 33

 

 

 

接下来我们来连接一下数据库,看是否正常!

在测试数据库之前,我们先来查看一下数据库端口号是多少,右键“新建查询”

必赢手机登录网址 34

 

 

输入exec sys.sp_readerrorlog 0, 1, 'listening' 然后右键点击执行。

必赢手机登录网址 35

 

发现端口号是默认的1433,这样我们在连接数据库的时候就不需要指定端口号了,

因为是默认端口,所有我们可以在PHP页面可以这么写。代码随便打打,证明能连接上就行了。

 

<?php

 try {
   $dbName = "sqlsrv:Server=127.0.0.1;Database=lccee";   //这里是服务器IP地址和数据库名,端口不是默认的话记得改一下
   $dbUser = "sa";    //用户名
   $dbPassword = "111111";    //登陆密码

   $db = new PDO($dbName, $dbUser, $dbPassword);   

   if ($db)   
  {       
     echo "恭喜你!数据库连接成功了!!<br />";   
   }


     }
        catch (Exception $e){ echo "数据库连接失败!!";   }

?>

 

 

如果不是默认端口,假设是1688端口,那么上面这一行就应该改为。

$dbName = "sqlsrv:Server=127.0.0.1,1688;Database=lccee";

当然,就算是默认端口,你也可以加上默认端口号,也是没错的,如下代码所示。

$dbName = "sqlsrv:Server=127.0.0.1,1433;Database=lccee";

易错点:这里的ip+端口,不是冒号!而是逗号,如果写成“127.0.0.1:1433”是错误的!

 

 

好,我们打开此页面看看效果,运行代码提示连接成功,说明没问题。

必赢手机登录网址 36

 

 

假设我把连接里面的数据库密码改一下,再看,就提示失败了,如下图。

必赢手机登录网址 37

 

 

 

 

前面我们不是在php配置里加入了两个DLL吗,分别是

php_pdo_sqlsrv_53_ts_vc6.dll和php_sqlsrv_53_ts_vc6.dll

这两个驱动文件一个是以pdo的方式连接,另一个则是以sqlsrv_connect的方式连接。

 

 

而上面我们演示的连接方式是pdo,现在我们来用sqlsrv_connect的方式连接。

那么代码可以这么写,创建一个sqlsrv_connect.php文件,里面写上如下代码

<?php

$serverName = "NEPTUNE-PC"; //serverNameinstanceName
$connectionInfo = array( "Database"=>"lccee", "UID"=>"sa", "PWD"=>"111111");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
 
if( $conn ) {
     echo "连接成功<br />";
}else{
     echo "连接失败<br />";
     
}

?>

 

然后再测试看,也是连接成功了!

必赢手机登录网址 38

 

 

假如我把正确的密码111111改成了错误的密码888888,

(具体的数据库密码,看你自己的MSSQL数据库,我的密码是111111)

必赢手机登录网址 39

 

那么就显示连接错误了,把正确密码改成错误以后,就显示连接失败了。

必赢手机登录网址 40

 

 

 

下面我们再改一下代码,读取数据库表里的内容,这是我创建的数据库,

数据库名为Lccee,在这个数据库里面有个表叫phpwamp。

必赢手机登录网址 41

 

 

 

然后我随便添加几行代码,用来读出数据表里面的内容。

<?php

$serverName = "NEPTUNE-PC"; //serverNameinstanceName
$connectionInfo = array( "Database"=>"lccee", "UID"=>"sa", "PWD"=>"111111");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
 
if( $conn ) {
     echo "连接成功<br />";
}else{
     echo "连接失败<br />";
     
}

$query ="select * from phpwamp";
$result = sqlsrv_query($conn, $query);
while($row = sqlsrv_fetch_array($result)){
 
       print_r($row);
       echo "<br>";
}

?>

 

 

然后保存,这时候我们再来看看,运行后就读出这个数据表里的内容了。

必赢手机登录网址 42

 

 

 

 

最后我们再演示一下,在服务器上用站点管理创建的站点如何连接MSSQL数据库。

 

开始我们的教程,第一步先把主界面修改成80端口,如下图所示。

必赢手机登录网址 43

必赢手机登录网址 44

 

 

 

修改端口后切换到任意处在apache2.4之下的PHP版本,php5.5、php5.6、php7都可以。

必赢手机登录网址 45

 

 

 

然后打开apache2.4站点管理,如下图所示。

必赢手机登录网址 46

 

 

建立站点,如图所示(Apache2.4站点管理可建立无数站点,每个站点可指定不同的PHP版本,也可以自定义设置PHP版本,还可以多个不同PHP版本同时运行,右键功能丰富)如图下所示,我选的是php5.4这个版本,填写完毕后点击“添加站点”

必赢手机登录网址 47

 

 

添加后左侧站点列表里就会出现了添加的站点,右键站点选择“生成此站hosts内容”

必赢手机登录网址 48

 

 

然后点击此处的按钮去运行站点,如下图红色箭头所示。

必赢手机登录网址 49

 

右键站点,选择“域名浏览该网站”,就可以用域名浏览(在服务器上再进行域名解析就可以了)

如果不懂如何解析,可以看看我这篇文章

必赢手机登录网址 50

 

 

 

点击“域名浏览该网站”后,我们就可以看到这个页面,如下图所示。

必赢手机登录网址 51

 

 

 

鼠标拉动滚动条往下看,在这里点击查看更加详细的phpinfo()信息。

必赢手机登录网址 52

 

 

 

可以看到在phpinfo文件页面,这里的Thread Safety显示的是enabled,

Thread Safety是线程安全,而enabled是启动,那么说明目前是线程安全。

必赢手机登录网址 53

 

 

目前的PHP版本是php5.4,所以我们应该选择的两个DLL文件是

php_pdo_sqlsrv_54_ts.dll 和 php_sqlsrv_54_nts.dll,如下图

必赢手机登录网址 54

 

 

 

和前面一样把这两个DLL复制到对应PHP版本的ext文件夹里面。

必赢手机登录网址 55

 

 

这时候我们回到站点管理界面,右键站点打开与之对应的php.ini配文件。

必赢手机登录网址 56

 

 

在打开的php.ini文件中

extension=php_sqlsrv_54_ts.dll

extension=php_pdo_sqlsrv_54_ts.dll

加入上面这两行,然后搜索“mssql.secure_connection”这一段。

把“mssql.secure_connection = Off”改为“mssql.secure_connection = On”

必赢手机登录网址 57

 

 

 

修改后保存,再次重启Apache服务,创建一个sqlsrv_connect.php文件,里面写上如下代码

<?php


$serverName = "NEPTUNE-PC"; //serverNameinstanceName
$connectionInfo = array( "Database"=>"lccee", "UID"=>"sa", "PWD"=>"111111");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
 
if( $conn ) {
     echo "连接成功<br />";
}else{
     echo "连接失败<br />";
     
}

$query ="select * from phpwamp";
$result = sqlsrv_query($conn, $query);
while($row = sqlsrv_fetch_array($result)){
 
       print_r($row);
       echo "<br>";
}

?>

 

 

然后浏览sqlsrv_connect.php文件,就能读出数据库里面的信息了,如下图

必赢手机登录网址 58

其他PHP版本也是一样的道理,依样画葫芦即可,如有疑问可以联系我。

 

以后如果时间允许,我也会考虑制作一个Linux下的PHPWAMP,应网友的要求,Mac系统的也在考虑,不过对Mac系统不是特别了解,需要一定时间研究研究,最近工作也挺忙的,一个人时间有限,估计进度会很慢。

后期我会在PHPWAMP版本里配置好各版本PHP与MSSQL的连接,到时你们就不用自己配置了

 

 

PHP各版本支持MSSQL数据库的驱动下载地址请在百度搜索这个标题“PHP支持MSSQL数据库的驱动程序、驱动支持所有PHP版本(最全)”