שלח תשובה

זירת השאלות

524
צפיות
14
תשובות

הנה השאלה שלי מחדש:

,‏ 21 בינואר, 2004

טוב, מכיוון שהשרשור הקודם לשאלה הזאת כמעט הפכה למפלצת (לטענת זהר פלד… לכן הוא אמר לי לשאול מחדש את השאלה ובצורה ברורה) אז הנה:
הקדמה לשאלה:
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 תשובות

  1. זהר פלד הגיב:

    *אהההמ*
    copy-paste:
    "אני מבקש שתציג את השאלה מחדש (אבל לא בשרשור חדש, חס וכרפס)"
    אבל עזוב, את הנעשה אין להשיב, וכעת לשאלה עצמה:

    בדוק את קוד המקור של ה HTML המתקבל, יכול להיות שיש שם בלגאן כלשהו בתוים שלא מאפשר לדפדפן להציג את התשובות.

    חוצמזה, הערת יעילות קטנה – במקום if not rs("a"&i) = "" then
    עדיף לכתוב if rs("a"&i) <> "" then
    ובכלל, למען הסר ספק, יכול להיות שהשתרבב לך רווח למסד הנתונים, אז עדיף, אם כבר, לכתוב if trim(rs("a"&i)) <> "" then…

  2. albert הגיב:

    =>
    כבר ניסיתי את כל זה… :-/
    עדיין אותו סיפור… והנה הקוד הhtml:

    <input type="radio" name="hit" value="h1"></input><br>
    <input type="radio" name="hit" value="h2"></input>

    ולא הבנתי "(אבל לא בשרשור חדש, חס וכרפס)", מה הכוונה הייתה?

    תודה!

  3. זהר פלד הגיב:

    הכוונה היתה לכתוב את השאלה מחדש
    באותו השרשור, אבל עכשיו זה כבר לא חשוב.

    תראה, לא ממש ברור לי מה הולך פה, וזה מתחיל להיות מסקרן…
    צרץ כקובץ TXT את כל הדף להודעה הבאה שלך, ואולי אז נעלה על משהו שלא ראינו קודם.

  4. albert הגיב:

    הנה הקובץ:
    אני מקווה שזה ישלח לי אותו…
    בקובץ עצמו כתבתי הערות לגבי כמה פעולות, אני מקווה שתבינו מה הולך שם…

    תודה, אלברט

  5. זהר פלד הגיב:

    מספר הערות על הקוד:
    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 בתפוז)

  6. זהר פלד הגיב:

    ואת הקוד המשופר שכחתי….

    <%@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>

  7. albert הגיב:

    עדיין:
    לא עובד…
    א. תודה על השיםור בקוד…
    ב. שכחת להגדיר אובייקט חיבור…(לא משנה, תיקנתי את זה…)
    ג. בקשר להזנחה:
    בהתלחה גם אני עשיתי הזנחות, עד שאיזה מתכנת אחד אמר לי שההזנחות האלו הם בעצם נתונים וזה עלול לעקב את השרת משהו כזה…
    לא משנה…
    ד. והכי חשוב: אני עדיין בבעיה, זה לא כותב את התשובה עצמה…מה אני עושה עם זה?

    תודה, אלבט

  8. זהר פלד הגיב:

    *אההמ*….
    לא שכחתי להגדיר את אובייקט החיבור – פשוט אין צורך באובייקט connection בשליפה בודדת. המתודה open של אובייקט recordset יכולה לקבל או מצביע לאובייקט conection, או מחרוזת חיבור (ובמקרה כזה ה recordset יודע לפתוח את ה connection לבד).

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

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

  9. albert הגיב:

    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: סה"כ הצבעות.
    נכון, זה נראה מאוד חובבני אבל זה לא מסובך וכל אחד יכול להציע(אפילו אם הוא לא רשום.), בקיצור נוח…(אפשר גם להוסיף תאריך ועוד כל מיני דברים כמו שאתה כתבת…)
    בכל מקרה, שוב תודה על הרעיון המקצועי שלך!
    אתה יכול להסביר איך המערכת הזאת תעבוד?(אני לא מתכוון שתביא קוד וכו', אלא פשוט להסביר מה קורה כשמצביעים? איך מחשבים את התוצאות וכו'…)

    תודה, אלברט

  10. זהר פלד הגיב:

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

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

  11. albert הגיב:

    אוקיי, תודה
    אני אפצל את הטבלה שלי לשלושה חלקים…
    תודה!

  12. albert הגיב:

    שאלה:
    שלום!
    איך אני מחשב(לפי הטבלה שלך) את סה"כ ההצבעות?
    (מספר התשובות יכול להשתנות מפעם לפעם)

    תודה, אלברט

  13. זהר פלד הגיב:

    מכיר COUNT ב SQL?
    אז בעזרתו אתה מחשב את כמות ההצבעות הכללית, וגם את ההתפלגות לפי תשובה.
    לא מכיר? מדריך ה SQL באתר מסביר עליו יופי.

שלח תשובה