這是哇寶國際資訊的一份基本能力測試;很多東西雖然不能說完全沒有概念,不過要詳細回答不免還是要google一下,由此可知我的能力還遠遠不足。當作是自我測試與吸取新知吧,開始解題囉...
(X)HTML篇:
1、請寫出有序清單和無序清單的的 HTML Tag 並簡述其差異。
<ol>為有序清單標記;<ul>為無序清單標記。<li>則用來標示項目。<ol>可以追加type/start參數,分別代表排序類型/開始數字;<ul>則是可以追加type,決定標示項目呈現的方式。<li>可以追加type/value參數,決定標式呈現方式/呈現數字。
以下是呈現結果與HTML語法:
==========<呈現結果>==========
- 有序第一項
- 有序第二項
- 有序第三項
- 無序第一項
- 無序第二項
- 無序第三項
==========<HTML語法>==========
<ol type="1">
<li>有序第一項
<li value="5">有序第二項
<li>有序第三項
</ol>
<ul type="square">
<li>無序第一項
<li type="circle">無序第二項
<li type="disc">無序第三項
</ul>
2、請簡述 HTML 空標籤的特性,並試著列出所有的空標籤。
HTML是一種標式語法,通常是成對出現,如:<b>這是粗體字</b>,有起始標籤<b>與結束標籤</b>。空標籤則是指不需要結束標籤的特別標籤。如:<br>斷行與<hr>格線。
3、請簡述 DOCTYPE 對瀏覽器的影響,並說明目前常用的 DOCTYPE 有哪些。
參考網頁:DOCTYPE使用方法。簡單說就是告訴瀏覽器該以怎樣的模式來解讀HTML;文末作者建議採用 XHTML (Transitional)的方式。老實說我以前不是很在意他...看來以後要多注意一點,符合標準。
4、如何在瀏覽器中顯示小於 (<) 或大於 (>) ?如果連結網址中有 & 符號時,應該在 HTML 原始碼中用什麼代替?
「>」:<
「<」:>
「&」:&
5、請找出以下範例中不符合 XHTML 規範的地方:
<!DOCTYPE html PUBLIC "-/W3C//DTD XHTML 1.0 Transtitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>測試範例</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="check.js"></script>
</head>
<body>
<form action="">
<table border="1">
<tr>
<td>
<label for="account">帳號</label>
</td>
<td>
<input type="text" name="account" id="account" />
</td>
</tr>
<tr>
<td>
<label for="passwd">密碼</label>
</td>
<td>
<input type="password" name="passwd" id="passwd" />
</td>
</tr>
<tr>
<td>
<label><input type="checkbox" name="keepLogin" value="1" />保持登入</label>
</td>
<td>
<input type="submit" value="登入" onclick="checkForm();" />
</td>
</tr>
</table>
</form>
</body>
</html>
其實我有作弊...(自首)只能說有W3C真好。
6、同上題,如果在 IE 上瀏覽該頁面時發生亂碼,你會如何解決?假設伺服端送出的標頭及頁面編碼都是正確的。
如果伺服端送出的標頭與頁面編碼都是正確的,那就有可能是HTML撰寫時的原始碼沒有存成對應的編碼。例如現在網頁編輯幾乎都使用UTF8編碼,但如果在HTML撰寫時仍使用ANCI碼儲存,就會發生亂碼。所以在撰寫HTML時,最好是將文件存成與伺服端標頭相同的編碼型態。
7、何謂 HTML 的語意?如果要在頁面上用一個標籤來表示文章標題,你認為用 <h1></h1> 比較好還是 <p class="articleTitle"></p> 比較好?
HTML:HyperText Markup Language,超文件標示語言。有許多前輩們似乎都比較喜歡用CSS,畢竟比起HTML,CSS的規範比較嚴謹,可以表現的變化也比較多;最重要的是它能夠獨立於HTML。網頁設計起來也就能程式歸程式,設計歸設計囉。
JavaScript篇:
1、請找出這段 JavaScript 的錯誤,並寫出正確可執行的版本。
function checkForm() {
if (document.forms[0].account.value == '') {
alert('請輸入帳號');
return false;
}
if (document.forms[0].passwd.value == '') {
alert('請輸入密碼');
return false;
}
return true;
}
不知道為什麼,this.form抓不到表單內容,所以改用document.forms[0]來處理;另外if條件判斷是採用比較的方式,所以「=」要改為「==」。
2、請找出 HTML 範例中的 JavaScript 邏輯錯誤。
HTML範例中,JS的表單判斷是寫在「登入」按鈕上,如此一來即使JS判斷為false,表單資料卻還是傳送出去了。所以應該刪除onclick="checkForm();",改寫HTML的<form>,利用onSubmit去判斷JS的表單驗證。:
<form action="" onsubmit="return checkForm();">
3、請試著改寫 check.js ,在帳號或密碼未填寫任何資料並出現警告時,同時將輸入焦點置於錯誤的欄位上。
function checkForm() {
if (document.forms[0].account.value == '') {
alert('請輸入帳號');
document.forms[0].account.focus();
return false;
}
if (document.forms[0].passwd.value == '') {
alert('請輸入密碼');
document.forms[0].passwd.focus();
return false;
}
return true;
}
4、上面的例子中利用 JavaScript 驗證後的資料,是否還需要用 PHP 或其他伺服端技術驗證?為什麼?
最安全的方法,當然是客戶端與伺服端都作驗證。曾經在網路上看過一句話:「永遠不要相信使用者輸入的資料!」單作JS的表單驗證其實是不夠的,拿表單傳值的GET來說,直接載網址列輸入資料就可以避開JS的驗證了。JS的驗證是為了減輕伺服的負擔,同時減少錯誤反應的時間。如果每筆資料的輸入都單靠伺服端的驗證,伺服器的負擔與使用者等待的時間就會成為問題。
5、請試著不要使用 onxxxx 事件,改用 window.onload 來繫結表單驗證的功能。
能力不足。
6、請說明 window.onload 可能潛藏的問題,並說明有什麼可以解決的方式 (不可使用第三方套件)。
能力不足。
PHP篇:
1、請說明 PHP 字串採用單引號和雙引號的差別。
單引號內如果有變數$var,不會被解讀;雙引號內如果有變數$var,則可以被解讀。
<?php
$var = 'World!';
echo 'Hello'.$var; //印出「HelloWorld!」
echo "Hello $var"; //印出「Hello World!」
echo 'Hello $var'; //印出「'Hello $var」
?>
2、請說明如何接收網址參數。例如 http://localhost/index.php?abc=123 中的 abc 。
此網址使用GET傳遞參數,所以使用$_GET['abc']就可以接收。
3、請說明如何接收上面 HTML 範例的表單內容。
一般<form>如果沒有指定傳遞參數的方式,預設為GET;所以帳號與密碼分別是以$_GET['account']與$_GET['passwd']接收。
4、請說明 magic_quotes_gpc 對 PHP 程式的影響。
這個設定主要是解決SQL injection的問題。當magic_quotes_gpc=On時,使用者輸入的資料中若包含敏感的字元,如「'」時,它會自動將提交的表單內容加上「\」。這是一種防範使用者輸入惡意代碼設定,如果完全不處理使用這輸入的資料,使用者就有可能利用SQL語法看到本來它不應該看到的資料,甚至刪除table內的資料。如果magic_quotes_gpc=Off,我自己在處理SQL injection問題時是使用mysql_real_escape_string()函數,去防範敏感的字元。
5、如何避免使用者直接輸入 HTML 或是 JavaScript ?假設客戶要求一定要讓使用者輸入 HTML ,你該如何處理?
PHP有htmlspecialchars()與htmlentities()函數,能將「&」、「"」、「<」、「>」轉成HTML字串格式。如:
& = &
" = "
< = <
> = >
經過函數的轉換,當使用者的輸入中有<IFRAME>、<SCRIPT>這些HTML標籤時,就能避免被瀏覽器當成網頁內容而執行。
然而如果客戶要求,當然就必須另寫函數去處理,擋掉可能會被用來當作惡意攻擊的HTML標籤;google剛好找到一篇國外的文章:PHP XSS (cross site scripting) filter function。非常實用,利用此函數就能防止XSS的發生。
6、請說明 Session 的基本運作方式以及相關注意事項,並利用 PHP 的 Session 功能來完成上面的登入功能。帳號及密碼列表如下:
帳號 | 密碼 |
---|---|
abc | 123!@# |
def | 456L:' |
能力不足。
7、請說明 Cookie 的基本運作方式以及相關注意事項,並利用 PHP 的 Cookie 功能來完成上面的保持登入功能。
能力不足。
8、請簡單設計一個 PHP 類別,讓以下程式能夠運作: (提示:要使用 SPL)
能力不足。
9、請修改你剛剛所建立的類別,讓 addValue 函式在參數不為數字時,能丟出一個異常。然後在上面程式中加入 try...catch 敘述,使得 Test 物件在加入非數字資料時,還能繼續運作並顯示錯誤。
能力不足。
10、為剛剛的類別加入註解 ,以便能夠以 PHPDoc 來產生 API 文件。
能力不足。
MySQL篇:
1、何謂 Schema ?
應該就是指資料庫的意思...
2、請建立一個名為 guestbook 的資料庫,並建立一個名為 messages 的資料表。其中 messages 資料表要包含自動編號 (id) 、標題 (title) 、內容 (content) 、作者 (author) 及建立日期 (createDateTime) 等欄位,欄位型態請以符合效率及易維護性為考量來設計。
建立資料庫:
CREATE DATABASE guestbook;
建立資料表:
CREATE TABLE messages (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
tite VARCHAR( 50 ) NULL ,
content TEXT NULL ,
author VARCHAR( 30 ) NULL ,
createDateTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE = MYISAM ;
3、請試著用 MySQL 的命令列模式,來操作對 messages 資料表的新增、列表、修改及刪除等功能。
登入MySQL:
mysql -u*** -p***
使用資料庫:
use guestbook;
新增:
INSERT INTO messages (tite, content, author)
VALUES ('test', 'test_content', 'test_author');
列表:
select * from messages;
修改:
UPDATE messages SET tite = 'update', content = 'update_content', author = 'update_author'
WHERE id = 1 ;
刪除:
DELETE FROM messages WHERE id = 1;
4、請試著用 MySQL 的命令列模式匯出 guestbook 資料庫的結構與資料,並刪除 guestbook 資料庫。然後再利用匯出的備份檔案,來重建 guestbook 資料庫。
匯出資料:(剛好前一陣子有試著利用排程,定期備份資料庫)
C:\>mysqldump --opt -u*** -p*** guestbook >C:\%date:~0,4%-%date:~5,2%-%date:~8,2%.sql
如此一來就會存成一個yyyy-mm-dd.sql的文字檔
刪除資料庫:
DROP DATABASE guestbook;
重建資料庫:
C:\>mysqladmin -u*** -p*** create guestbook
C:\>mysql -u*** -p*** guestbook < yyyy-mm-dd.sql
5、在 MySQL 4.1 以後,如果已存的資料其編碼為 UTF-8 ,那麼 Client 端在取出資料前,要先下何種指令來指定正確的編碼?
如果網頁是以UTF8的方式儲存,在進入資料庫以後要下:mysql_query("SET NAMES UTF8");
如果網頁是以big5的方式儲存,在進入資料庫以後要下:mysql_query("SET NAMES big5");
留言列表