צפיות
תשובות
הנה השאלה שלי מחדש:
טוב, מכיוון שהשרשור הקודם לשאלה הזאת כמעט הפכה למפלצת (לטענת זהר פלד… לכן הוא אמר לי לשאול מחדש את השאלה ובצורה ברורה) אז הנה:
הקדמה לשאלה:
rs = RecordSet
a1, a2, a3, a4 הם אופציות לבחירה לשאלה בסקר, כלומר הid שלהם זהה.
לסקר יכולות להיות עד 4 אופציות לביחרה…
אבל יש מצב שיש רק שתי אופציות לבחירה בסקר (דוגמא- שאלה: האם… תשובה: כן/לא) ז"א שתי שדות נשארות ריקות! אז מה עושים? ניסיתי לשים תנאי בלולאה (שעוברת על אופציות הבחירה) לפני שמציגים את כפתור הרדיו ואת האופציה… הנה הקוד לפני התנאי:
<%
for i=1 to 4
%>
<input type="radio" name="hit" value="h<%=i%>"><%=rs("a"&i)%></input><br>
<%
next
%>
כאן הכל עובד מצוין אם כל השדות(כלומר: a1-4) מלאות.
והנה הקוד אחרי התנאי:
<%
for i=1 to 4
if not rs("a"&i) = "" then
%>
<input type="radio" name="hit" value="h<%=i%>"><%=rs("a"&i)%></input><br>
<%
end if
next
%>
הבעיה:
הלולאה כותבת פעמיים(בגלל שיש לנו רק שתי תשובות: כן/לא) כפתורי רדיו, אך אינה כותבת את התשובה עצמה(a1,a2).
מה הבעיה של הדבר הזה? תודה לכל העוזרים, אלברט
14 תשובות
*אהההמ*
copy-paste:
"אני מבקש שתציג את השאלה מחדש (אבל לא בשרשור חדש, חס וכרפס)"
אבל עזוב, את הנעשה אין להשיב, וכעת לשאלה עצמה:
בדוק את קוד המקור של ה HTML המתקבל, יכול להיות שיש שם בלגאן כלשהו בתוים שלא מאפשר לדפדפן להציג את התשובות.
חוצמזה, הערת יעילות קטנה – במקום if not rs("a"&i) = "" then
עדיף לכתוב if rs("a"&i) <> "" then
ובכלל, למען הסר ספק, יכול להיות שהשתרבב לך רווח למסד הנתונים, אז עדיף, אם כבר, לכתוב if trim(rs("a"&i)) <> "" then…
=>
כבר ניסיתי את כל זה… :-/
עדיין אותו סיפור… והנה הקוד הhtml:
<input type="radio" name="hit" value="h1"></input><br>
<input type="radio" name="hit" value="h2"></input>
ולא הבנתי "(אבל לא בשרשור חדש, חס וכרפס)", מה הכוונה הייתה?
תודה!
הכוונה היתה לכתוב את השאלה מחדש
באותו השרשור, אבל עכשיו זה כבר לא חשוב.
תראה, לא ממש ברור לי מה הולך פה, וזה מתחיל להיות מסקרן…
צרץ כקובץ TXT את כל הדף להודעה הבאה שלך, ואולי אז נעלה על משהו שלא ראינו קודם.
הנה הקובץ:
אני מקווה שזה ישלח לי אותו…
בקובץ עצמו כתבתי הערות לגבי כמה פעולות, אני מקווה שתבינו מה הולך שם…
תודה, אלברט
מספר הערות על הקוד:
1) תרגיל את עצמך לבצע הזחות בקוד – קוד בעל הזחות נכונות הרבה יותר קל לקרוא, להבין, ולדבג.
2) אל תכתוב if not a=b then, כתוב פשוט if a<>b then
3) אל תקמץ בשורות רווח – הן משפרות את קריאות הקוד
4) אל תגיע לעולם למצב שבו יש לך שתי שורות עם dim – תגדיר תמיד את כל המשתנים בתחילת הדף. הגעת למקום שצריך עוד משתנה, חזור לתחילת הדף, תוסיף אותו לרשימת המשתנים, ואז תשתמש בו.
5) אין שום טעם בלרשום תנאי מקונן זהה – כמו כאן:
if not rs("a"&i) = "" then
%>
<input type="radio" name="hit" value="h<%=i%>"><font class="sur_ans">
<%
if not rs("a"&i) = "" then
Response.Write(rs("a"&i))
end if
%>
</font></input><br>
<%
end if
6) תמיד כשאתה בודק ערך של משתנה מול מחרוזת ריקה, תשתמש בפקודה trim על המשתנה, (ראה את התיקונים בקוד שעשיתי).
7) מאוד מומלץ להשתמש ב option explicit – בראש הדף. מה שהפקודה הזו עושה, היא מכריחה אותך להשתמש אך ורק במשתנים שהגדרת בעזרת dim, ככה שלא יקרה מצב (כמו בקוד שלך) שהגדרת cons אבל למעשה השתמשת ב conn.
8) אל תשתמש בתג font, ובטח שלא בשביל לתת לו class – הוא עומד לצאת מה HTML בגרסא הבאה, ויש תגים מתאימים יותר – לדוגמא, span (שבו השתמשתי כדי להחיף את התג font שלך).
טוף, זה מספיק הערות על הקוד, נכון לעכשיו.
הנושא הבא: תכנון נכון של מסד נתונים. קודם כל, קרא את , כדי ללמוד איך לתכנן נכון אפליקציית סקרים אינטרנטית.
דבר שני, לגבי העבודה שלך מול מסד הנתונים (לפי מה שאפשר ללמוד מה recordset ומה sql שלך), קרא את .
(אני לא זוכר אם כבר בנינו מהם מאמרים ל webmaster, לכן ההפניה היא ל FAQ של פורום ASP בתפוז)
ואת הקוד המשופר שכחתי….
<%@Language="VBScript" CodePage="1255"%>
<%option explicit%>
<html>
<head>
<title>סקרים</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1255">
<link rel="stylesheet" href="../style.css" type="text/css">
<script>
function history(){
window.open('history.asp','news')
}
</script>
</head>
<body>
<%
dim connectionString, rs, cookie, surveyid, survey_cookie, survey_id, sqlStr
' Get the cookie from the client
survey_cookie = Request.Cookies("survey@albert")("id")
connectionString = "DBQ=" & Server.Mappath("db/serveys_db.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};"
sqlStr = "SELECT * FROM tbl WHERE s=1"' s = survey status
set rs = server.createobject("ADODB.recordset")
rs.open sqlStr, connectionString
survey_id = rs("id")
' check if the user has allready voted
if not cint(survey_cookie)=cint(survey_id) then
%>
<div align="right" dir="rtl">
<!– q = survey qyestion –>
<h3><span class="sur_ques"><%=rs("q")%></span></h3>
<form action="data.asp" target="news" method="post">
<input type="hidden" name="ID" value="<%=rs("ID")%>">
<%
for i=1 to 4
' a = survey option, options go from 1 to max. 4 (could be only 2 options for a question)
if trim(rs("a"& i)) <> "" then
%>
<input type="radio" name="hit" value="h<%=i%>"><span class="sur_ans"><%=rs("a"& i)%>
</span></input><br>
<%
end if
next
%>
<br>
<input type="submit" value=" שלח " class="b">
<input type="button" value="לסקרים דומים" class="b" onClick="history()">
</form>
</div>
<%
rs.close
set rs=nothing
conn.close
set conn=nothing
else
' if the user has voted allready, we redirect him to the result page.
Response.Redirect("results.asp")
end if
%>
</body>
</html>
עדיין:
לא עובד…
א. תודה על השיםור בקוד…
ב. שכחת להגדיר אובייקט חיבור…(לא משנה, תיקנתי את זה…)
ג. בקשר להזנחה:
בהתלחה גם אני עשיתי הזנחות, עד שאיזה מתכנת אחד אמר לי שההזנחות האלו הם בעצם נתונים וזה עלול לעקב את השרת משהו כזה…
לא משנה…
ד. והכי חשוב: אני עדיין בבעיה, זה לא כותב את התשובה עצמה…מה אני עושה עם זה?
תודה, אלבט
*אההמ*….
לא שכחתי להגדיר את אובייקט החיבור – פשוט אין צורך באובייקט connection בשליפה בודדת. המתודה open של אובייקט recordset יכולה לקבל או מצביע לאובייקט conection, או מחרוזת חיבור (ובמקרה כזה ה recordset יודע לפתוח את ה connection לבד).
בקשר להזחה (ולא הזנחה) אותו "מתכנת" שאמר את מה שאמר, אני יכול לומר לך בודאות, גם בלי לדעת מי זה, שצוות ה QA שקיבל את הקוד שלו אכל ממנו הרבה חרא, סליחה על הביטוי. קוד צריך להיות קריא, והרווחים של ההזחה לא מעכבים את השרת במידה שמצדיקה ויתור על קריאות של הקוד.
ובקשר לבעיה שלא נפתרה, אין לי כרגע שרת מותקן על המחשב, אז תצטרך לחכות קצת אם אתה רוצה שאנסה להפעיל את זה גם אצלי.
והכי חשוב – קראת את הלינקים שנתתי לך?
2 דברים:
א. אין בעיה אני אמתין, אין לי בררה אחרת….
ב. לגבי הלינקים:
1) תודה! קודם כל.
2) אני בונה סקר ולא טרוויה.
3) מערכת הסקרים שלי אפשר להגיד לא כזה מקצועי אבל לא כזה יבש גם.
*רק מנהל האתר יכול להוסיף סקר חדש.
מה שראיתי בלינק(שאתה כתבת) נראה לי יותר מידי מסובך בשביל סקר אחד מסכן.
אני לא מבין למה צריך להפריד בין טבלת השאלות לטבלת התשובות?(במידה ומספר התשובות לסקר קבוע).
אני תכננתי את הטבלה שלי בצורה מאוד מאוד פשוטה ונוחה:
id,q,a1,a2,a3,a4,s,h1,h2,h3,h4,gh
הסבר:
id: מספר הסקר.
q: שאלת הסקר
a1-4: תשובות לסקר
s: מצב הסקר(0/1, כלומר מסוג: כן/לא)
h1-4: הצבעות לתשובות(a1 מתאים לh1 וכך הלאה..)
gh: סה"כ הצבעות.
נכון, זה נראה מאוד חובבני אבל זה לא מסובך וכל אחד יכול להציע(אפילו אם הוא לא רשום.), בקיצור נוח…(אפשר גם להוסיף תאריך ועוד כל מיני דברים כמו שאתה כתבת…)
בכל מקרה, שוב תודה על הרעיון המקצועי שלך!
אתה יכול להסביר איך המערכת הזאת תעבוד?(אני לא מתכוון שתביא קוד וכו', אלא פשוט להסביר מה קורה כשמצביעים? איך מחשבים את התוצאות וכו'…)
תודה, אלברט
הסברתי כבר שם
למה סקר כמעט זהה לטריוויה, ואני לא חוזר על ההסבר.
לגבי תכנון מסד הנתונים, תכננת את המסד שלך בצורה שאולי נוחה לך, אבל שגויה מהיסוד.
לו היית משתמש בטבלה אחת לשאלות וטבלה שניה לתשובות, הבעיה שאנחנו מנסים לפתור כרגע לא היתה בכלל מתרחשת. אני לא מתכוון להסביר בהודעה בפורום על ארכיטקטורה של מסד נתונים, כי הנושא הזה ארוך ומסובך ודורש סדרה של לפחות 3 מאמרים, ופשוט אין מספיק מקום כאן.
חוצמזה, כשאתה מתכנן אפליקצייה כלשהיא, תמיד טוב לחשוב קדימה – התכנון שהצעתי בלינק המדובר מאפשר גמישות גבוהה ואפשרויות כמעט בלתי מוגבלות להרחבת האפליקציה, בעוד שמסד הנתונים שבנית אתה לא מאפשר הרחבה כמעט בכלל.
לגבי חישוב תוצאות ההצבעה, בדיוק בשביל זה יש שם טבלת תוצאות, והחישוב ממנה פשוט למדי – אתה פשוט סופר את התפלגות התשובות לכל שאלה…
אוקיי, תודה
אני אפצל את הטבלה שלי לשלושה חלקים…
תודה!
bkf…
שאלה:
שלום!
איך אני מחשב(לפי הטבלה שלך) את סה"כ ההצבעות?
(מספר התשובות יכול להשתנות מפעם לפעם)
תודה, אלברט
מכיר COUNT ב SQL?
אז בעזרתו אתה מחשב את כמות ההצבעות הכללית, וגם את ההתפלגות לפי תשובה.
לא מכיר? מדריך ה SQL באתר מסביר עליו יופי.