建立动态的WML站点

| No Comments | No TrackBacks

  支持WAP功能的移动电话越来越多了。因此,你也应该考虑一下建立自己的WML网站了,本文要介绍的是如何建立PHP/WML页面的站点,使用MySQL数据库,可动态更新站点的内容,具体例子是某个学院的教授授课时间和测验时间表。一点也不复杂哦 :-)
  在开始之前,你应该准备好以下东东:

  1.你已经正确安装好PHP和MySQL,并且有使用两者编程的经验。
  2.你有SQL的相关知识
  3.你运行的是Apache并且可写.haccess文件;或者你运行IIS并且你可以增加映射(或者你可以让系统管理员帮你的忙);
  4.你有WML的相关知识;

  好了,第一步首先让你的服务器知道使用PHP来处理WML文件,以下介绍如何做到这一点。

设置服务器

   如果你使用的是Apache,你必须在你的目录中找到一个.htaccess文件。然后,加入以下行:

    AddType application/x-httpd-php3 .wml

  如果你找不到该文件,可以加入一个,并且加入以上行,放在你的目录中。

  如果你使用的是IIS,你必须做一些改动,与安装PHP时差不多:看一下.php和.php3扩展名的映射,并且为.wml加入同样的映射处理。

  通常你会发现PHP被映射到:

   C:\php\php4isapi.dll

  或者

   C:\php\php.exe

准备工作

  如果你使用的是微软的操作系统,你可以安装NOKIA的开发工具包。它可以检查你的语法,并且让你通过一个类似电话的界面来预览WML页面,该工具包还带有关于WML和WML脚本的参考文档。如果你的电话没有WAP支持,或者你不能使用一个WAP网关,这可以帮上大忙哦。

  要下载这个工具,你首先必须以一个WAP开发者的身份在这个网站登记(http://www.forum.nokia.com/main/0,6668,1_1_4,00.html),要记住的是你需要Java2 Runtime Enviroment的支持(Java2运行环境的支持)。你可以使用任何的文本编辑器来写页面。

  在写任何PHP/WML代码前,你需要建好MySQL的表格。

  该数据库由4个表够成。

  1.professors表包括教授的相关数据;
  2.subjucts表包括主题的相关数据;
  3.exams表包括测验的相关数据;
  4.teach表包括教授和他们所授科目的关系信息


 

  在连接MySQL时,可通过以下的代码建立表格

CREATE TABLE professors (
Id int(11) DEFAULT '0' NOT NULL auto_increment,
Surname varchar(24) NOT NULL,
Name varchar(24) NOT NULL,
Email varchar(48) DEFAULT 'Not avaliable',
Cod_course varchar(16) DEFAULT 'Not avaliable',
Consulting_hour varchar(128) DEFAULT 'Not avaliable',
Consulting_place varchar(128) DEFAULT 'Not avaliable',
PRIMARY KEY (Id)
);

  这些语句建立了professors的表结构。ID为每个教授分配了一个唯一的识别号,而且是表的主键。其它字段,Surname, Name, Email用来表示每个教授的姓、名字和e-mail地址。Cod_course为唯一识别每个科目值。最后Consulting_hour和Consulting_place表示授课时间和授课的地点。


CREATE TABLE subjects (
Subject varchar(96) NOT NULL,
Cod_Subject varchar(24) NOT NULL,
Cod_number varchar(12) NOT NULL,
PRIMARY KEY (Cod_subject )
);

  Subject是科目的名字,Cod_subject是学院采用的代表每个科目的名字,它的值是唯一的,并且是这个表的主键。Cod_number是一个数字的字段,相同科目的不同课程都属于一个组,这个数字就是组的识别号。

CREATE TABLE exams (
Cod_Subject varchar(24) NOT NULL,
Id int(11) NOT NULL,
Date date DEFAULT '0000-00-00',
Time time DEFAULT '00:00:00',
Room varchar(64),
Test varchar(16) DEFAULT 'Oral'
);

  Cod_subject指学院采用的代表每个科目的名字,是唯一的,ID是教授的唯一识别号,Date, Time和Room用来记录测验举行的日期、时间和地点,Test用来表示测验的类型(包括书面、口头等)

CREATE TABLE teach (
Cod_Subject varchar(16) NOT NULL,
Id int(11) DEFAULT '0' NOT NULL,
PRIMARY KEY (Id, Cod_subject )
);

  在teach表中,ID是教授的识别号,Cod_Subject的含义同上,两者构成了该表的主键。

  下一步是在数据库中填入一些数据,这步可以自行完成。

写PHP/WML代码

  现在我们写首个PHP/WML页面,名字为index.wml

<?php

Header("Content-type: text/vnd.wap.wml");
Header("Cache-Control: no-cache, must-revalidate");
Header("Pragma: no-cache");
echo ("<?xml version='1.0'?>");
?>

"http://www.wapforum.org/DTD/wml_1.1.xml" >
<WML>
<CARD id=card1 title=UNITO/Database><P>
You can search for professors' consulting hours or for examinations timetables.
<SELECT name=choice title=Research value="1"> <OPTION selected value=exams_data>Examinations timetables</OPTION> <OPTION value=consulting_data>Consulting hours</OPTION></SELECT>
<DO type="text" label="Go">
<GO href="index2.wml#card2" method="get">
<POSTFIELD value="$(choice)" name="choice">
</GO>
</DO>
</P>
</CARD>
</WML>

  第一行告诉浏览器该文件的MIME类型,如果没有头文件的话,浏览器是不懂得接收的是属于什么类型的内容,而且有了这一行的话,文件的扩展名就不重要了。对于你想写一个多样式的页面,这个功能是十分有用的,你可以通过一个脚本来检测设备或者它的性能,然后根据浏览器的类型返回WML或者HTML。

  检查PHP是否已经装有短标签支持。如果是的话,你可以做一个类似<?xml version='1.0'?>的声明,并且将它嵌套到PHP代码中以免混淆。

  该页面的余下代码只是让你搜索测验的时间或者咨询的时间。选择的项目会记录在$choice变量中。

  下一页称为index2.wml,让你选择是通过科目还是姓来查询数据库。


Header("Content-type: text/vnd.wap.wml");
Header("Cache-Control: no-cache, must-revalidate");
Header("Pragma: no-cache");
echo ("<?xml version='1.0'?>");
?>
"http://www.wapforum.org/DTD/wml_1.1.xml" >
<WML>
<CARD id=card2 title="Kind of research">
<P><BR><?php
echo ("You are checking ");

if ($choice == "exams_data") {
echo (" examinations timetables.<BR>\n");
} else if ($choice == "consulting_data") {
echo (" consulting hours.<BR>\n"); <BR>} else { <BR>echo ("I don't know what and there is some problem.<BR>\n");
}
?>
<P><BR>You can search by surname (either exact or partial) or by subject (either exact or partial).<BR><BR>Select the kind of research. <BR><P>
<SELECT name="<?php echo (" $choice?);<br> ?>" value="surname" title="research"> <OPTION sel

ected value=surname>professor's name</OPTION> <OPTION value=subject>subject</OPTION>

  接着用户必须在下一个文件(index3.wml)中输入。我们要求用户输入科目的名字或者教授的姓。你要留意一下变量在页面之间是怎样传送的。语法看来有点复杂,不过可以让你了解整个过程是怎样通过几个文件来完成的。
<?php
Header("Content-type: text/vnd.wap.wml");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
echo ("<?xml version='1.0'?>;");
>;
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >; <WML>
<CARD id=card3 title=Name>
<?php
echo ("<p>Insert ");
if (${$choice} == "surname") {
echo ("professor's surname (or part of it).\n");
} else if (${$choice} == "subject") {
echo ("the subject (or part of it).\n");
} else {
echo ("Maybe there is some problem.\n");
} echo ("<INPUT name='\"${$choice}\"' type='\"text\"'>");

 

?>
<DO type="text" label="Go">
<GO href="query.wml" method="get">
<?php

echo ("<POSTFIELD value='\"$"."$choice"."\"/' name='\"$choice\"'>");

echo ("<POSTFIELD value='\"$"."${$choice}"."\"/' name='\"${$choice}\"'>");

?>
</GO>
</DO>
<P></P>
</CARD>
</WML>


<DO type="text" label="Go">
<GO href="index3.wml#card3" method="get">
<?php
echo ("<POSTFIELD value='\"$"."$choice"."\"/' name='\"$choice\"'>");
echo ("<POSTFIELD value='\"$choice\"/' name='\"choice\"'>");
?>


</CARD>
</WML>


写查询代码
以下的文件负责处理查询。它的名字是query.wml,我们将更详细地分析它。

<?php

Header("Content-type: text/vnd.wap.wml");
printf("<?xml version=\"1.0\"?>\n");
printf("\n");
printf("\n");


// 以下各行是用来为查询授课时间构造SQL语句的


$consulting_tables =
"(professors left join teach on (professors.Id = teach.Id), subjects)";
$consulting_columns =
"professors.Surname, professors.Name, subjects.Subject , ";
$consulting_columns .=
"subjects.Cod_number, professors.Consulting_hour, professors.Consulting_place";
$consulting_query=
"subjects.Cod_Subject = teach.Cod_subject ";


// 以下各行是用来为查询测验时间构造SQL语句的

$exams_tables= "(exams left join professors ON (exams.Id = professors.Id), subjects)";
$exams_columns= "subjects.Subject , subjects.Cod_number, professors.Surname, ";
$exams_columns.= "professors.Name, exams.Date, exams.Time, exams.Room, exams.Test";
$exams_query= "exams.Cod_Subject = subjects.Cod_Subject ";

// 以下各行是用来为查询测验时间表的sql语句增加查询限制


if ($exams_data) {

switch($exams_data) {
case "subject":
$exams_query.= " and subjects.Subject like '%$subject%'";
break;
case "surname":
$exams_query.= " and professors.Surname like '%$surname%'";
break;
}
}


// 以下各行是用来为查询授课时间的sql语句增加查询限制

if ($consulting_data) {
switch($consulting_data) {
case "subject":
$consulting_query
.= " and subjects.Subject like '%$subject%'";
break;
case "surname":
$consulting_query.= " and professors.Surname like '%$surname%'";
break;
}
}


// 处理与数据库的连接


function connect($tables, $data, $condition_passed) {
//
// put your password and username in next line
//

$db = mysql_pconnect("localhost","***","***");

// put your database name in next line

mysql_select_db("lanfranchi_co_uk",$db);

$sql = "SELECT $data FROM $tables WHERE $condition_passed order by professors.Surname";
$result = mysql_query($sql,$db);
return $result;
}


// 这个函数产生授课时间的wml代码

function consulting_print($consulting_result) {
global $file;
printf("\n");
printf(" <P>Receiving hours

\n");
while ($myrow = mysql_fetch_row($consulting_result)) {
printf(" <P>$myrow[0], $myrow[1]</P>\n");
printf(" <P>$myrow[2]</P>\n");
printf(" <P>$myrow[3]</P>\n");
printf(" <P>$myrow[4]</P>\n");
printf(" <P>$myrow[5]</P>\n");
}
printf("</CARD>\n");
}


// 这个函数产生测验时间表的wml代码

function print_exams($exams_result) {
global $file;
printf("<CARD id='\"card1\"' title='\"hours\"'>\n");
printf(" <P>Examinations hours

\n");
while ($myrow = mysql_fetch_row($exams_result)) {
printf(" <P>$myrow[2], $myrow[3]</P>\n");
printf(" <P>$myrow[0]</P>\n");
printf(" <P>$myrow[1]]</P>\n");
printf(" <P>$myrow[4], $myrow[5]</P>\n");
printf(" <P>$myrow[7]</P>\n");
printf(" <P>$myrow[6]</P>\n");
}
printf("</CARD>\n");
}


// 检查你时候选择授课时间或者测验时间,连接数据库并且调用产生wml代码的函数

if ($consulting_data) {
$connection_result =
connect($consulting_tables, $consulting_columns, $consulting_query);
consulting_print($connection_result);
}
if ($exams_data) {
$connection_result =
connect($exams_tables, $ exams_columns, $ exams_query);
print_exams($connect

ion_result);
}
printf("</WML>\n");

?>

  好,完成了。你已经建立了首个基于MySQL数据库的PHP/WML页面了,自己继续实践一下吧。

No TrackBacks

TrackBack URL: http://www.wujianrong.com/mt-tb.cgi/778

Leave a comment

About this Entry

This page contains a single entry by kevinwu published on June 28, 2006 6:17 PM.

Webalizer 网站流量分析软件快速配置教程 was the previous entry in this blog.

德兰修女语录 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.