摘要:用php製作動態web頁面時,在提交伺服器之前,讓php根據使用者在當前頁面上錄入的某欄位的值立即從資料庫中取出相關的其它欄位的值並顯示到當前頁面上,是php程式開發中的痛點。本文以一個具體執行個體詳細介紹了怎樣將兩個html內嵌式語言php和javascript巧妙結合起來,解決這個痛點的具體方法。
關鍵詞:php、動態、html。
現在的網站已經從以前提供靜態資訊的形式發展到互動提供動態資訊業務的方式。web的資訊服務形式可以概括為兩點:向客戶提供資訊;記錄客戶提交的資訊。要提供這兩種服務,需解決的問題是:如何快速地讓使用者在自己網站大量的資訊中快速提取他想要的資訊,如何有效地記錄使用者提交的資訊,以便於將來使用者尋找。這些問題都可以通過在網站中加入資料庫支援來解決。
因php對多種資料庫都能提供良好的支援,且php的指令碼直接嵌入在html文檔中,使用非常方便。因此php是現在internet上最流行的一種server端嵌入語言之一。另外,與其它的server端指令碼語言如asp相比,php免費開放源碼並且提供跨平台的支援,這使它能夠輕易適應當今網路中各種異質的網路環境;可讓網頁製作人員能夠非常快捷、方便地製作出功能強大的動態web頁面。但是,由於php是伺服器端嵌入,更直觀的理解是php語句是在伺服器上執行,所以它只有提交時才將當前頁面上的內容接收和處理。而當你需要的內容是根據客戶當前頁面上錄入的某欄位的值,再動態到庫中提取時,php就無能為力了。例如:要向客戶提供一個“訂貨合約”的錄入頁面,其中包含一些“供貨商資訊”的錄入,而各供貨商的詳細資料事先已在一個“商家”字典表中錄入,現在要求當客戶在當前頁面上選中某“供貨商”時,立時從“商家”字典表中將該供貨商的某些資訊如“開戶行、帳號、地址、電話”等提取出來顯示到當前頁面上供客戶直接使用或修改使用。這樣的要求若用可視化程式設計語言如pb、vb等實現是一件輕而易舉事,但pb、vb不適合編寫動態web頁面;php適合編寫動態web頁面,但由於是伺服器端嵌入,不能及時獲得提交前頁面上的變數值,所以實現上述要求就有一定的難度。在程式編寫過程中,我將php與javascript巧妙結合起來,解決了這個痛點。
我們知道,同樣是嵌入語句,但是javascript 又不同於php語言。因為php是伺服器端嵌入,而javascript是用戶端嵌入,既javascript語句是在客戶的瀏覽器上執行,這就決定了javascript可及時獲得當前頁面上的變數值,但又無法對伺服器端的資料庫直接操作。所以,將二者結合起來製作出功能強大的動態web頁面,可謂是珠聯璧合。為了敘述方便,下面只以從字典表中取出選中供貨商的地址為例,說明具體做法。當需要取出多個欄位時,方法類似,但利用javascript函數從字串中逐個取出時,要細心一些。
1.編寫一個php函數
此函數的功能是將所有合格“供貨商資訊”從“商家”字典表中取出,並存放到一個字串變數$khsz中。
function khqk_tq($questr){
global $dbconn;
$dbq_resl=sybase_query($questr,$dbconn); //送出一個query字串供sybase執行。
$dbq_rows=sybase_num_rows($dbq_resl); //獲得返回行的數目。
$j=0;
for ($i=0;$i<$dbq_rows;$i++){ //建迴圈,將每行中所需欄位取出,並放到數組$k[]中。
$k[]=sybase_result($dbq_resl,$i,"kh_id"); //取出使用者選擇的供貨商編號。
$add=sybase_result($dbq_resl,$i,"address"); //取出該供貨商地址。
if ($add==""):
$k[]="無";
else :
$k[]=sybase_result($dbq_resl,$i,"address");
endif;
$khsz=$khsz.$k[$j]."|".$k[$j+1]."|"; //將各欄位值以”|”為分隔字元,串連到變數$khsz 中,形成一個長字串。
$j=$j+2;
}
return $khsz;
}
2.編寫一個javascript函數
該函數的功能是從字串中根據kh_id值找到該供貨商的地址,嵌入到html檔案中。
<script language="javascript">
var khstr="<?=$k?>" //先將php變數轉變成javascript變數khstr。
function khxz_onclick(){
frm=document.frmplanfill;
ghstj=frm.kh_id.value; //獲得當前頁面上剛剛選中的“供貨商”的kh_id值。
numkh=khstr.indexof(ghstj,0) ; //從khstr串中找到該kh_id值所在的位置。
addr=khstr.substring(khstr.indexof("|",numkh)+1,khstr.indexof("|",khstr.indexof("|",numkh)+1)); //從 khstr串中取出與kh_id對應的地址欄位的值。
frm.address.value=addr; //將取出的值賦給當前錄入頁面上的欄位變數address。
}
</script>
3.在html中將二者結合起來,互為所用
$khinfo="select kh_id,address from kh where co_id=$s_coid and type='g' order by kh_id";
//將取供貨商資訊的sql語句放到變數$khinfo中。
$k=khqk_tq($khinfo); //調用php函數,並將返回的字串值放到變數$k中。
<meta name="generator" content="microsoft developer studio">
<meta http-equiv="content-type" content="text/html; charset=gb_2312-80">
<title>訂貨合約管理</title>
</head>
<body style="background-color: ivory">
<form name=frmplanfill method=post action="dhht_crt.php">
<table align=center border=1 cellpadding=0 cellspacing=0 width="90%" style="font-size: 10pt">
<tr>
<td>合約編號</td><td><input name=htbh size=15></td>
<td>合約概述</td><td colspan=5><input name=htgs size=53></td>
</tr>
<tr>
<td>供貨廠商</td>
<td><select name="kh_id" onchange="khxz_onclick()"> //當每次改變所選供貨商時,觸發上述javascript函數。
<?prt_sele("select convert(int,kh_id),name from kh where co_id=$s_coid and type='g'",0,1)?></select></td> //將合格所有供貨商名稱放到下拉式清單方塊中供使用者選擇。其中prt_sele是自訂的 php函數。
<td>地 址</td>
<td colspan=3><input type=text name=address size=34 ></td> //觸發javascript函數的結果是使得adrress變數獲得值並顯示到頁面上。
以上代碼的系統內容是:linux作業系統、sybase資料庫、web server為apache、php4程式介面。以上將php和javascript相結合的程式開發思想已成功地運用到我們開發的多個動態web頁面中。