用Delphi程序更新PHP网站-初级篇
一、采用的软件环境:
OS:Microsoft Windows 2000 Server 5.0.2195 Service Pack 4 内部版本号 2195
IE:6.0.2800.1106
Delphi :Version 6.0 (Build 6.240) Update Pack 2
Indy:9.0.4 beta
PHP:4.4.2
Apache:2.0.55
Serv-U:6.3.0.0
说明:
1、OS与IE版本信息由开始-〉程序-〉附件-〉系统工具-〉系统信息获得
2、Delphi版本信息由Delphi-〉Help-〉About获得
3、PHP版本信息由PHP函数phpinfo()获得
4、Apache版本由apache -v 获得
5、Indy为Delphi控件包,这里主要用到的是其Ftp控件
三、续篇
中级篇:采用ZeosLib控件进行Mysql数据库编程
高级篇:编写文章管理程序,支持Delphi程序与PHP程序同时使用。
四、实现方法
作为初级篇,就不牵扯数据库(中级篇中介绍)。只实现一个最简单的应用, 更新网站标题、网站关键字、网站备案信息这三个信息。采用FTP进行更新储存网站标题、网站关键字、网站备案信息的变量文件data/info.php文件
五、文件说明
data/info.php 网站变量文件
index.php 网站首页
index.php.php 网站模版
完整文档下载地址:http://cnc.zerolone.com/1.zip
代码+indy控件打包下载地址:http://cnc.zerolone.com/1.rar
代码+indy控件+apache+php+serv-U打包下载地址:http://cnc.zerolone.com/2.rar
运行演示,采用SDemo2录制:
exe格式 http://cnc.zerolone.com/1.exe
smv格式 http://cnc.zerolone.com/1.smv
我的联系方式:
zerolone@163.com
16198008
六、开始
建立两个文件index.php.php与index.php
index.php.php 写主要的html代码
index.php 写代码
index.php.php类似如下(完整版本请察看index.php.php):
<html>
<head>
<title><?=$site['title']?></title>
<meta name="description" content="<?=$site['keyWords']?>" />
<meta name="keywords" content="<?=$site['description']?>" />
</head>
<body>
<!-- 网站头 -->
<div><span><?=$site['title']?></span><?=$site['description']?></div>
<!-- 网站结束 -->
<div><a href="http://www.miibeian.gov.cn" target="_blank"><?=$site['cert']?></a>©2006</div>
</body>
</html>
index.php代码如下:
<?php
//读取变量
require('data/info.php');
//读取文件
require('index.php.php');
?>
很简单的调用。
显示效果如下图:
下面我们用Delphi来制作更新网站标题、网站关键字、网站备案信息部分。
我们先看一下完整版本最终的效果,我们当前要做的就是设置这一块。如图1-1

图1-1
那么, 我们开始了。 启动Delphi,新建一个Application。
加入2个按钮
,如图1-2。

图1-2
一个按钮为本地, 一个按钮为设置,如图1-3

图1-3
然后建立两个Form
,分别取名为:SiteSettingForm与ClientSettingForm。
其中ClientSettingForm的控件如图1-4所示。

图1-4
SiteSettingForm的控件如图1-5所示

图1-5
首先我们来处理ftp连接问题。我已经在系统中安装了Serv-U,设置IP:127.0.0.1 用户名123456 密码123456。
再ClientSettingForm的FormCreate事件中添加读取ini文件代码, 读取上次保持的ini文件, 如果是第一次运行,则不能读取, 需要进行设置。
FromCreate代码如下:
<?php
procedure TClientSettingForm.FormCreate(Sender: TObject);
begin
//读取ini
try
Edt_IP.Text := GetIni('IP');
Edt_User.Text := GetIni('User');
Edt_Password.Text := GetIni('Password');
Edt_CacheFolder.Text := GetIni('CacheFolder');
except
MessageBox(0, '读取配置文件 setting.ini 失败!', pchar(caption), MB_OK +
MB_ICONEXCLAMATION);
end;
//FTP默认设置
BitBtn_EditFtp.Enabled := false;
// DirectoryListBox1.Visible := false;
if IdFtp1.Connected then
Btn_Connect.Enabled := false
else
Btn_DisConnect.Enabled := false
end;
?>
写完读取ini代码, 接下来编写测试连接的代码,Btn_Connect的onClick事件,读取TextBox里面的ip,用户名,密码设置,尝试连接ftp服务器,返回连接信息。代码如下
<?php
procedure TClientSettingForm.Btn_ConnectClick(Sender: TObject);
begin
if IdFtp1.Connected then
else
with IdFTP1 do
try
User := Edt_User.Text;
Password := Edt_Password.Text;
Host := Edt_IP.Text;
TransferType := ftBinary;
Connect;
Btn_DisConnect.Enabled := true;
Btn_Connect.Enabled := false;
except
MessageBox(0, 'Ftp服务器连接失败!', '连接失败', MB_OK + MB_ICONEXCLAMATION);
end;
end;
?>
下面是断开ftp服务器代码:
<?php
procedure TClientSettingForm.Btn_DisConnectClick(Sender: TObject);
begin
try
IdFtp1.Disconnect;
Btn_DisConnect.Enabled := false;
Btn_Connect.Enabled := true;
except
end;
end;
?>
下面编写选择ftp缓存目录代码,缓存的优点在于不必每次读取服务器的设置, 只要修改好本地文件的设置, 直接上传直服务器。
<?php
procedure TClientSettingForm.Btn_SelectDirClick(Sender: TObject);
begin
try
Edt_CacheFolder.Text := BrowseDir(handle, '浏览文件夹', Edt_CacheFolder.Text);
except
end;
end;
?>
BrowseDir函数为自定义函数,在文件ClientFunction.pas文件中
ftp连接测试无误后就可以点击保存按钮, 保存ftp设置。保存代码如下:
<?php
procedure TClientSettingForm.BitBtn_EditFtpClick(Sender: TObject);
begin
try
SaveIni(Edt_IP.Text, 'IP');
SaveIni(Edt_User.Text, 'User');
SaveIni(Edt_Password.Text, 'Password');
SaveIni(Edt_CacheFolder.Text, 'CacheFolder');
MessageBox(0, '保存成功!', pchar(caption), MB_OK +
MB_ICONEXCLAMATION);
BitBtn_EditFtp.Enabled := false
except
MessageBox(0, '保存失败!请检查文件 setting.ini 是否可写', pchar(caption),
MB_OK +
MB_ICONEXCLAMATION);
BitBtn_EditFtp.Enabled := True;
end;
end;
?>
我们运行程序测试一下:

图1-6错误的参数

图1-7正确的参数
然后我们到SiteSettingForm窗口。首先编写读取文件代码,读取ftp服务器上的文件,即为网站变量文件,如果本地存在该文件, 提示是否覆盖, 如果不存在则直接获取。
<?php
procedure TSiteSettingForm.Btn_ReadClick(Sender: TObject);
var
ClientFile: string;
begin
with ClientSettingForm do
begin
ClientFile := Edt_CacheFolder.Text + 'info.php';
Edit1.Text := ClientFile;
Btn_Connect.Click;
try
if FileExists(ClientFile) then
begin
if MessageBox(handle, '文件已经存在,是否覆盖?', pchar(caption),
mb_IconInformation + mb_YesNo) = mrYes then
begin
IdFtp1.Get('data/info.php',
Edt_CacheFolder.Text + 'info.php', true);
end;
end
else
IdFtp1.Get('data/info.php',
Edt_CacheFolder.Text + 'info.php', true);
Memo1.Lines.Clear;
Memo1.Lines.LoadFromFile(Edt_CacheFolder.Text + 'info.php');
except
showmessage('连接服务器失败,请检查本地设置!');
end
end;
end;
?>
获取服务器文件成功后读取文件内容,依次写入各个TextBox,代码如下:
<?php
procedure TSiteSettingForm.Button1Click(Sender: TObject);
var
i: Integer;
F: TextFile;
S: string;
thestring: string;
begin
begin
AssignFile(F, Edit1.Text); { File selected in dialog }
Reset(F);
//标题
for i := 1 to 3 do
Readln(F, S);
Edt_Sitename.Text := S;
//关键字
for i := 1 to 3 do
Readln(F, S);
Edt_Keyword.Text := S;
for i := 1 to 3 do
Readln(F, S);
Edt_site_description.Text := S;
for i := 1 to 3 do
Readln(F, S);
Edt_site_cert.Text := S;
thestring := S;
CloseFile(F);
end;
end;
[php]
进行修改之后,写入文件然后再上传,即完成所有代码的编写。
[php]
procedure TSiteSettingForm.Button2Click(Sender: TObject);
var
i: integer;
begin
Memo2.Clear;
for i := 1 to Memo1.Lines.Count do
begin
if i = 3 then
Memo2.Lines.Add(Edt_Sitename.Text)
else if i = 6 then
Memo2.Lines.Add(Edt_Keyword.Text)
else if i = 9 then
Memo2.Lines.Add(Edt_site_description.Text)
else if i = 12 then
Memo2.Lines.Add(Edt_site_cert.Text)
else
Memo2.Lines.Add(Memo1.Lines.Strings[i - 1]);
end;
Memo2.Lines.SaveToFile(Edit1.Text);
end;
procedure TSiteSettingForm.Button3Click(Sender: TObject);
begin
with ClientSettingForm do
begin
Btn_Connect.Click;
try
IdFTP1.Put(Edit1.Text, 'data/info.php', false);
showmessage('更新成功!');
except
showmessage('上传错误!');
end;
end;
end;
?>
最终显示结果抓图:
