מדריך לבניית סקר

‏ • 10 באוגוסט, 2002



מאמר זה מלמד את עקרונות בניית סקר.
זה אינו סקר מוכן של העתק+הדבק, וכדי להבין אותו דרוש ידע בסיסי ב-ASP ועבודה עם בסיסי נתונים.
יש הרבה אפשרויות להרחבת הסקר, הצגה בצורה גרפית, מניעת הצבעה חוזר וכו'. המאמר בא להדגיש את בניית הסקר הבסיסית, ללא ההרחבות.

בניית מסד הנתונים

מסד הנתונים יהיה מורכב משתי טבלאות: טבלת שאלות, וטבלת תשובות.

טבלת השאלות – pl_Question

  • ID – מספר מזהה של השאלה, מסוג מספור אוטומטי
  • Question – השאלה עצמה
  • Status – מספר המציין את סטטוס השאלה:
    • 0 סקר שעדיין לא עלה
    • 1 הסקר שנמצא כרגע באוויר (לא יכול להיות מצב בו שני סקרים נמצאים בסטטוס זה בו זמנית)
    • 2 סקר ישן

טבלת התשובות – pl_Answer

  • ID – מספר מזהה, מסוג מספור אוטומטי
  • Answer – התשובה
  • Que_ID – מספר השאלה אליה שייכת התשובה
  • Total_Hits – מספר ההצבעות לתשובה זו.

הוספת סקר חדש

נבנה טופס הנראה כך:

שאלה
תשובה 1
תשובה 2
תשובה 3
תשובה 4
פרסם סקר

והקוד:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28  

<form method=post action="PostPoll.asp">
<table align="center" border=1>
<tr>
    <td>שאלה</td>
    <td><input type="text" name="Question"></td>
</tr>
<tr>
    <td>תשובה 1</td>
    <td><input type="text" name="Ans1"></td>
</tr>
<tr>
    <td>תשובה 2</td>
    <td><input type="text" name="Ans2"></td>
</tr>
<tr>
    <td>תשובה 3</td>
    <td><input type="text" name="Ans3"></td>
</tr>
<tr>
    <td>תשובה 4</td>
    <td><input type="text" name="Ans4"></td>
</tr>
<tr>
    <td><input type="radio" name="online" value="1">פרסם סקר</td>
    <td><input type="submit" value="שלח"></td>
</tr>
</table>
</form>


הסקר עצמו תומך במספר אינסופי של תשובות לכל שאלה. אם רוצים יותר מ-4 תשובות, יש לתכנן בהתאם את הטופס.

שימו לב לתיבת הסימון בשם online. תיבה זו מציינת אם הסקר יעלה לאוויר (Status=1), או שישמר במערכת, אך עדיין לא יפורסם (Status=0).
על אותו עיקרון של טופס ההוספה, ניתן לבנות טופס עריכת סקר, כדי שניתן יהיה לשנות את התשובות, ולשנות את הסטטוס של הסקר.

ההכנסה לבסיס הנתונים (PostPoll.asp)

הערה:
בכל הדוגמאות המאמר זה ישנו שימוש באובייקט חיבור וברקורדסט שהוגדרו קודם לכן. היצירה שלהם אינה מופיעה במאמר.

ראשית נבדוק את הסטטוס המבוקש של הסקר, ונכניס אותו לתוך משתנה:


1
2
3
4
5  

<%
Dim Status
Status = Request.Form("Online")
If Status="" Then Status=0
%>

כאמור, רק סקר אחד יכול להיות באוויר בזמן נתון, כלומר, רק סקר אחד יכול להיות בעל Status=1. לכן, אם ביקשנו להעלות לאוויר את הסקר החדש, נשנה קודם את ה-Status של הסקר הנוכחי ל-2:


1
2
3
4
5  

<%
If Status=1 Then
   conn.Execute "UPDATE pl_Question SET Status=2 WHERE Status=1"
End If
%>

עכשיו נכניס את שאלת הסקר:


1
2
3
4
5
6
7  

<%
Dim Question,sql
Question= Replace(Request.Form("Question"),"'",""")
sql = "INSERT INTO pl_Question (Question,Status) VALUES ('"
sql = sql & Question & "'," & Status & ")"
conn.Execute sql
%>

נקבל את ה-ID החדש שלו:


1
2
3
4
5
6  

<%
Dim newID
rs.Open "SELECT MAX(ID) as newID FROM pl_Question",conn
newID=rs("newID")
rs.Close
%>

אנחנו יוצאים מתוך הנחה שהוספת סקר היא פריווילגיה הנתונה רק למנהל האתר, ולא תיתכן הוספת שני סקרים בו-זמנית. אם נרצה לאפשר הוספת סקרים ע"י הגולשים, נצטרך לשנות קצת את הקוד ולהשתמש בטרנזקציות.

עכשיו נכניס את התשובות.
נבנה לולאה הרצה 4 פעמים על כל שדות התשובות בטופס, נבדוק אם השדה לא ריק, ונכניס את התשובה החדשה לבסיס הנתונים:


1
2
3
4
5
6
7
8
9
10
11
12  

<%
Dim ans
For i=1 to 4
    ans=Request.Form("ans" & i)
    If not ans="" Then
     ans = Replace(ans,"'",""")
        sql = "INSERT INTO pl_Answer (Answer,Que_ID,Total_Hits) VALUES "
        sql=sql & "('" & ans & "'," & newID & ",0)"
        conn.Execute sql
    End If
Next
%>

וזהו, הסקר נמצא כבר בבסיס הנתונים.
הקוד במלואו:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28  

<%
Dim Status,Question,sql,newID,ans

Status = Request.Form("Online")
If Status="" Then Status=0
If Status=1 Then
   conn.Execute "UPDATE pl_Question SET Status=2 WHERE Status=1"
End If

Question= Replace(Request.Form("Question"),"'",""")
sql = "INSERT INTO pl_Question (Question,Status) VALUES ('"
sql = sql & Question & "'," & Status & ")"
conn.Execute sql

rs.Open "SELECT MAX(ID) as newID FROM pl_Question",conn
newID=rs("newID")
rs.Close

For i=1 to 4

    ans=Request.Form("ans" & i)
    If not ans="" Then
     ans = Replace(ans,"'",""")
        sql = "INSERT INTO pl_Answer (Answer,Que_ID,Total_Hits) VALUES "
        sql=sql & "('" & ans & "'," & newID & ",0)"
        conn.Execute sql
    End If
Next
%>

ההצבעה לסקר

את טופס ההצבעה לסקר, נבנה דינמית מתוך בסיס הנתונים.
ראשית, נשלוף את שאלת הסקר ואת כל התשובות:


1
2
3
4
5
6
7
8  

<%
Dim sql
sql = "SELECT pl_Question.ID as QuestionID, pl_Question.Question as Question,"
sql = sql & " pl_Answer.ID as AnswerID, pl_Answer.Answer as Answer "
sql = sql & " FROM pl_Question, pl_Answer"
sql = sql & " WHERE pl_Question.ID = pl_Answer.Que_ID AND pl_Question.Status=1"
rs.Open sql, conn
%>


נציג את שאלת הסקר:


1
2
3
4
5  

<tr>
    <td colspan="2" align="Center"><%=rs("Question")%>
    <input type="hidden" name="QuestionID" value="<%=rs("QuestionID")%>">
    
</td>
</tr>

ונבנה את הטופס. לכל תשובה ניתן כפתור רדיו משלה, כששם כל הכפתורים זהה, אך ב-value של כל אחד מהם נשים את ה-ID של התשובה.


1
2
3
4
5
6
7
8
9  

<%Do While Not rs.EOF%>
<tr>
    <td><input type="radio" name="answer" value="<%=rs("AnswerID")%>"></td>
    
<td><%=rs("Answer")%></td>
</tr>
<%    rs.MoveNext
Loop
rs.Close
%>

בסופו של דבר, הטופס ייראה כך:

מה גילך?
0-10
1-20
20-40
מעל 40

הקוד המלא של הטופס:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26  

<%
Dim sql
sql = "SELECT pl_Question.ID as QuestionID, pl_Question.Question as Question,"
sql = sql & " pl_Answer.ID as AnswerID, pl_Answer.Answer as Answer "
sql = sql & " FROM pl_Question, pl_Answer"
sql = sql & " WHERE pl_Question.ID = pl_Answer.Que_ID AND pl_Question.Status=1"
rs.Open sql, conn
%>
<form method=post action="Vote.asp">
<table>
<tr>
    <td colspan="2" align="Center"><%=rs("Question")%>
    <input type="hidden" name="QuestionID" value="<%=rs("QuestionID")%>">
    
</td>
</tr>
<%Do While Not rs.EOF%>
<tr>
    
<td><input type="radio" name="answer" value="<%=rs("AnswerID")%>"></td>
    
<td><%=rs("Answer")%></td>
</tr>
<%    rs.MoveNext
Loop
rs.Close
%>
</table>
</form>

לאחר שהמשתמש שולח את הטופס, נגיע לדף Vote.asp.
ראשית נבדוק אם אכן נבחרה תשובה לסקר, ואם כן, נעלה את Total_Hits של תשובה זו ב-1.


1
2
3
4
5
6
7  

<%
Dim answerID
answerID= Request.Form("Answer")
If answerID<>"" Then
    conn.Execute "UPDATE pl_Answer SET Total_Hits = Total_Hits + 1 WHERE ID=" & answerID
End If
%>

על מנת למנוע ממישהו להצביע שוב ושוב לאותו סקר, ניתן להשתמש בעוגיות.
לאחר ההצבעה, נעביר את הגולש לדף הצגת תוצאות הסקר, ונשלח את מספר הסקר:


1
2
3  

<%
Response.Redirect "PollResults.asp?QuestionID=" & Request.Form("QuestionID")
%>

הצגת תוצאות הסקר

נבנה דף PollResults.asp המקבל ID של סקר, ומציג את תוצאותיו.

נשלוף את הסקר המבוקש, כל עוד הסטטוס שלו הוא לא 0 (אנחנו לא רוצים להציג סקרים שעדיין לא התפרסמו).


1
2
3
4
5
6
7
8
9
10  

<%
If Request("QuestionID") <>"" Then
    Dim sql
    sql = "SELECT pl_Question.ID as QuestionID, pl_Question.Question as Question,"
    sql = sql & " pl_Answer.ID as AnswerID, pl_Answer.Answer as Answer "
    sql = sql & " FROM pl_Question, pl_Answer"
    sql = sql & " WHERE pl_Question.ID = pl_Answer.Que_ID AND pl_Question.Status<>0"
    rs.Open sql,conn
    If Not rs.EOF Then
%>

נציג את שאלת הסקר:


1
2
3  

<tr>
    <td colspan="2" align="center"><%=rs("Question")%></td>
</tr>

ונעבור בלולאה, להצגת כל התשובות יחד עם מספר ההצבעות:


1
2
3
4
5
6
7
8  

<%Do While Not rs.EOF%>
     <tr>
        <td><%=rs("Answer")%></td>
        <td><%=rs("Hits")%></td>
    </tr>
<%    rs.MoveNext
Loop
rs.Close%>

ניתן לבנות גרף אשר יציג את התוצאות בצורה יותר ויזואלית, אך זה כבר נושא למאמר אחר…

הקוד במלואו:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26  

<%
If Request("QuestionID") <>"" Then
     Dim sql
     sql = "SELECT pl_Question.Question , pl_Answer.Answer as Answer,pl_Answer.Total_Hits as Hits "
     sql = sql & " FROM pl_Question, pl_Answer WHERE pl_Question.ID = pl_Answer.Que_ID "
     sql = sql & " AND pl_Question.Status<>0 AND pl_Question.ID=" & Request("QuestionID")
     rs.Open sql,conn
    
     If Not rs.EOF Then%>
     <table>
         <tr>
         <td colspan="2" align="center"><%=rs("Question")%></td>
         </tr>
          <%Do While Not rs.EOF%>
     <tr>
         <td><%=rs("Answer")%></td>
             <td><%=rs("Hits")%></td>
         </tr>
     <% rs.MoveNext
     Loop
     rs.Close%>
     </table>
   <%End If
End If
%>


היסטוריית סקרים

דף זה יציג את כל הסקרים הקודמים, כשכל אחד מהווה לינק לדף PollResult.asp כדי להציג את תוצאותיו.

נשלוף את כל הסקרים שהסטטוס שלהם הוא לא 0:


1
2
3
4
5  

<%
    Dim sql
    sql = "SELECT ID, Question FROM pl_Question WHERE Status<>0"
    rs.Open sql,conn
%>

נציג את הרשימה:



1
2
3
4  

<%    Do While Not rs.EOF %>
        <a href="PollResults.asp?QuestionID=<%=rs("ID")%>"><%=rs("Question")%></a><br>
    
<%    rs.MoveNext
    Loop %>

הקוד במלואו:


1
2
3
4
5
6
7
8
9
10  

<%
    Dim sql
    sql = "SELECT ID, Question FROM pl_Question WHERE Status<>0"
    rs.Open sql,conn
    Do While Not rs.EOF %>
        <a href="PollResults.asp?QuestionID=<%=rs("ID")%>"><%=rs("Question")%></a><br>
    
<%    rs.MoveNext
    Loop
    rs.Close
%>

בהצלחה!

תגיות: ,

תגובות בפייסבוק