PHP尝试控制.dbf数据库的一系列事件记录

Visual FoxPro的历史

工欲善其事,必先利其器,知已知彼,方能百战不殆。即然要控制.dbf,那就要先了解Visual FoxPro。从2005年起,Visual FoxPro的开发投入,已经大幅缩减,微软对Visual FoxPro 9的普通用户提供支持到2010年,购买扩展支持服务的可以到2015年。如今Visual FoxPro已经寿终正寝,成为绝唱,虽是“伊人已乘黄鹤去”,但"百足”的精神,可能还要在很多年后,才能真正的成为历史。

使用ADODB / ODBC的方式

使用ADODB的方式,从网络上的这篇文章中受益匪浅。
我在电脑添加系统和用户的ODBC后,同样的错误提示,像Jason一样,问题均未得到解决。且更严峻的问题是我们的网页服务器是NAS的,基于LINUX的系统,WINDOWS的ODBC对它而言几乎是不会相交的两条平行线。也许ADODB有成功的可能性,但NAS上使用ODBC的可能性几乎没有。所以ODBC就止于此了,但ADODB在没有彻底弄明白之前,先画上问号。

使用PHP自带的db_base

继续查阅资料,也许使用db_base不是什么复杂的代码,但只看了前面的代码,继续沿着这个方向思考下去的动力就几乎已经没有了。我的.dbf不可能存放在本机上......

$data="datasource/cet.dbf";//dbase数据库的地址和文件名
$db=dbase_open($data,0) or die ("Can not connect to the *.dbf file!");
$db=dbase_open("book1.dbf",2);
$result=dbase_add_record($db,$content);//$content为一数组,包含所有要添加的字段值按字段顺序排列

另一个不容忽视的问题:目前无法存取 dBase 中的 indexes 或 memo 的栏位,亦无法将资料表锁上。它不是真正的资料库系统,仅是储存资料的资料表而已,二个以上的使用者同时存取同一个资料表时甚至可能会发生 dbf 资料表崩毁的情形。如果可能,最好是用真正的资料库系统,如 MySQL 或 Oracle 等,就不会有多人使用时导至资料损毁的困扰。

折中的处理方式:使用MS SQL

三条道路都“禁止通行”的情况下,我开始考虑折衷的方式,VF可以使用性能更好的MS SQL,PHP也能控制MS SQL,那何不选择这个方向?记得先前有写过一个测试连接MS SQL的小程式,果断拿出来运行,但空白的显示页面,让此时抱着些许希望的我有些失落。是的,先前的PHP环境5.2是可以运行的,但今年上半年我已经升级到PHP7.2的环境了。PHP从5.3.6 开始就不支持 php_mssql 扩展了,要一直使用PHP5.2吗?公司有一台NAS的服务器192.168.100.2是可以支持的,但新购买的NAS可是7.2的环境,我不可能分在两台服务器来放我的网页程式。也许WINDOWS总能找到解决的办法,但在NAS面前,MS_SQL也是一个让人绝望的句号。

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->query("set names utf-8");
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
image

回到ADODB

ADODB的连接MS SQL有两种方法:

方法一:我称之为ODBC式

include("adodb/adodb.inc.php"); //包含adodb类库文件 
$conn=NewADOConnection('odbc_mssql');      //连接SQL Server数据库
$conn->Connect("PROVIDER=MSDASQL;Driver={SQL Server};Server=localhost;Database=mydb;",'username','password');

方法二:

include('adodb5/adodb.inc.php');
$db_type = "mssqlnative";
$server = "server";
$db_user = "username";
$db_pass = "password";
$db_name = "dataname";
$conn = ADONewConnection($db_type);
$conn->Connect($server,$db_user,$db_pass,$db_name);

我使用的是方法二,方法二在实际使用时,数据库里取出来的中文内容会乱码。

image

将浏览器中页面的编码调整为GB2312/GBK就可以正常显示了。

通常编码指两种:文件本身的编码、页面申明的编码

conn.php文件,增加


header("Content-Type: text/html;charset=GB2312");//GBK的编码也可以正常显示

实际上加了这行代码后,即使conn.php这个文件其本身的文件编码为utf-8,也沒有影响,调用此文件的其它PHP文件编码和页面编码均为utf-8,都沒有出现乱码的情况。从这种情况来看,header申明的文件编码,优先级别要高于文件本身的编码。

将header设置为Big5码后,页面是这样的,其实一开始使用的就是Big5码,这是因为从服务器检查数据表的编码就是Big5的,所以从Big5码到使用GB2312/GBK,中间花了我一点点时间来走出这个坑。

截止到现在还有一个困惑没有解决,明明数据表的编码设置的是Big5,为何页面申明使用GBK/GB2312却能正常显示Big5的内容?而页面申明的编码设置为UTF-8或Big5却是不能正常显示的?

image
image

关于文件的编码知识有兴趣的可以看这两篇文章 :SUBLIME的设置参考文章网页的编码参考文章

我想我的人生一定是悲剧太少了,老天绝对不会给我这么容易就能过的坎。T_T

程式移植到服务器后,mssqlnative extension not installed,就这么直接的拒绝了我的努力!

image

本文一开始就有提到过NAS服务器的可能不支援性,没想到结局真的就是被拒绝的这么彻底。PHP5.2以后没有MS_SQL了,需要安装微软自己的sqlsrv的扩展支持+安装微软自己的ODBC插件,才能让我电脑上的PHP7.2环境不被开挂。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。