孫路強,劉 磊,栗連弟,卞真付,柳艷麗,朱 宏
(天津市地震局,天津 300201)
·技術交流·
基于PHP的天津市地震局地震事件共享系統的設計與實現
孫路強,劉磊,栗連弟,卞真付,柳艷麗,朱宏
(天津市地震局,天津300201)
摘要:利用PHP語言和MySql數據庫設計系統,設計天津市地震局地震事件共享系統。該系統具有地震事件的上傳、下載、查詢、繪制地震震中分布圖等功能,實現規范地震事件格式,改變數據存儲方法,便于局內科研人員通過瀏覽器方式對測震歷史數據進行檢索與下載,進一步提高共享信息的利用率。
關鍵詞:PHP語言;MySql數據庫;共享系統;測震歷史數據
0引言
隨著信息時代的不斷發展,不同部門、不同地區間的信息交流逐步增加,計算機網絡技術的發展為信息傳輸提供了保障。當大量的空間數據出現在網絡上,面對多種多樣的數據格式,如何運用是網絡數據共享與數據轉換的問題。實現數據共享可以使更多的人更充分地使用已有數據資源,減少資料收集、查詢、保管等工作,提高技術人員使用數據、分析數據的工作效率。天津市地震局地震事件共享系統利用PHP服務器端HTML嵌入式腳本描述語言,實現歷史地震事件的網絡共享,用戶可上傳、下載、查詢天津測震臺網歷史事件,分享上傳數據,分析產出結果。
1系統設計技術思路
對以光盤形式存儲的歷史事件文件運行整理,并對文件名按照程序上傳要求進行批處理修改,將修改后的事件文件統一存儲至服務器端目錄下。不斷產生的新數據和地震目錄可以通過系統提供的事件及目錄上傳功能完成事件和目錄的追加。平臺采用B/S結構(Browser/Server),在系統設計方面采用Smarty架構,使用PHP技術進行動態頁面的設計。PHP是一種服務器端、跨平臺、HTML嵌入式的腳本語言,是一種被廣泛應用的開源式的多用途腳本語言[1],尤其適合Web開發。服務器啟動后,用戶可以不使用客戶端軟件,只使用瀏覽器即可訪問,既保持圖形化用戶界面,又大大減少應用的維護量。利用此方法能夠將應用程序分成兩部分實現:視圖和邏輯控制,目的就是將用戶界面與PHP code分離,這樣,在修改程序時不會影響到頁面設計,而美工在重新設計或修改頁面時也不會影響到程序邏輯。
系統后臺數據庫選用MySQL數據庫,MySQL數據庫是目前運行速度最快的SQL語言數據庫,具有支持跨平臺、安全性高、存儲容量大等特點。天津市地震局“十五”測震系統軟件均采用該種數據庫,因此,研究選用MySQL數據庫作為后臺數據庫將有利于與現有數據庫數據進行交換。該系統地震事件目錄、文件存儲信息、用戶信息以及成果問題內容均存儲在MySQL數據庫中。
2系統設計
根據局內科研人員的要求,結合現有測震臺網地震事件的保存情況,研究設計的地震事件共享系統主要實現以下功能模塊:用戶權限管理、事件檢索、地震目錄事件上傳下載、成果展示反饋、震中分布圖自動繪制等功能,天津市地震局地震事件共享系統業務流程如第33頁圖1所示。
為達到在系統網站中方便管理地震事件及目錄的目的,可在用戶權限上進行設置。如果以管理員身份登錄,則可正常使用事件上傳功能;如果是普通用戶登錄,則不能使用事件上傳功能,其余模塊均能正常使用。該功能通過SESSION控制用戶訪問權限,初始化SESSION變量,通過$_POST[]方法獲取表單提交的用戶名和密碼[2],完成對用戶名和密碼的驗證。如果正確,則將用戶名和密碼賦值給SESSION變量,并通過JavaScript腳本跳轉到相應權限用戶的初始界面,其代碼如下:

圖1 事件共享系統業務流程Fig.1 Operation flow of event sharing system
session_start();
$A_name=$_POST[name];//接收表單提交的用戶名
$A_pwd=$_POST[pwd];//接收表單提交的密碼
………//省略部分代碼
function checkinput(){
include("conn/conn.php");//連接數據源
$sql=mysql_query("select * from tb_user where name='".$this->name."' and pwd='".
$this->pwd."'",$conn);
$info=mysql_fetch_array($sql);//檢索管理員名稱和密碼是否正確
if($info==false){//如果管理員名稱或密碼不正確,則彈出相關提示信息
echo "";
exit;
}
else{
if($this->name=="root" && $this->pwd=="rootme"){
echo "";
$_SESSION[admin_name]=$info[name];
$_SESSION[pwd]=$info[pwd];
}else{
echo "";
$_SESSION[admin_name]=$info[name];
$_SESSION[pwd]=$info[pwd];
}
在地震事件共享系統提供的事件查詢功能中,用戶可通過輸入要查詢事件的起始與終止時間來查詢地震目錄信息,包括發震時間、經緯度、深度、震級、地名等信息,查詢功能界面如圖2所示。

圖2 地震事件共享系統查詢界面Fig.2 Query interface of seismic event sharing system
對指定時間范圍內的數據進行查詢,可通過關鍵字between…and…實現,利用正則表達式對日期進行校正。正則式作為一種描述字符串結構模式的表達式,可用于驗證用戶輸入的數據和檢索大量文本,實現代碼如下:
if($_POST[sub]){
if($_POST[text1] == "" || $_POST[text1] == "輸入開始日期" || $_POST[text] == "" || $_POST[text] == "輸入結束日期"){
echo "";
}else{
if(preg_match("/([0-9]{3}[1-9][0-9]{2}[1-9][0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[0-2])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))/",$_POST[text])){
$conn = mysql_connect("localhost","root","rootme") or die("connect mysql false");
mysql_select_db("db_earthevt",$conn) or die("connect database false");
mysql_query("set names gb2312");
$rss = mysql_query("select * from tb_evt where evtdate between '$_POST[text1]' and '$_POST[text]' order by evtdate");
if (!$rss) echo "SQL錯誤:".mysql_error();
while($rst = mysql_fetch_array($rss)){
?>
管理員用戶通過事件上傳模塊,可將地震事件對應的地震目錄和文件名上傳至數據庫表tb_evt中,并將事件文件上傳至服務器端指定目錄下。根據系統設置統一了的文件命名,同時通過tb_evt表中的filename列,將地震目錄與服務器端下的事件文件進行匹配。事件文件上傳界面如圖3所示。

圖3 地震事件、目錄上傳界面Fig.3 Uploading interface of seismic event and earthquake catalogue
在PHP中,應用move_uploaded_file()函數實現將文件上傳到指定文件夾。在執行文件上傳之前,為防止潛在的攻擊對原本不能通過腳本交互的文件進行非法管理,可應用is_uploaded_file()函數判斷指定文件是否通過HTTP POST上傳,實現該功能的核心代碼如下: