מאמר זה מלמד את עקרונות בניית סקר.
זה אינו סקר מוכן של העתק+הדבק, וכדי להבין אותו דרוש ידע בסיסי ב-ASP ועבודה עם בסיסי נתונים.
יש הרבה אפשרויות להרחבת הסקר, הצגה בצורה גרפית, מניעת הצבעה חוזר וכו'. המאמר בא להדגיש את בניית הסקר הבסיסית, ללא ההרחבות.
בניית מסד הנתונים
מסד הנתונים יהיה מורכב משתי טבלאות: טבלת שאלות, וטבלת תשובות.
טבלת השאלות – pl_Question
- ID – מספר מזהה של השאלה, מסוג מספור אוטומטי
- Question – השאלה עצמה
- Status – מספר המציין את סטטוס השאלה:
- 0 סקר שעדיין לא עלה
- 1 הסקר שנמצא כרגע באוויר (לא יכול להיות מצב בו שני סקרים נמצאים בסטטוס זה בו זמנית)
- 2 סקר ישן
טבלת התשובות – pl_Answer
- ID – מספר מזהה, מסוג מספור אוטומטי
- Answer – התשובה
- Que_ID – מספר השאלה אליה שייכת התשובה
- Total_Hits – מספר ההצבעות לתשובה זו.
הוספת סקר חדש
נבנה טופס הנראה כך:
והקוד:
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,ansStatus = 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 %> |
|
בסופו של דבר, הטופס ייראה כך:
הקוד המלא של הטופס:
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 %> |
|
בהצלחה!
תגובות בפייסבוק