为了将C/S写的程序(Powerbuilder 6.5+MS SQL Server2000)换成网页版,打算使用PHP 7.4 + MS SQL Server 2014 +Apache 2.4 + LayUI来写。
安装服务器、安装数据库、迁移数据库花费了一些时间,本来想用MS SQL Server里面的备份与还原来做(以前我都是这么做的),担心版本变化大没有采用,使用Powerbuilder里面的数据管道来做,结果二进制数据没有保留,后面还是个麻烦事情。
大体数据迁移完了,进入写程序,结果连接数据库花费了好长时间,最后才知道在Win10企业版上的Apache+PHP需要安装ODBC数据库引擎,安装了ODBC11后就可以连接了。
这个过程我更新了《PHP(2):PHP读取MS Sql Server 2014数据库数据》以便以后遇到问题再来看,有记录可以帮助自己也可以帮助别人少踩坑。
又遇到乱码问题,又折腾了好长时间才搞定。
终于正常了,先将常用操作练习一遍,为后面做准备。
1、获取数据表的记录总数
<?php
header('Content-Type: text/html; charset=utf-8');
//使用pdo连接数据库:
$conn = new PDO( "sqlsrv:Server=服务器地址;Database=数据库名称", '用户名', '密码' );
$conn->exec('set names utf8');
//得到数据表的总数
$sql="SELECT count(*) FROM htuser";
$result=$conn->query($sql);
$rows = $result->fetch();
$rowCount = $rows[0];
echo '记录总数:'.$rowCount;
?>
<?php
header('Content-Type: text/html; charset=utf-8');
//使用pdo连接数据库:
$conn = new PDO( "sqlsrv:Server=服务器地址;Database=数据库名称", '用户名', '密码' );
$conn->exec('set names utf8');
//得到数据表的总数
$sql="SELECT * FROM htuser";
//查询数据库的数据并返回结果集(预处理对象):
$result=$conn->query($sql);
$rows=$result->fetchAll(PDO::FETCH_ASSOC);
echo '记录总数:'.sizeof($rows);//返回记录总数
//echo '记录总数:'.count($rows);//这个也正确返回记录总数
?>
2、获取数据库查询表的记录并返回JSON格式
<?php
header('Content-Type: text/html; charset=utf-8');
//使用pdo连接数据库:
$conn = new PDO( "sqlsrv:Server=服务器地址;Database=数据库名称", '用户', '密码' );
$conn->exec('set names utf8');
//得到数据表的总数
$sql="SELECT * FROM htuser";
//查询数据库的数据并返回结果集(预处理对象):
$result=$conn->query($sql);
$rows=$result->fetchAll();
print_r($rows,false);//输出全部的数组内容
?>
<?php
header('Content-Type: text/html; charset=utf-8');
//使用pdo连接数据库:
$conn = new PDO( "sqlsrv:Server=服务器地址;Database=数据库名称", '用户名', '密码' );
$conn->exec('set names utf8');
//得到数据表的总数
$sql="SELECT * FROM htuser";
//查询数据库的数据并返回结果集(预处理对象):
$result=$conn->query($sql);
$rows=$result->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rows,JSON_UNESCAPED_UNICODE);
?>
echo json_encode($rows,JSON_UNESCAPED_UNICODE);
这里如果不加JSON_UNESCAPED_UNICODE,即使写了$conn->exec('set names utf8');返回的也会是乱码,一定要加上。
3、获取数据表分页记录数据并返回JSON格式 ( 以LayUI的分页数据为例 )
<?php
//获取具体的页数
$viewPage = isset($_POST['page']) ? intval($_POST['page']):1;
//获取每页的行数
$viewRows = isset($_POST['rows']) ? intval($_POST['rows']):10;
$offset = ($viewPage-1) * $viewRows;
$returnArr=array();
//使用pdo连接数据库:
$conn = new PDO( "sqlsrv:Server=服务器地址;Database=数据库名称", '用户名', '密码' );
//pdo设置客户端字符集:
$conn->exec('set names utf8');
$sql="SELECT count(*) FROM htuser";
$result=$conn->query($sql);
$rows = $result->fetch();
$rowCount = $rows[0];
$returnArr['total']=$rowCount;
//准备返回的数据记录
$sql="SELECT TOP $viewRows * FROM htuser WHERE c01 NOT IN ( SELECT TOP $offset c01 FROM htuser ORDER BY c01 ) ORDER BY c01";
$result=$conn->query($sql);
$rows=$result->fetchAll(PDO::FETCH_ASSOC);
$returnArr['rows']=$rows;
echo json_encode($returnArr,JSON_UNESCAPED_UNICODE);
?>
4、游标问题
习惯了使用游标操作数据,所以想找PHP使用游标的资料,可是找了半天时间,也没有在发现。类似游标的替代:
<?php
require 'ZTBLinkConfig.php';//加载数据库
$sql="select c01,c07 from htuser";
$res=$ZTBConn->prepare($sql);//准备查询语句
$res->execute();//执行
while( $result=$res->fetch(PDO::FETCH_ASSOC) ){
echo $result['c01']." ".$result['c07'].'<br>';
}
?>