簡單的成績錄入系統製作與小問題
1,首頁是每個人的登入頁面,需要通過正則表示式驗證輸入是否為空,需要將使用者名稱和資料庫中的密碼進行對比,否則無法進入自己的介面;
2,點選首頁中的新增記錄,跳轉第二個頁面,選擇第n次成績,錄入分數,則往資料庫新增某同學的成績,最後提交,系統詢問:無法更改請確認無誤,提交之後資料庫新增記錄,第n次成績錄入完畢;
------------------------------------開始工程---------------------------------------------------------
1,同一個表單存在兩個submit,如何使得點選不同的按鈕進入不同的頁面?<form action="a.html">肯定不行;
所以: <form name="f">
<button onclick="javascript:document.f.action=' a.html ';document.f.submit()">錄入成績</button>
<button onclick="javascript:document.f.action=' b.html ';document.f.submit()">查詢我的</button>
2,如何使得背景圖片充滿整個螢幕,且不重複,放大縮小時不會變化:
.body{
position:fixed;
top:0;
left:0;
background:url( ) no-repeat ;
background-size:cover;
}
3,要麼直接禁止網頁縮放:
移動端:
<meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" id="viewport" name="viewport">
網頁端:
<script>
var zoom=function(e){
var e = e || window.event;
if(e.wheelDelta && event.ctrlKey){
event.returnValue = false
}else if(e.detail){
event.returnValue = false;
}
}
if(document.addEventListener){
document.addEventListener('DOMMouseScroll' , zoom , false);
}
window.onmousewheel = document.onmousewheel = zoom;
</script>
3,首先對於input判斷:
判斷xuehao欄,密碼欄是否為空;判斷密碼欄和確認密碼欄值是否相同
用js就行:
if(value){
return ture;
}else {return false;} //只有return ture 才能把資料提交到資料庫;
4,開始註冊,首先判斷是否註冊過這個學號:
從php獲得input的值:
<input name="xuehao">
$xuehao1=$_get['xuehao'];
連線資料庫:
$aa=mysqli_connect('locahost', 'root', '123456', 'web001');
設定查詢語句(將input中的值拿來在資料庫中做查詢):
$sql1="select xuehao from zhuce where xuehao='$xuehao1' ";
$result=mysqli_query($aa,$sql1);
$len=mysqli_num_rows($result); //返回結果集中的行數;
判斷返回的長度是否>0,若大於0則說明資料庫中已經註冊過這個學號了
if($len>0){
echo 'this have been already registered!';
exit; //退出php,不再執行下面的錄入資料庫程式;
}
4,其中有一個問題:當輸入使用者名稱為數字時能夠正常判斷,但是使用者名稱若為字母,則每次顯示都是已經註冊過!
5,若未曾被註冊過,則將資料錄入系統:
$bb="insert zhuce values('$xuehao','$password')";
mysqli_query($aa,$bb);
6,但是要解決一個問題:就是如果學號已經被註冊過,如何在本頁面提示,而不跳轉,如果把php寫在本頁是不行的,因為本來html下寫php已經是巢狀,如果再在php中呼叫script會報錯;只能在外部引用php驗證註冊。那麼就讓頁面跳轉以後自己跳回來,
將action仍然指向php,在php中新增語句:echo '<script>window.onload=function(){ history.back() }</script>' 頁面就會自動跳轉回來了;同理得,如果註冊成功,返回兩頁:history.go(-2); 注意是go是back,back只能返回一頁;
7,下面是登入驗證:
這個驗證和註冊的時候一樣:
獲得輸入的xuehao值:
$xuehao=$_get['xuehao1'];
$password=$_get['password1']
連線資料庫,查詢學號為$xuehao那行的值,並query得到result;
$all=mysqli_fetch_assoc($result); //保留獲得的值;
$it=$all['password']; //選擇那行中的password值
if($it==$password){ }; //判斷從資料庫獲得的密碼和input的是否一樣;
7,但是問題又來了,作為button=錄入 ,它既要求點選驗證密碼是否正確,又要點選後進入錄入成績系統頁面,兩個action如何分配?首先,在submit中用js實現onclick判斷使用者名稱是否為空,若為空return false;
不為空則執行:document.f.action='first.php';document.f.submit();即跳轉到檢驗使用者名稱和密碼是否一致的php頁面;在php頁面如果一致則插入js程式碼跳轉到目標html:echo '<script> window.onload.href="dynamic.html"</script>';
如果不一致返回到登入頁面:history.back();
7,還要問題:驗證密碼的時候,如果你註冊過學號,資料庫裡面有你的使用者名稱和密碼,所以進行密碼比較的時候,因為能通過select * from tb2 where xuehao="$xuehao"得到你的原始密碼,所以可以將資料庫中的密碼與你輸入的進行比較;問題是:我沒有註冊過,所以資料庫中沒有我的使用者名稱和密碼,當我隨便輸入一個使用者名稱,不輸入密碼時,因為從資料庫檢索出來的結果也是空,所以兩者相同;所以不要忘記驗證使用者名稱是否在資料庫中存在。如何驗證一個數據在資料庫中是否存在:
$sql="select * from tb2 where xuehao='$xuehao'";
$result=mysqli_query($aa,$sql);
$all=mysqli_fetch_assoc($result);
$is=all['xuehao"];
if(!$is){ echo '<script>alert("請先註冊!");history.back();</script>';}
8,已經完成登入註冊密碼查錯,下面開始成績錄入與查詢:
成績輸入完畢,點選提交submit,資料傳入資料庫;
$users=$_GET['users'];
$math=$_GET['math'];
$chinese=$_GET['chinese'];
$pass=$_GET['password'];
$path=$_GET['path'];
$aa=mysqli_connect('localhost','root','654321','web002');
$bb="insert tb2 values('$users','$pass','$math','$chinese','$path')";
mysqli_query($aa,$bb);
然後錄入完畢以後,設定一個選項用於查詢所有的成績並顯示在 表格中:
利用:
<?php
$va=mysqli_connect('127.0.0.1','root','654321','web002');
$vb="SELECT * FROM tb2";
$result=mysqli_query($va,$vb); //引入資料庫資料;
echo '<table><tr><th>姓名</th><th>學號</th><th>第N次作業</th><th>成績</th><th>閱卷者</th><tr>'; //html程式碼輸出表格形式
while($row = mysqli_fetch_assoc($result)){
echo '<tr><td>'.$row['name'].'</td></tr>';
} //開始迴圈表格輸出值;
echo '</table>'; //一定放在迴圈體之外;
?>
9,基本完畢,發現input具有記憶功能很麻煩,用autocomplete="off",放在每個表單form中可以把整個表單的記憶功能都取消掉,因為autocomplete是瀏覽器的內建控制元件,所以沒法用css或者js修改;
10,在登入完畢,跳轉到輸入成績頁面時候,如果學生錄入別人成績的時候,如果沒有一套體制制約,錄入別人的成績的時候就可以非常隨意,所以如果在成績錄入頁面直接獲取到登入頁面的使用者名稱,那就可以知道是誰改的了,所以問題來了,登入頁面是dynamic_first.html,提交表單的時候,action值指向first.php驗證密碼是否正確,然後first.php輸出js,window.location.href指向錄入頁面dynamic.html,所以如何在兩個html頁面傳輸值呢?
方案一:首先我想,因為first.php頁面有一個變數:$xuehao=$_get['xuehao1']剛好是我需要的變數,可不可以使用
echo '<script>window.location.href="dynamic.html?"+$xuehao;</script>' ;
然後在dynamic.html頁面:
<script>
var xuehao=window.location.search;
</script>來獲取值呢?
但是報錯,因為php中嵌套了js,js不能呼叫php中的$xuehao變數,所以href那句話格式錯誤!方案一不可以!
方案二:
既然php不可以傳值給html,那我用dynamic_first.html和dynamic.html之間傳值,
<script>
var m=$("input:eq(3)").val();
window.location.href="dynamic.html?"+m;
</script>
但是很要命的是,我忽略了php是要跳轉到dynamic.html頁面的,php中也有一句話:
echo '<script>window.location.href="dynamic.html";</script>';
這就很,因為html還要跳轉到php,所以php後執行,dynamic.html中的搜尋傳遞值的語句將會是空值;
方案二涼了;
方案三:
利用cookie:讓cookie記錄使用者名稱,由於這幾個頁面用的是同一個域,所以cookie是同一個值,可以每次登入的時候都更新cookie,然後在dynamic.html頁面呼叫cookie!
在dynamic_first.html頁面js程式碼:
var m=$("input:eq(3)").val();
document.cookie="name="+m;
在dynamic.html頁面js程式碼:
var n=document.cookie.substring(5,6);
$("input[name='you']").val(n);
html:設定為不可更改
<input type="text" name="you" disabled>
但是 name='you'的value值卻不能傳到資料庫,原來是屬性為disabled的,它的值不能被傳遞,把disabled改成readonly就行了;
11,在輸入框輸入漢字,傳輸到資料庫以後顯示亂碼:不要慌,修改資料型別為utf8:
alter table from "表名" change "列名" "列名" varchar(45) character set utf8 ;
12,資料中的漢字提取到網頁上顯示???:
我查詢了一天的百度,告訴我在php頭部加header("Content:text/html; charset="utf-8"”),告訴我把資料表,資料庫的編碼方式都改為utf8,包括修改配置檔案my.ini, db.opt都沒有用,後來請教學長幫我看php程式碼,大佬幫我改好了:
原始碼順序問題:
$bb="SELECT * FROM tb2";
$result=mysqli_query($aa,$bb);
$cc="SET NAMES UTF8";
mysqli_query($aa,$cc);
$dd="set character_set_client=utf8";
$ee="set character_set_results=utf8";
後來大佬給我調了以下順序ok了:
$cc="SET NAMES UTF8";
mysqli_query($aa,$cc);
$dd="set character_set_client=utf8";
$ee="set character_set_results=utf8";
$bb="SELECT * FROM tb2";
$result=mysqli_query($aa,$bb);
我他媽!!
13,然後開始開啟正則表示式驗證學號的格式:
var reg=/^16221070(32|31|42|41)(0[1-9]|[1-3][0-9])$/;
var m=$("input").val();
if(!reg.test(m)){
alert("學號格式不正確");
}
其中,test()函式返回匹配結果的布林值;
/^ $/中的為正則表示式內容的開頭結尾;
16221070表示必須匹配:
32|31|42|41表示可以選擇32,31,42,41;
【1-9】表示可以用1-9;
後來進行驗證的時候發現,匹配這個格式的學號總是寫不進資料庫,後來發現是因為定義學號這個變的長度是int(10),最多隻能有10位小數;後來改成int(20)還是不行,應該是int最大隻有10,所以改成了bigint(20),然後解決了;
14,頁面佈局問題:
手機上的畫素值和電腦上的不一樣,最好利用媒體查詢分別寫前端頁面;
15,遮蔽程式碼:
有四種檢視原始碼的方式:
1,右擊
2,F12
3,ctrl+u
4,ctrl+shift+i;
window.onload=function(){
document.onkeydown=function(){
var e=window.event||arguments[0];
if(e.keyCode==123){
alert("小樣你想幹嘛?");
return false;
}else if((e.ctrlKey)&&(e.shiftKey)&&(e.keyCode==73)){
alert("還是不給你看。。");
return false;
}else if((e.ctrlKey)&&(e.keyCode==85)){//追加
return false;
}
};
document.oncontextmenu=function(){
alert("小樣不給你看");
return false;
}
}
16,提交表單的時候,
<input type="button" name="name1">
$_get[ "name1" ]
無法獲取到值,因為input的型別是button無法通過get, post獲取值,get與post只能
獲取type為text,password, file, submit等型別;
<!-- 模板檔案,利用HTML程式碼展示資料 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>比賽列表</title>
</head>
<body>
<table>
<tr>
<th>ZX_id</th><th>ZX_name</th><th>ZX_fenlei</th><th>ZX_zuozhe</th><th>更新時間</th><th>瀏覽次數</th><th>釋出狀態</th>
</tr>
<?php foreach($shujuku->result as $row) : ?>
<tr>
<td><?php echo $row[0];?></td>
<td><?php echo $row[1];?></td>
<td><?php echo $row[2];?></td>
<td><?php echo $row[3];?></td>
<td><?php echo $row[4];?></td>
<td><?php echo $row[5];?></td>
<td><?php echo $row[6];?></td>
</tr>
<?php endForeach;?>
</table>
</body>
</html>