סקר
תוכנית זו מנהלת סקרים. היא מציגה שאלות סקרים מתוך בסיס נתונים, והמשתמש יכול לבחור שאלת סקר ולענות עליה. כל משתמש יכול לענות פעם אחת בלבד על כל שאלת סקר, והוא מזוהה עפ"י ה-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.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
) להתחברות לאדמינסטרטור של הסקר.
תחת תת-נושא זה נסביר כיצד פועל הסקר: הצגת שאלות הסקר, הצגת הסטטיסטיקות, הוספת הצבעה, הצבעה שניה ועוד.
בתחילה אנו מייבאים את הקובץ poll_func.inc כדי להשתמש בפונקציות. לאחר מכן אנו מתחברים לשרת ה-MySQL באמצעות הפונקציה ConnectPoll()
. בוחרים מתוך הטבלה polls
את כל שאלות הסקר. ואז בלולאה אנו עוברים שורה-שורה מתוך התוצאה של השאילתא, ומדפיסים לדפדפן (ברשימה) כל שאלת סקר ביחד עם קישור לדף poll_vote.php שמציג את השאלה ומטפל בהצבעה. בצמוד אנו מדפיסים קישור לפתיחת חלון חדש שבו תיראה הסטטיסטיקה של השאלה. ובסוף אנו מדפיסים בסוגריים את מספר ההצבעות לכל שאלת סקר עם שימוש בפונקציות GetNumberVotes(GetAlternatives($arr['id']))
.
קובץ זה מכיל פונקציות שאנו משתמשים בהם באופן תדיר בתוכנית. הקובץ מייבא את 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
.
הקובץ מכיל פונקציה אחת, 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(). אם לא ארעה אף שגיאה, אז הטבלאות עודכנו וההצבעה התקבלה, ובמקרה כזה נחזיר ערך אמת.
קובץ זה אחראי להציג את שאלת הסקר, ולטפל בהצבעה של המשתמש. לקובץ זה נשלח תמיד מספר הזיהוי של שאלת הסקר שצריך להציג במשתנה $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
. אם ערכו שקר, מדפיסים הודעת שגיאה שההצבעה לא התקבלה. אם ערכו אמת, מדפיסים הודעה שההצבעה התקבלה ונשמרה. ואם ערכו הוא ערך מספרי, מדפיסים כי המשתמש כבר הצביע לשאלת סקר זו בעבר, וכי לא יוכל להצביע פעם נוספת. בסוף הדף אנו שמים קישור לדף הראשי של הסקר, כדי לבחור שאלה חדשה.
קובץ זה מציג את הסטטיסטיקות של שאלות הסקר עפ"י דיאגרמת מקלות. אם מספר הזיהוי של שאלת הסקר לא מצויין (אם המשתנה $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']
). סוגרים את השורה, ובסוף הלולאה סוגרים את כל הטבלה, וכך יצרנו את דיאגרמת המקלות עם קצת מתמטיקה פשוטה.
תחת תת-נושא זה נסביר כיצד פועל האדמינסטרטור של הסקר: הוספת שאלות, מחיקת שאלות, בעיות אבטחה ועוד.
קובץ זה מנהל את הסקר, הוא מציג את שאלות הסקר הקיימות בבסיס הנתונים עם אופציות למחוק אותן, ונותן אפשרות להוסיף שאלת סקר חדשה עם מספר שונה של אפשרויות. בתחילה אנו מתחילים 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.
קובץ זה מתחבר לאדמינסטרטור באמצעות שם משתמש וססמא. נתחיל קודם עם קוד ה-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
מדפיסים בתחילת הדף לפני הטופס לקליטת שם המשתמש והססמא.
קובץ זה אחראי לבצע את כל פעולות האדמינסטרטור. מתחילים את ה-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?
ואיך אני שם אותו? |
|
ספריית poll_admin | 09-12-21 06:01 לירון בן-דרור | #2913 |
| שלום רב, אני מאחסן את הקבצים באתר my-php.net
העלתי את קבצי הסקריפט לאתר. אחרי הרבה הגדרות הצלחתי להגדיר את קובץ ה SQL באתר אחסון.
העמוד הראשון poll.php נפתח בהצלחה ומציג את 2 השאלות מטבלת polls .
אבל אם רוצה לגשת לדף אדמין. מקבל שגיאה 500.
ניסיתי לעבור על הדף poll_admin_login.php והכל בסדר אבל עדיין לא מקבל שוב תשובה.
אשמח לעזרה.
http://lbendror.my-php.net/poll/poll.php |
|