אתה נמצא כאן סקריפטים  >>  סקר

סקר

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


הערות:
שימוש בבסיס נתונים ובמספר טבלאות. שימוש ב-sessions. תוכנית זו ארוכה ומורכבת מקבצים רבים. קצת מסובך.

שימוש בפונקציות:
array()   array_reverse()   count()   die()   exit()   file_exists()   header()   is_array()   isset()   mysql_affected_rows()   mysql_connect()   mysql_fetch_array()   mysql_num_rows()   mysql_query()   mysql_select_db()   round()   session_is_registered()   session_register()   session_start()   session_unregister()   trim()   unset()   

הורד סקריפט
שם קובץ: poll.zip
גודל קובץ: 21.2 KB

מבנה קבצים

poll.php - הקובץ הראשי של התוכנית. מכאן אתה בוחר את שאלת הסקר ורואה את הסטטיסטיקות.
poll_func.inc - קובץ המכיל פונקציות תדירות עבור התוכנית.
poll_conf.inc - קובץ המכיל את ההגדרות לתוכנית.
poll_vote.php - קובץ המציג את שאלת הסקר שנבחרה ומטפל בהצבעה.
poll_view.php - קובץ המציג את הסטטיסטיקה של שאלת סקר בחלון נפרד.
poll_add_vote.inc - קובץ המכיל את הפונקציה להוספת הצבעה לשאלת סקר.
poll_admin/poll_admin.php - הקובץ הראשי של האדמינסטרטור, אליו מגיעים דרך התחברות לפי שם משתמש וססמא.
poll_admin/poll_admin_login.php - קובץ המבקש את שם המשתמש והססמא להתחברות.
poll_admin/poll_admin_conf.inc - קובץ המכיל את הגדרות האדמינסטרטור, כולל את שם המשתמש והססמא.
poll_admin/poll_admin_action.inc - קובץ המכיל פונקציות אדמינסטרציה ומבצע פעולות אדמינסטרטור.

שימוש והתקנה

תוכנית הסקר משתמשת בבסיס נתונים של MySQL וב-3 טבלאות. על-כן חלק נכבד מן ההתקנה הוא טיפול בבסיס הנתונים ובטבלאות. ראשית יש לשנות את המשתנים בקובץ הקונפיגורציה של התוכנית (poll_conf.inc) ולמלא את: שם השרת של MySQL, שם המשתמש ב-MySQL, הססמא ב-MySQL ובסיס הנתונים בו ניצור את הטבלאות לתוכנית. בנוסף נמצא גם המשתנה $poll_bars, שהוא בעצם מערך המכיל את שמות הקבצים שבהם נשתמש להצגת המקלות בגרף של הסטטיסטיקה, וניתן להחליף את התמונות של המקלות ע"י שינוי התמונות במערך.

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

הטבלאות בהן התוכנית משתמשת נראות כך:

polls - מכיל מידע על שאלות הסקר בלבד.
id (int) question (text)
28 מהו הצבע האהוב עליך ביותר מבין הבאים?
34 איזו מקלחת אתה אוהב/ת בקיץ?

polls_alternatives - מכיל מידע על כל האפשרויות של כל שאלות הסקר.
id (int) alternative (text) votes (int) poll_id (int)
4 כחול 24 28
13 אדום 87 28
15 קרה 103 34
16 צהוב 35 28
21 ירוק 61 28
22 פושרת 98 34
23 חמה 46 34

polls_votes_addresses - מכיל מידע על המצביעים לשאולות הסקר ועל ה-IP שלהם.
ip_address (varchar(15)) poll_id (int) alt_id (int)
234.78.3.124 28 13
234.78.3.124 34 22
79.241.56.12 34 22
79.241.56.12 28 13
(כאן אמורים להיות הרשימה של כל כתובות ה-IP בצמוד למספר הזיהוי של שאלת הסקר ולמספר הזיהוי של האפשרות שנענתה.)

נשאר רק לשנות את קובץ ההגדרות של האדמינסטרטור (poll_admin/poll_admin_conf.inc). שם נשנה את שם המשתמש ($poll_login_admin_user) ואת הססמא ($poll_login_admin_pass) להתחברות לאדמינסטרטור של הסקר.

הסבר

I. הסקר

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

1. poll.php

בתחילה אנו מייבאים את הקובץ poll_func.inc כדי להשתמש בפונקציות. לאחר מכן אנו מתחברים לשרת ה-MySQL באמצעות הפונקציה ConnectPoll(). בוחרים מתוך הטבלה polls את כל שאלות הסקר. ואז בלולאה אנו עוברים שורה-שורה מתוך התוצאה של השאילתא, ומדפיסים לדפדפן (ברשימה) כל שאלת סקר ביחד עם קישור לדף poll_vote.php שמציג את השאלה ומטפל בהצבעה. בצמוד אנו מדפיסים קישור לפתיחת חלון חדש שבו תיראה הסטטיסטיקה של השאלה. ובסוף אנו מדפיסים בסוגריים את מספר ההצבעות לכל שאלת סקר עם שימוש בפונקציות GetNumberVotes(GetAlternatives($arr['id'])).

2. poll_func.inc

קובץ זה מכיל פונקציות שאנו משתמשים בהם באופן תדיר בתוכנית. הקובץ מייבא את poll_func.inc מהספריה הנוכחית או מהספריה האבא (כי גם האדמינסטרטור משתמש בקובץ זה). הוא בודק היכן הקובץ נמצא בעזרת הפונקציה file_exists().

ConnectPoll() - פונקציה זו מתחברת לשרת ה-MySQL ומחזירה את הידית לשרת, ובמקרה של כשלון היא מפסיקה את פעולת התוכנית (עם הפונקציה die()). לאחר ההתחברות אנו בוחרים את בסיס הנתונים שלנו עם mysql_select_db(), ואם לא הצלחנו להכנס לבסיס הנתונים, התוכנית מפסיקה את פעולתה. את הפרמטרים של ההתחברות אנו לוקחים מהמשתנים הגלובלים (global).

CheckPollID($id) - הפונקציה מחזירה ערך אמת במידה ושאלת הסקר עם מספר הזיהוי $id נמצא. אם אין חיבור ל-MySQL אנו יוצרים חיבור חדש. אנו סופרים את מספר השורות בטבלה polls שבהם id=$id, ואם התוצאה שקיבלנו שווה ל-0 אנו מחזירים שקר, אחרת מחזירים אמת.

GetQuestion($id) - מחזירה מחרוזת המכילה את שאלת הסקר בלבד שמספר הזיהוי שלו הוא $id. אנו בוחרים את העמודה question מתוך הטבלה polls שמתקיים בה id=$id. אנו מתרגמים את התוצאה בעזרת mysql_fetch_array(), ומחזירים את המחרוזת שמכילה את שאלת הסקר.

GetAlternatives($id) - מחזירה מערך המכיל את כל האפשרויות לבחירה של שאלת הסקר שמספר הזיהוי שלה הוא $id. בוחרים את כל השורות מתוך הטבלה polls_alternatives שבהם poll_id=$id, כלומר: כל האפשרויות ששייכות לשאלת סקר שמספר הזיהוי שלה הוא $id. מתרגמים שורה-שורה מתוך התוצאה באמצעות לולאה, ומוסיפים כל אפשרות למערך $alts, שמוחזר בסוף הפונקציה.

GetNumberVotes($alts) - מחזירה את מספר ההצבעות הכולל של כל האפשרויות שנמצאות בפרמטר המערך $alts. אם הפרמטר שקיבלנו הוא כלל אינו מערך אנו מחזירים ערך שקר. מאתחלים משתנה $sum עם 0, והוא יכיל את מספר ההצבעות הכולל. באמצעות לולאה אנו עוברים על כל האיברים שבמערך, ומוסיפים לסכום את מספר ההצבעות שניתנו לכל אפשרות מתוך $alts. לבסוף מחזירים את הסכום $sum.

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

javascript:ShowPoll(id) - פונקציה של JavaScript שתפקידו הוא לפתוח חלון חדש ופשוט רק עם מסגרת ללא שורת כתובת, לחצנים, תפריטים ושורת סטטוס, שתעלה את הדף poll_view.php?id=id להצגת הסטטיסטיקה של שאלת הסקר עם מספר הזיהוי $id.

3. poll_add_vote.inc

הקובץ מכיל פונקציה אחת, PollAddVote($poll_id,$alt_id), שתפקידה להוסיף את ההצבעה של המשתמש למאגר המצביעים. הפונקציה מחזירה ערך אמת (boolean) במקרה של הוספת ההצבעה, ערך שקר (boolean) במקרה של כישלון, וערך מספרי (integer) המסמל את האפשרות שנבחרה במקרה והמשתמש כבר הצביע לשאלת סקר זו בעבר. אם אין חיבור ל-MySQL אז הפונקציה יוצרת חיבור חדש.

כעת בודקים אם ההצבעה היא חוקית. נעשה זאת ע"י בדיקת תאימות של מספר הזיהוי של של שאלת הסקר והאפשרות. נבחר את העמודה polls_id מתוך הטבלה polls_alternatives עם id=$alt_id. אם ארעה שגיאה ב-MySQL נדפיס אזהרה ונחזיר ערך שקר. נתרגם את התוצאה של השאילתא עם mysql_fetch_array(), ונבדוק שאכן מספר הזיהוי של שאלת הסקר של האפשרות שנבחרה ($row['poll_id']) תואם למספר הזיהוי של שאלת הסקר שנתקבלה כפרמטר ($poll_id). אם יש תאימות אז ההצבעה חוקית ואנו נמשיך. אם אין תאימות אז ההצבעה לא חוקית, נדפיס הודעת שגיאה ונחזיר ערך שקר.

אם ההצבעה חוקית ולא ארעה אף שגיאה עד כה, אנו נבדוק אם המשתמש כבר הצביע בעבר לשאלת סקר זו. המשתנה $ip יכיל את כתובת ה-IP של המשתמש (שהוא global $REMOTE_ADDR). מתוך הטבלה polls_votes_addresses נבחר את העמודה alt_id שבה מתקיים (ip_address='$ip' AND poll_id=$poll_id) (ה-$ip נמצא בגרשיים כי זהו מחרוזת). אם ארעה שגיאה ב-MySQL נדפיס אזהרה ונחזיר ערך שקר. באמצעות הפונקציה mysql_num_rows() אנו מקבלים את מספר השורות שנתקבלו כתוצאה מן השאילתא. אם מספר השורות הוא 0, אז המשתמש מצביע לשאלת הסקר פעם ראשונה ואנו נכניס את ההצבעה שלו, ואם מספר השורות אינו 0, אז המשתמש כבר הצביע לשאלת סקר זו בעבר ואנו נחזיר את מספר הזיהוי של האפשרות שבחר.

כדי להכניס את ההצבעה למאגר הנתונים אנו צריכים לעדכן את הטבלאות polls_alternatives ו-polls_votes_addresses. ראשית נעדכן את הטבלה polls_alternatives (עם שאילתת UPDATE), ונוסיף 1 לערך שבעמודה votes בשורה שבה מתקיים id=$alt_id. אנו בודקים את מספר השורות שהשתנו בטבלה עם הפונקציה mysql_affected_rows(). אם מספר השורות שהשתנו הוא 0, אז סימן שארעה שגיאה ואנו מדפיסים אזהרה ומחזירים ערך שקר. כעת נוסיף לטבלה polls_votes_addresses את ה-IP של המשתמש בתוספת מספרי הזיהוי של שאלת הסקר והאפשרות שבחר בה (עם שאילתת INSERT). שוב בודקים את מספר השורות שהשתנו עם הפונקציה mysql_affected_rows(). אם לא ארעה אף שגיאה, אז הטבלאות עודכנו וההצבעה התקבלה, ובמקרה כזה נחזיר ערך אמת.

4. poll_vote.php

קובץ זה אחראי להציג את שאלת הסקר, ולטפל בהצבעה של המשתמש. לקובץ זה נשלח תמיד מספר הזיהוי של שאלת הסקר שצריך להציג במשתנה $id, לכן אם המשתנה הנ"ל לא קיים אז התוכנית לא יודעת איזו שאלה להציג, ואנו מעלים דף אחר במקומו באמצעות הפונקציה header() ששולחת HTTP header לדפדפן. במקרה שלנו אנו שולחים את ה-header: "Location: poll.php", שמעלה את הדף poll.php במקומו של דף זה, ובעצם כך אנו מפנים את המשתמש לדף הראשי של התוכנית כדי לבחור שאלת סקר כאשר לא ידוע איזו שאלת סקר להציג.

אנו מייבאים את קובץ הפונקציות (poll_func.inc) ויוצרים חיבור ל-MySQL. באמצעות הפונקציה שבנינו CheckPollID($id), אנו בודקים אם שאלת הסקר עם מספר הזיהוי $id נמצא בבסיס הנתונים שלנו, ואם לא אז אנו מדפיסים הודעת שגיאה ועוצרים את הסקריפט.

אם השאלה קיימת בבסיס הנתונים, אנו שומרים את המחרוזת של השאלה במשתנה $poll_question (עם הפונקציה שבנינו GetQuestion($id)). בתחילת הדף אנו מדפיסים את שאלת הסקר, ואז בודקים אם המשתמש הצביע לשאלה זו או לא, ע"י כך שבודקים אם הערך של המשתנה $vote מאותחל או לא (בפסקה הבאה תבין מדוע המשתנה הזה).

אם המשתנה $vote לא מאותחל (בבלוק של ה-else), אז אנו לוקחים את מערך האפשרויות של שאלת הסקר (הפונקציה GetAlternatives($id)) ובונים איתו טופס קטן שאיתו אנו נקבל מן המשתמש את האפשרות שבחר. באמצעות לולאה אנו מדפיסים כל אפשרות מן המערך כשלימינו ישנו כפתור רדיו שמסמן את האפשרות. כפתורי הרדיו נקראים "vote_id", וערכם הוא מספר הזיהוי של האפשרות, $alt['id']. בסוף רשימת האפשרויות מדפיסים כפתור שליחה ששמו הוא "vote". הטופס שולח את הנתונים לאותו הדף ($PHP_SELF), ובעת שליחת הטופס, רכיבי הטופס הופכים למשתנים ששמם הוא כשם הרכיב וערכם הוא כערכו של הרכיב. על-כן בעת הצבעה, הקובץ הנוכחי יקבל משתנה $vote, ולכן בדיקת קיומו של המשתנה $vote יכול לתת מידע אם המשתמש הצביע או לא.

כאשר המשתנה $vote מאותחל, כלומר המשתמש הצביע, אנו בודקים את האפשרות שנבחרה. אם $vote_id לא מאותחל, אז המשתמש הצביע מבלי לבחור אף אפשרות. אנו יוצרים משתנה דגל, $do_vote שיאותחל עם ערך שקר, והוא יסמל לנו אם ההצבעה התקבלה. אם $vote_id מאותחל אז $do_vote מקבל את הערך המוחזר מן הפונקציה PollAddVote($id,$vote_id). ואם המשתנה $do_vote לא מאותחל, אנו מדפיסים הודעת שגיאה וכפתור לחזור לשאלה כדי לבחור אפשרות. לאחר-מכן, אם המשתמש בחר אפשרות והצביע אנו בודקים את הערך של $do_vote. אם ערכו שקר, מדפיסים הודעת שגיאה שההצבעה לא התקבלה. אם ערכו אמת, מדפיסים הודעה שההצבעה התקבלה ונשמרה. ואם ערכו הוא ערך מספרי, מדפיסים כי המשתמש כבר הצביע לשאלת סקר זו בעבר, וכי לא יוכל להצביע פעם נוספת. בסוף הדף אנו שמים קישור לדף הראשי של הסקר, כדי לבחור שאלה חדשה.

5. poll_view.php

קובץ זה מציג את הסטטיסטיקות של שאלות הסקר עפ"י דיאגרמת מקלות. אם מספר הזיהוי של שאלת הסקר לא מצויין (אם המשתנה $id לא מאותחל), אז שמים -1 במשתנה הנ"ל, כך שאין שאלת סקר עם מספר זיהוי כזה, כדי לעצור את הלולאה עם הודעת שגיאה בשלב קצת יותר מאוחר. אנו מייבאים את קובץ הפונקציות (poll_func.inc) ומתחברים לשרת ה-MySQL. לאחר-מכן בודקים אם שאלת הסקר עם מספר הזיהוי $id נמצא בבסיס הנתונים (עם הפונקציה CheckPollID($id)), ואם השאלה לא נמצאה אז מדפיסים הודעת שגיאה ועוצרים את הסקריפט. משתנה $poll_question מקבל את המחרוזת המכילה את שאלת הסקר, ומדפיסים את שאלת הסקר ככותרת.

כעת נשאר לנו להציג את דיאגרמת המקלות של הסטטיסטיקה. $poll_alts מקבל את כל האלטרנטיבות של שאלת הסקר, ו-$num_votes מקבל את המספר של סך כל ההצבעות לשאלת הסקר הנוכחית. ועכשיו מדפיסים את דיאגרמת המקלות בעזרת טבלת HTML. בעזרת לולאת for אנו מדפיסים שורה-שורה בטבלה:

<?php
  echo "<TABLE border=0 width=100% cellpadding=1 cellspacing=2>\n";
  for ($i=0, $j=count($poll_bars) ; isset($poll_alts[$i]) ; $i++)
  {
     $vv=$poll_alts[$i]['votes']/(($num_votes==0)?1:$num_votes); //the part of the total votes for this alternative
  
   echo "<TR>\n"; //prints a new line in the table
  
   echo "\t<TD width=25% align=\"right\">".($i+1).". ".$poll_alts[$i]['alternative']."</TD>\n"; //prints the alternative
  
   echo "\t<TD width=75% align=\"right\"><NOBR><IMG src=\"".$poll_bars[$i%$j]."\" width=".(integer)($vv*80)."% height=15> ".round($vv*100)."% (".$poll_alts[$i]['votes'].")</NOBR></TD>\n"; //prints the bar to demonstrate the percent of the alternative
  
   echo "<TR>\n";
  }
  echo "</TABLE>\n";
?>

המשתנה $i עובר על האפשרויות במערך $poll_alts, ו-$j הוא מספר תמונות המקלות שנמצאות במערך המקלות ($poll_bars). הלולאה ממשיכה כל עוד יש עוד אפשרויות במערך $poll_alts שצריך להציגן. המשתנה $vv הוא החלק של המצביעים לאפשרות הנוכחית מתוך השלם שהוא כל ההצבעות לשאלת הסקר. שים לב שנמנעים מחילוק ב-0 ע"י כך שמחליפים את 0 ב-1. כל איטרציה בלולאה מדפיסה שורה אחת בטבלה. מדפיסים את העמודה הראשונה ברוחב של 25%, ובו המספר הסידורי של האפשרות והאפשרות עצמה ($poll_alts[$i]['alternative']). את העמודה השניה אנו מדפיסים ברוחב של 75%, ובו התמונה של המקל ה-$i מודולו $j (מספר המקלות במערך) ברוחב של 80% כפול המספר שמייצג את החלק של ההצבעות לאפשרות הנוכחית מתוך כלל ההצבעות לשאלת הסקר ($vv), ואנו מוודאים שהרוחב יהיה מספר שלם ע"י המרה ל-(integer). בסוף המקל אנו מדפיסים את האחוז של המצביעים לאפשרות הנוכחית מתוך הכלל, מעוגל למספר שלם (round($vv*100)), ובסוגריים את המספר המדוייק של האנשים שהצביעו לאפשרות הנוכחית ($poll_alts[$i]['votes']). סוגרים את השורה, ובסוף הלולאה סוגרים את כל הטבלה, וכך יצרנו את דיאגרמת המקלות עם קצת מתמטיקה פשוטה.

II. אדמינסטרטור

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

1. poll_admin/poll_admin.php

קובץ זה מנהל את הסקר, הוא מציג את שאלות הסקר הקיימות בבסיס הנתונים עם אופציות למחוק אותן, ונותן אפשרות להוסיף שאלת סקר חדשה עם מספר שונה של אפשרויות. בתחילה אנו מתחילים session עם הפונקציה session_start(), ובודקים האם המשתנה auth רשום ב-session (בעזרת הפונקציה session_is_registered()), ואם לא אז סימן שהמשתמש לא רשאי להכנס לדף של האדמינסטרטור, ואז מדפיסים הודעת שגיאה עם קישור לדף poll_admin_login.php כדי להכניס ססמא ולהתחבר כאדמינסטרטור. ואם המשתנה רשום אך ערכו הוא שקר, אז סימן שיש שגיאה ב-session ואנו מפסיקים את פעולת הסקריפט לאחר הדפסת השגיאה.

אם המשתמש מורשה לראות את הדף ולפעול בו, אנו ממשיכים. מייבאים את קובץ הפונקציות מהספריה האבא (../poll_func.inc), ומתחברים לשרת ה-MySQL. בוחרים מתוך הטבלה polls את כל שאלות הסקר (אם ארעה שגיאה ב-MySQL מדפיסים הודעת שגיאה ומפסיקים את הסקריפט). בודקים את מספר השורות שקיבלנו כתוצאה מהשאילתא (mysql_num_rows()), ואם הוא 0, אז אנו מדפיסים כי אין שאלות סקר בבסיס הנתונים, ואם יש שאלות אז מדפיסים שורה שמציגה את שאלות הסקר בבסיס הנתונים. את שאלות הסקר אנו מדפיסים בצורת רשימה. בעזרת לולאה אנו עוברים על כל השורות מתוך תוצאת השאילתא (mysql_fetch_array()), ומדפיסים את שאלת הסקר ($row['question']), בצמוד אליה קישור להצגת הסטטיסטיקה של שאלת הסקר ("javascript:ShowPoll(".$row['id'].")"), ובסוף השורה כפתור שלחיצה עליו תעלה את הדף poll_admin_action.php עם פרמטרים של "act=remove" ו-"id=".$row['id']. בסוף הדף מדפיסים טופס להוספת שאלת סקר חדשה עם מספר שונה של פרמטרים. הטופס הנ"ל שולח את הנתונים לדף poll_admin_action.php?act=add.

2. poll_admin/poll_admin_login.php

קובץ זה מתחבר לאדמינסטרטור באמצעות שם משתמש וססמא. נתחיל קודם עם קוד ה-HTML, שמראה טופס לקבלת שם משתמש וססמא להתחברות לאדמינסטרטור. בראש הדף אנו מדפיסים את המחרוזת $msg שמכילה הערות התחברות מן הסקריפט בראש התוכנית. לאחר מכן אנו יוצרים טופס (שנשלח לדף זה) עם שתי שדות טקסט לקבלת שם משתמש (שמו entered_user) ולקבלת הססמא (שמו entered_pass), וכן כפתור לכניסה ששמו submit.

כעת נחזור לקוד ה-PHP בראש התוכנית. מייבאים את הקובץ poll_admin/poll_admin_conf.inc, שמכיל את הגדרות שם המשתמש והססמא. מתחילים session חדש ומוחקים ממנו את המשתנה auth אם היה קיים. בודקים אם שלחו את הטופס ע"י בדיקה האם המשתנה $submit מאותחל. בודקים אימות של שם המשתמש והססמא, ואם יש התאמה בשניהם לאלה המוגדרים ב-poll_admin/poll_admin_conf.inc, אז יש למשתמש אישור אדמינסטרטור. שמים ערך אמת במשתנה $auth, רושמים אותו ב-session (session_register()), ומעלים את הדף poll_admin.php ע"י שימוש בפונקציה header() עם שליחה של "Location". אם אין התאמה בין שם המשתמש ו/או הססמא, אז $msg מכיל הודעת שגיאה כי שם המשתמש ו/או הססמא שגויים. את ההודעה $msg מדפיסים בתחילת הדף לפני הטופס לקליטת שם המשתמש והססמא.

3. poll_admin/poll_admin_action.php

קובץ זה אחראי לבצע את כל פעולות האדמינסטרטור. מתחילים את ה-session עם session_start(). בודקים אם המשתנה auth רשום ב-session ואם לא, אז מדפיסים כי המשתמש לא מורשה לבצע פעולות בדף זה ויוצאים מן הסקריפט (אבטחה). ואם הוא רשום אך ערכו שונה מאמת, גם אז לא ניתן לבצע פעולות בדף כי הוא צריך להיות ערך אמת (אבטחה). אם המשתנה auth רשום וערכו אמת, אז המשתמש מורשה לבצע פעולות בדף זה. אנו מייבאים את קובץ הפונקציות (../poll_func.inc) מהספריה האבא, ומתחברים לשרת ה-MySQL.

PrintAddQuestionForm($ques,$num,$alts) - פונקציה זו מדפיסה טופס להוספת שאלת סקר חדשה עם $num אפשרויות כאשר $ques הוא השאלה ו-$alts הוא מחרוזת של האפשרויות. הפונקציה יוצרת טופס ששולחת את הנתונים לקובץ הזה בתוספת הפרמטר "act=doadd" ו-"num_alts=".$num. הטופס מכיל רכיב של תיבת טקסט רב-שורות לשאלת הסקר (שמו add_question), ובאמצעות לולאה מדפיסים $num תיבות טקסט לאפשרויות (שמם הם $add_alts[$i]), ובסוף ישנו כפתור שליחה (שמו add_submit).

כעת אנו בודקים איזה סוג של פעולה התבקשנו לבצע:
הסרת שאלת סקר (remove): בודקים אם $act=="remove", ואם כן אז הפעולה המבוקשת היא הסרת שאלת סקר. אם $id לא מאותחל, מדפיסים הודעת שגיאה כי לא מצויין איזו שאלה למחוק (מספר זיהוי), ואז עוצרים את הסקריפט. אם צויין מספר הזיהוי של השאלה, אז אנו מוחקים מהטבלה polls את השורה שבה id=$id. אח"כ מוחקים מהטבלה polls_alternatives את כל השורות בהם poll_id=$id. ובסוף מוחקים מהטבלה polls_votes_addresses את כל השורות בהם poll_id=$id. במידה וארעה שגיאה באחת מן המחיקות (שאילתת DELETE), אנו מדפיסים הודעת שגיאה שהפעולה לא הושלמה ועוצרים את הסקריפט. אם כל המחיקות הושלמו אנו מדפיסים הודעת הצלחה ששאלת הסקר נמחקה מבסיס הנתונים.
החלטה על הוספת שאלת סקר (add): אם $act=="add" אז הפעולה המתבקשת היא הוספת שאלת סקר חדשה עם $num_alts אפשרויות. בודקים אם מספר האפשרויות שרוצים לשאלה קטנה מ-2, ואם כן אז מדפיסים הודעה כי צריך לפחות 2 אפשרויות כדי ליצור שאלת סקר, ושמים כפתור שחוזר אחורה כדי שהמשתמש ישנה את מספר האפשרויות. אם מספר האפשרויות חוקי, אז מדפיסים את הטופס להוספת שאלה חדשה עם הפונקציה PrintAddQuestionForm("",$num_alts,array()).
הוספת שאלת סקר (doadd): אם ($act=="doadd" && isset($add_submit)), אז מלאנו את הטופס להוספת שאלה ושלחנו לדף זה. אנו מוחקים את התווים הלבנים (רווחים וטאבים) מן המחרוזות שהכניס המשתמש ע"י הפונקציה trim(). כך מוחקים תווים לבנים מ-$add_question ומכל האפשרויות $add_alts בעזרת לולאה (אם לאחר הורדת התווים הלבנים האפשרות היא מחרוזת ריקה, אנו מוחקים אותה מהמערך עם unset()). אם שאלת הסקר היא מחרוזת ריקה ($add_question==""), אנו מדפיסים הודעה למלא את שדה שאלת הסקר, מדפיסים את הטופס להוספת שאלת הסקר עם הפרמטרים של שאלת הסקר, מספר האפשרויות ומערך האפשרויות, ואז עוצרים את הסקריפט. ואילו אם מספר האפשריות שמולאו קטן ממספר האפשרויות שצריך למלא, אנו מדפיסים הודעה למלא את כל האפשרויות, ואז מדפיסים את הטופס כמו מקודם ועוצרים את הסקריפט. אם טופס הוספת שאלת הסקר מולאה כראוי, אנו מוסיפים את שאלת הסקר לבסיס הנתונים (שאילתת INSERT). מוסיפים לטבלה polls שורה חדשה שהעמודה question בה היא $add_question (ה-id נקבע אוטומטית ע"י MySQL), ובמידה של שגיאה מדפיסים הודעה ויוצאים. כדי לבדוק איזה מספר זיהוי נתן MySQL לשאלה שהכנסנו, נבחר עמודה id מתוך הטבלה polls ואת השורות בהם "question='$add_question'" מסודרים לפי סדר יורד של מספרי הזיהוי, כך שהשאלה שהכנסנו תהיה בשורה הראשונה. נתרגם את השורה הראשונה של תוצאת השאילתא ונשים ב-$poll_id את מספר הזיהוי של השאלה החדשה. נהפוך את סדר האיברים שבמערך האפשרויות (עם array_reverse()), כך שסדר ההכנסה של האפשרויות לטבלה תיהיה בסדר ההדפסה. באמצעות לולאת foreach נעבור על כל האפשרויות שבמערך, ונכניס כל אפשרות לטבלה polls_alternatives עם ערך 0 במספר ההצבעות לאפשרות זו, ועם poll_id שהוא מספר הזיהוי של השאלה החדשה ($poll_id). כל פעם שמכניסים אפשרות לטבלה בודקים שאין שגיאות, ובמקרה של שגיאות מדפיסים הודעה ויוצאים. אם שאלת הסקר החדשה הוכנסה לטבלה ללא אף שגיאה, אנו מדפיסים הודעה ששמירת השאלה בבסיס הנתונים הצליחה.


תגובות בנושא

בקשה 03-11-01 01:01
 רן
#34

אולי אפשר להוסיף לאתר יותר סקריפטים בphp כי אני ממש חדש בphp ואני צריך כמה שיותר סקריפטים אנא חזרו אלי תודה רן

יש בעיה בסקריפט 03-12-02 06:01
 dan salomon
#83

אם אתה שומר את כתובות הIP של הבוחר בסקר
ולפי זה לא נותן לו לבחור פעמים לאותו סקר
אז בפעם הבאה שהוא יתחבר לאינטרנט(אם אין לו IP קבוע) אז הוא יקבל כתובת אחרת ויוכל לבחור שוב
ואילו אדם אחר יקבל לצערו את הIP הרשום ולא יוכל לבחור למרות שעדין לא בחר(הסיכוי קטן אבל תאורטית זה נכון!!)

פרטי המצביע בסקר 03-12-02 09:00
 אלי חן (מנהל)
#86

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

מה הפרטים בלייקוס? 04-12-02 14:01
 dark-angel
#124

מה הפרטים בלייקוס?
מה צריך להכניס ב:$poll_mysql_host
וב:$poll_mysql_db
?????
בבקשה תענו לי מהר!!!!!

למה משנים? 06-12-02 20:01
 יקיר סיטבון
#272

הורדתי ואת השורה הזו, למה אני משנה?

$poll_mysql_db="your_db"; //the database of the poll

בתודה יקיר סיטבון

תגובה: למה משנים? 06-12-02 20:01
 אלי חן (מנהל)
#273

את המשתנה $poll_mysql_db משנים לשם של ה-DB ב-MySQL בו התקנת את הטבלאות של התוכנית.

לא הבנתי... 08-12-02 01:00
 תומר
#333

אני משתמש באפאצ'י...
איך אני "מריץ את קובץ ה-SQL"?

בכלל, איך אני מתקין את ה-MySQL הזה על אפאצ'י? השתגעתי כבר!

תודה, ו... 08-12-02 03:01
 תומר
#337

אם אני רוצה ליצור אותם על שרת? איך אני עושה את זה?


תודה מראש.

בעיה בסקר 09-12-02 02:00
 אסי
#419

שאני מיתחבר
ואני רושם שם משתמש וסיסמה אז תמיד רשום
ERROR: cannot connect to the DB
מה זה?

זה לא חוקי לשמור IP של משתמש 03-11-02 01:01
 מני
#642

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

שמירת IP לא יעילה 03-11-02 01:01
 אלי חן (מנהל)
#644

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

איך אני יכולל שים את הסקר בדף שאני יוצר? 03-12-03 04:02
 עידו
#750

...תודה...למי שיעזור..

לא הבנתי איך שמים את זה 03-12-03 11:01
 רוני
#755

באתררררר שלי
לא הבנתי איך עושים את זהה
מישהו יכול להסביר לי במיל או באיסייקו
342468133

בעיה באדמיניסטרטור 03-12-03 12:01
 נוי אילן
#760

אני כותב את השם משתמש וסיסמה הנכונים אבל מופיעה לי ההודעה:
WARNING: couldn't get info from DB.
איך מתקנים את התקלה?

נ.ב- אני על שרת ליקוס כי אני רק בודק את הסקר.

DB 03-12-03 13:01
 אלי חן (מנהל)
#762

תבדוק שבנית את בסיס הנתונים כמו שצריך..

אבל 03-12-03 17:01
 noy_ilan
#766

אבל לייקוס הם אלה שעשו את בסיס הנתונים

התחברות בלייקוס 03-12-03 20:02
 אלי חן (מנהל)
#778

תבקש את שם המשתמש והססמא הנכונים ל MySQL בלייקוס.. וכן את שם הדטה-בייס שלך בלייקוס..
השגיאה שלך היא בפונקציה mysql_connect או mysql_select_db..

איך רואים IP של מי שהצביע כבר? 06-12-03 04:01
 בלאט
#887

איך רואים IP של מי שהצביע כבר?
תודה

קבלת IP של הקלינט 06-12-03 09:02
 אלי חן (מנהל)
#907

$_SERVER["REMOTE_ADDR"]

איפה אני עושה את הפעולה של ההוספת שאלה 02-12-05 02:02
 אבי בטיטו
#2017

????

אך אני מממקם את הסקר במקום בדף הרצוי 02-12-05 03:01
 אבי בטיטו
#2020

??????????.
תודה מראש

אני לא מבין 31-10-05 08:00
 יעקב טורצקי
#2623

איפו אני שם את הסקר בדף HTML?
ואיך אני שם אותו?


לדף הקודםגלריית תמונות -הקודם
לתחילת הדףלתחילת הדף