个人空间不稳定, 如果图片不能访问, 请在
C:\WINNT\system32\drivers\etc\hosts文件中添加一行61.163.200.166 cnc.zerolone.com
用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
ZeosLib:6.1.5-stable(中级版本新加入)下载地址 http://zeoslib.sourceforge.net/
mysqlserver: 4.1.20-community-nt(中级版本新加入)
说明:
1、OS与IE版本信息由开始-〉程序-〉附件-〉系统工具-〉系统信息获得
2、Delphi版本信息由Delphi-〉Help-〉About获得
3、PHP版本信息由PHP函数phpinfo()获得
4、Apache版本由apache -v 获得
5、Indy为Delphi控件包,这里主要用到的是其Ftp控件
6、ZeosLib为Delphi操作Mysql的控件包,这里主要利用到的是其操作数据库。
7、mysqlserver为数据库引擎
二、前篇
初级篇:通过Indy控件操作文件,本地缓存、修改。文章地址 http://www.phpx.com/happy/thread-125619-1-2.html
三、续篇
高级篇:编写文章管理程序,支持Delphi程序与PHP程序同时使用。
四、实现方法
本篇主要描述用Zlib控件连接MysqlServer,进行操作数据库,目前操作数据库有两种方式,1、通过http访问定制的php进行操作,2、通过数据库引擎连接。我是介绍后者,关于连接MysqlServer有控件或者方法有dbexpress、ADO+ODBC以及ZeosLib等, 具体各个控件的优缺点,我这里就不评述了。
五、文件说明
初级篇代码+indy控件打包下载地址:http://cnc.zerolone.com/1.rar
初级篇代码+indy控件+apache+php+serv-U打包下载地址:http://cnc.zerolone.com/2.rar
中级篇完整代码+indy控件+ZeosLib控件打包下载地址:http://cnc.zerolone.com/002/2.rar
代码中的dhtmled.ocx需要注册,cmd regsvr32 dhtmled.ocx
初级篇运行演示,采用SDemo2录制:
exe格式 http://cnc.zerolone.com/1.exe
smv格式 http://cnc.zerolone.com/1.smv
中级篇运行演示,采用SDemo2录制:
exe格式 http://cnc.zerolone.com/002/2.exe
smv格式 http://cnc.zerolone.com/002/2.smv
我的联系方式:
zerolone@163.com
16198008
六、开始
我这里制作网站的一个部分,友情连接部分,建立两个文件index.php.php与index.php
index.php.php 写主要的html代码如下(完整版本请察看index.php.php):
<!-- 友情连接_开始 --><div>
<table width="100%" cellpadding="0" cellspacing="0">
<tr><td><a href="./link.php"><img src="images/link.gif" border="0"></a></td></tr>
<?php
if(isset($link_list))
{
foreach ($link_list as $link)
{
?>
<tr>
<td style="text-align:center" title="<?=$link['link_name']?>" height="35px">
<a href="<?=$link['link_url']?>" target="_blank"><img src="<?=$link['link_pic']?>" border="0" width="88px" height="31px"></a></td>
</tr>
<?php
}
}
?>
</table></div>
<!-- 友情连接_结束 -->
很简单的调用。
最终显示效果如图2-1:

图2-1
下面我们用Delphi来制作添加、修改网站友情连接部分。
我们先看一下完整版本最终的效果,我们当前要做的就是设置这一块。如图2-2

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

图2-3
一个按钮为添加,一个按钮为查看。
然后建立三个Form
,分别取名为:EditLinkForm、AddLinkForm以及ReadLinkForm。其中点击添加显示AddLinkForm,点击查看显示ReadLinkForm。
下面我们开始添加功能代码:
在我的初级篇中有一个客户端设置窗体SiteSettingForm,这次我们需要增加一些控件,来设置Mysql的连接参数,如图2-4所示

图2-4
其中控件有1个TabSheet,若干Label与Button,注意这里要添加一个ZConnection1与ZQuery1(之前需要安装这个组件包)。主要代码有按钮测试连接、修改即可。代码如下(代码有删减,完全文件查看代码):
测试连接按钮, 主要说明,当数据库已经连接,则不操作,否则读取相应Edit里面的值作为ZConnection的连接参数,根据连接的情况,反映出来。
<?php
procedure TClientSettingForm.Btn_DBConnectClick(Sender: TObject);
begin
if ZConnection1.Connected then
else
with ZConnection1 do
try
User := Edt_DBUser.Text;
Password := Edt_DBPassword.Text;
HostName := Edt_DBIP.Text;
Database := Edt_DBDatabase.Text;
Protocol := combo_Protocol.Text;
Connect;
Btn_DBDisConnect.Enabled := true;
Btn_DBConnect.Enabled := false;
except
MessageBox(0, '数据库连接失败!', '连接失败', MB_OK + MB_ICONEXCLAMATION);
Btn_DBDisConnect.Enabled := false;
Btn_DBConnect.Enabled := true;
end;
end;
?>
修改按钮,将连接数据库的参数写入文件, 方便下次的调用。返回正确或者错误的提示。
<?php
procedure TClientSettingForm.BitBtn_EditDBClick(Sender: TObject);
begin
try
SaveIni(Edt_DBIP.Text, 'DBIP');
SaveIni(Edt_DBUser.Text, 'DBUser');
SaveIni(Edt_DBPassword.Text, 'DBPassword');
SaveIni(Edt_DBDatabase.Text, 'DBDatabase');
SaveIni(Edt_DBTablePre.Text, 'DBTablePre');
SaveIni(Edt_RecordLimit.Text,'RecordLimit');
MessageBox(0, '保存成功!', pchar(caption), MB_OK + MB_ICONEXCLAMATION);
BitBtn_EditDB.Enabled := false
except
MessageBox(0, '保存失败!请检查文件 setting.ini 是否可写', pchar(caption), MB_OK + MB_ICONEXCLAMATION);
BitBtn_EditDB.Enabled := True;
end;
end;
?>
完成了ClientSettingForm的代码, 我们来看到AddLinkForm的窗口的控件如图2-5所示。

图2-5
其中有4个Label、3个Edit、2个Button、1个SpinEdit。
主要的事件为提交友情连接按钮,主要包括判断标题,Sql提交语句的构造,返回操作情况, 代码如下:
<?php
procedure TAddLinkForm.Btn_Add_LinkClick(Sender: TObject);
var
link_title, link_url, link_pic, link_theorder: string;
SqlL, SqlR: string;
//可否提交
CanInsert: boolean;
begin
CanInsert := true;
link_url := Edt_url.Text;
link_pic := Edt_pic.Text;
link_theorder := Edt_theorder.Text;
//标题
link_title := Edt_title.Text;
link_title := CheckString(link_title, 200);
if (link_title = '') then
begin
CanInsert := false;
MessageBox(handle, '友情连接标题不能为空!', pchar(caption),
mb_IconInformation);
end;
if CanInsert then
begin
//添加一个投票选项
SqlL := 'insert into ' + str_TablePre + 'link (';
SqlR := 'values (';
//标题
SqlL := SqlL + 'title,';
SqlR := SqlR + '''' + link_title + ''',';
//类型
SqlL := SqlL + 'url, ';
SqlR := SqlR + '''' + link_url + ''',';
//是否选定
SqlL := SqlL + 'pic, ';
SqlR := SqlR + '''' + link_pic + ''',';
//内容
SqlL := SqlL + 'theorder)';
SqlR := SqlR + link_theorder + ' );';
try
ClientSettingForm.Btn_DBConnect.Click;
ClientSettingForm.ZQuery2.SQL.Text := SqlL + SqlR;
ClientSettingForm.ZQuery2.ExecSQL;
MessageBox(handle, '友情连接添加成功!', pchar(caption), mb_IconInformation);
//重置
Edt_title.Text := '';
Edt_url.Text := '';
Edt_pic.Text := '';
Edt_theorder.Text := '';
except
MessageBox(handle, '友情连接添加失败!', pchar(caption), mb_IconInformation);
end;
ReadLinkForm.Menu_Read_Link.Click;
end;
end;
?>
添加完了友情连接,我们来到ReadLinkForm,如图2-6

图2-6
该窗体有一个DataSource控件,以及一些按钮。主要事件有,读取友情连接,修改友情连接,删除友情连接。代码分别如下:
读取友情连接,构造Sql语句,返回数据显示在状态栏。
<?php
procedure TReadLinkForm.Menu_Read_LinkClick(Sender: TObject);
var
SqlStr: string;
begin
SqlStr := 'SELECT * FROM ' + str_TablePre + 'link ORDER BY `theorder` ASC';
try
DataSource1.DataSet := ClientSettingForm.ZQuery1;
ClientSettingForm.Btn_DBConnect.Click;
ClientSettingForm.ZQuery1.SQL.Text := SqlStr;
ClientSettingForm.ZQuery1.Open;
StatusBar1.Panels[0].Text := '当前状态:查询友情连接成功';
StatusBar1.Panels[1].Text := '当前记录数:' + inttostr(ClientSettingForm.ZQuery1.RecordCount) + ' 条';
except
MessageBox(handle, '查询友情连接失败!', pchar(caption), mb_IconInformation);
StatusBar1.Panels[0].Text := '当前状态:查询友情连接失败';
StatusBar1.Panels[1].Text := '当前记录数:0 条';
end;
end;
?>
修改友情连接,获取当前选定的记录,显示到EditForm的相应Edit中, 并且显示EditForm。
<?php
procedure TReadLinkForm.Menu_Edit_LinkClick(Sender: TObject);
begin
EditLinkForm.Edt_id.Text := DBGrid1.Fields[0].Value;
EditLinkForm.Edt_title.Text := DBGrid1.Fields[1].Value;
EditLinkForm.Edt_url.Text := DBGrid1.Fields[2].Value;
EditLinkForm.Edt_pic.Text := DBGrid1.Fields[3].Value;
EditLinkForm.Edt_theorder.Text := DBGrid1.Fields[4].Value;
EditLinkForm.ShowModal;
end;
?>
删除友情连接,最后一次确认删除, 构造sql, 删除记录,然后从新读取数据库,这里直接调用读取友情连接按钮即可。
<?php
procedure TReadLinkForm.Main_Del_LinkClick(Sender: TObject);
var
SqlStr: string;
strid: string;
begin
if MessageBox(handle, '确定删除该友情连接么?', pchar(caption),MB_YESNO) = IDYES then
begin
strid := DBGrid1.Fields[0].Value;
//删除友情连接
SqlStr := 'DELETE FROM `' + str_TablePre + 'link` WHERE `id`=' + strid;
try
DataSource1.DataSet := ClientSettingForm.ZQuery1;
ClientSettingForm.Btn_DBConnect.Click;
ClientSettingForm.ZQuery1.SQL.Text := SqlStr;
ClientSettingForm.ZQuery1.ExecSQL;
StatusBar1.Panels[0].Text := '当前状态:删除友情连接成功';
except
StatusBar1.Panels[0].Text := '当前状态:删除友情连接失败';
MessageBox(handle, '删除友情连接失败!', pchar(caption), mb_IconInformation);
end;
Menu_Read_Link.Click;
end;
end;
?>
接下是最后一个窗体EditLinkFrom,这个窗体类似AddLinkFrom,如图2-7。

图2-7
主要事件即为修改友情连接,判断标题是否为空,不为空的话则更新改条记录。
<?php
procedure TEditLinkForm.Btn_Edit_LinkClick(Sender: TObject);
var
link_title, link_url, link_pic, link_theorder, link_id: string;
SqlL, SqlR: string;
//可否提交
CanInsert: boolean;
begin
CanInsert := true;
link_url := Edt_url.Text;
link_pic := Edt_pic.Text;
link_theorder := Edt_theorder.Text;
link_id := Edt_id.Text;
//标题
link_title := Edt_title.Text;
link_title := CheckString(link_title, 200);
if (link_title = '') then
begin
CanInsert := false;
MessageBox(handle, '友情连接标题不能为空!', pchar(caption),
mb_IconInformation);
end;
if CanInsert then
begin
//修改投票
SqlL := 'UpDATE `' + str_TablePre + 'link` SET';
//标题
SqlL := SqlL + ' `title`=';
SqlL := SqlL + '''' + link_title + ''',';
//类型
SqlL := SqlL + '`url`=';
SqlL := SqlL + '''' + link_url + ''',';
//类型
SqlL := SqlL + '`pic`=';
SqlL := SqlL + '''' + link_pic + ''',';
//类型
SqlL := SqlL + '`theorder`=';
SqlL := SqlL + '''' + link_theorder + '''';
SqlL := SqlL + ' WHERE `id`=' + link_id;
try
ClientSettingForm.Btn_DBConnect.Click;
ClientSettingForm.ZQuery2.SQL.Text := SqlL + SqlR;
ClientSettingForm.ZQuery2.ExecSQL;
MessageBox(handle, '友情连接修改成功!', pchar(caption),mb_IconInformation);
//重置
Edt_title.Text := '';
Edt_url.Text := '';
Edt_pic.Text := '';
Edt_theorder.Text := '';
except
Log('友情连接修改失败');
MessageBox(handle, '友情连接修改失败!', pchar(caption), mb_IconInformation);
end;
ReadLinkForm.Menu_Read_Link.Click;
end;
end;
?>
这样就完成了所有的操作
最终显示结果抓图:

修改

再次显示主页