הרשם שאלות ותשובות רשימת חברים לוח שנה הודעות מהיום

חזור   הוסטס - פורום אחסון האתרים הגדול בישראל > עיצוב גראפי, תכנות על כל שפותיו וקידום ושיווק אתרים > פורום תיכנות > תכנות - מדריכים, code snippets

   
|!|

סגור את ההודעה
 
כלים לאשכול תצורת הצגה
ישן 04-09-06, 20:36   # 1
WebProject
מ.תיכנות
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
מיקום: אשדוד
הודעות: 3,070
Send a message via Skype™ to WebProject

WebProject לא מחובר  

[מדריך] PHP - מערכת תגובות (*מומלץ!)

מערכת תגובות
לבקשת נריה, החלטתי לכתוב מדריך לבניית מערכת תגובות, ואסביר שלב שלב, על:
  • כתיבת טבלת נתונים
  • התחברות למסד הנתונים, ובחירת הטבלה הנכונה
  • הוצאת הנתונים מן המסד והגנה מפני תווי HTML
  • בניית טופס הוספת תגובה
  • אבטחת שליחת הנתונים, ושליחתם
על מנת לבנות מערכת זאת, נצטרך להשתמש ב: Php, Mysql,Phpmyadmin

החלק הראשון, הוא תכנון מסד הנתונים, בעצם, מה אנו רוצים להכניס ולשמור כנתונים שנוכל לשלוף ולעשות בהם שימוש בעתיד?
  • מספר אוטומטי(ID)
  • שם השולח(Author)
  • כתובת אייפי, וזמן השליחה(Ip,time_sent)
  • אימייל(email)
  • תוכן התגובה(content)
מספר אוטומטי: מספר זה הינו מספר יחודי בעת הוספת הנתונים, יעלה המספר באחד בכל פעם.

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

צעד ראשון - כתיבת הטבלה
על מנת ליצור את המערכת, עלינו להבין, שהיא מבוססת מסד נתונים, כל תגובה, תכנס אל המסד, ותשמר בו, על מנת שלאחר מכן, נוכל לשלוף את הנתונים.

נא פתחו את Phpmyadmin הנמצא על השרת, במידה ואינכם יודעים היכן הוא נמצא, שאלו את מנהל השרת שלכם, במידה ואתם עובדים על שרת ביתי, לרוב הוא נמצא ב: localhost/phpmyadmin.

בחרו במסד נתונים מן המסדים, או צרו אחד חדש, לאחר מכן, הוסיפו טבלה חדשה, בשם: comments.

כמו שציינתי לעיל, השדות הן: ID, author, title, content, IP, time_sent, email

לכל אחת מן השדות, תנו את המאפיינים:


במידה ואינכם רואים את התמונה לחצו כאן

על מנת לגרום לID להיות מספר אוטומטי שיעלה אוטומטית בכל הוספת נתונים, תנו לו את המאפיינים הבאים:



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

  • שם המסד
  • שם משתמש של המסד
  • סיסמת הטבלה
על מנת להתחבר למסד, עלינו להשתמש בשני פונקציות, mysql_connect, mysql_select_db

ברגע זה, אנו מתחילים את מערכת התגובות, כצעד ראשון נכתוב קוד HTML בסיסי (ולא תקין, אני לא מלמד פה תיקניות =]):

HTML קוד:
<html>
    <head> 
        <title>Comments</title>
    </head>
<body>
                   כאן יופיע התגובות + טופס הוספת תגובה
</body>
</html>

עכשיו, ניצור קובץ "config", שבעצם יכיל את ההתחברות למסד, לאחר מכן "נכליל" אותו, בעזרת פונקצית require.

קובץ config.php יבנה בצורה הבאה:

PHP קוד:
<?Php
      mysql_connect
('localhost','db_User','*****');
      
mysql_select_db("db_name");
?>
כאשר:
  • db_User - שם המשתמש של המסד
  • ****** - סיסמת המסד
  • db_name - שם המסד
מדוע יצרנו קובץ נפרד להתחברות? אנו נעבוד עם שני דפים, הדף הראשי המכיל את הטופס והתגובות, ודף ההוספה, יותר יעיל לכתוב פעם אחת את ההתחברות, מאשר מספר פעמים.

את הקוד הבא:

PHP קוד:
<?Php
   
require "config.php";
?>
שבעצם מכליל את קוד ההתחברות, נכניס בראש הדף הראשון.

שלב שלישי - הוצאת התגובות והגנה מפני תגי HTML

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

בשלב זה נשתמש במספר פונקציות, ומבני בקרה: mysql_query, mysql_num_rows, mysql_fetch_array, while, if וכמובן, נעבוד עם מערכים.

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

נתחיל עם השאילתה, השאילתה אמורה להיות מורכבת משליפה (SELECT), בחירת הטבלה (FROM), וכמובן השדות (FILEDS) שבמקרה שלנו, הינם כולם (*).

נשתמש בפונקציה mysql_query שנועדה לבצע פקודות Mysql

PHP קוד:
$select_comments mysql_query("SELECT * FROM `comments`"); 
פה בעצם שלפנו את כל התגובות שקיימות בטבלה שלנו.

אבל מה עם אין לנו תגובות במסד? פשוט מאוד, נוכל לבנות תנאי, "שישאל" אם קיימות תגובות במסד.

כאן נשתמש בפונקציה mysql_num_rows שנועדה למספר תוצאות, ובמבנה הבקרה if שנועדה לתנאים.

PHP קוד:
$select_comments mysql_query("SELECT * FROM `comments`");
    if(@
mysql_num_rows($select_comments) == 0){
       echo 
'לא נמצאו תגובות במסד הנתונים';
    } 
לאחר שכתבנו זאת, עלינו ליצור לולאה, שבמידה וישנן תגובות, היא תעבור על התגובות, ותדפיסן.

כאן נשתמש בפונקציה mysql_fetch_array שתוציא לנו מערך של התוצאות, ובמבנה הבקרה while.
PHP קוד:
$select_comments mysql_query("SELECT * FROM `comments`");
    if(@
mysql_num_rows($select_comments) == 0){
       echo 
'לא נמצאו תגובות במסד הנתונים';

}else {
     while(
$row mysql_fetch_array($select_comments)){
         echo 
'
                <table>
                     <tr>
                              <td>
                               שולח ההודעה:  '
.$row['author'].'
                              </td>
                     </tr>
                     <tr>
                              <td>
כותרת ההודעה: '
.$row['title'].'
                              </td>
                     </tr>
                     <tr>
                              <td>
תוכן ההודעה:  '
.$row['content'].'
                              </td>
                     </tr>
                </table>
         '
;
     }

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

אבל כאן אנו נתקעים בבעיה..: מה עם מישהו ירצה לגרום בעיות, ויכניס תגובה בעלת תוכן HTML או JS? בעצם הוא יכול לגרום לדף בעיות, מה שאנו לא רוצים, לכן אני יכול להיעזר בפונקציה: htmlspecialchars פונקציה זאת הופכת תגי HTML לתגי חסרי משמעות בדפדפן.

הקוד החדש יראה כך:

PHP קוד:
$select_comments mysql_query("SELECT * FROM `comments`");
    if(@
mysql_num_rows($select_comments) == 0){
       echo 
'לא נמצאו תגובות במסד הנתונים';
  }else {
     while(
$row mysql_fetch_array($select_comments)){
    
$author htmlspecialchars($row['author']);
    
$title htmlspecialchars($row['title']);
    
$content htmlspecialchars($row['content']);
         echo 
'
                <table>
                     <tr>
                              <td>
                               שולח ההודעה:  '
.$author.'
                              </td>
                     </tr>
                     <tr>
                              <td>
כותרת ההודעה: '
.$title.'
                              </td>
                     </tr>
                     <tr>
                              <td>
תוכן ההודעה:  '
.$content.'
                              </td>
                     </tr>
                </table>
         '
;
     }

הקוד הסופי באתר, יהיה:
PHP קוד:
<?Php
   
require "config.php";
?>
<html>
    <head> 
        <title>Comments</title>
    </head>
<body>

<?Php
$select_comments 
mysql_query("SELECT * FROM `comments`");
    if(@
mysql_num_rows($select_comments) == 0){
       echo 
'לא נמצאו תגובות במסד הנתונים';
  }else {
     while(
$row mysql_fetch_array($select_comments)){
    
$author htmlspeichalchars($row['author']);
    
$title htmlspecialchars($row['title']);
    
$content htmlspecialchars($row['content']);
         echo 
'
                <table>
                     <tr>
                              <td>
                               שולח ההודעה:  '
.$author.'
                              </td>
                     </tr>
                     <tr>
                              <td>
כותרת ההודעה: '
.$title.'
                              </td>
                     </tr>
                     <tr>
                              <td>
תוכן ההודעה:  '
.$content.'
                              </td>
                     </tr>
                </table>
         '
;
     }
}
?>


</body>
</html>
שלב ארבע - בניית טופס "הוספת תגובה"

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

הטופס יראה בצורה הבאה:


PHP קוד:
<form action="send.php" method="post">
   <
table>
        <
tr>
             <
td>&#1513;מך המלא:</td>
             
<td><input type="text" name="author" /></td>
        </
tr>
        <
tr>
              <
td>&#1499;ותרת התגובה:</td>
              
<td><input type="text" name="title" /></td>
         </
tr>
        <
tr>
              <
td>&#1488;ימייל:</td>
              
<td><input type="text" name="email" /></td>
         </
tr>
        <
tr>
        <
tr>
               <
td>&#1514;וכן התגובה:</td>
               
<td><textarea name="content" cols="40" rows="10"></textarea></td>
          </
tr>
        <
tr>
               <
td><input type="submit" value="שלח" /></td>
          </
tr>
   </
table>
</
form
קוד זה הינו קוד HTML פשוט, בעצם פה שמנו טופס, שיפנה את הנתונים כנתוני POST (טופס), בעל ארבעה תיבות טקסט: שם, כותרת, אימייל, והתגובה.
הaction הוא בעצם מוביל את הנתונים, אל הדף שבחרנו (send.php), לדף זה נגיע בנושא החמישי.

לאחר כל העבודה, הגענו אל הסוף, הנושא החמישי.

שלב חמישי - אבטחת הנתונים ושליחתם
אוקיי חבר'ה, הגענו לשלב האחרון, זה בעצם החלק החשוב, עד עכשיו, הגענו אל הקוד:
PHP קוד:
<?Php
    
require "config.php";
 
?>
<html>
    <head> 
        <title>Comments</title>
    </head>
<body>

  <?Php
$select_comments 
mysql_query("SELECT * FROM `comments`");
    if(@
mysql_num_rows($select_comments) == 0){
       echo 
'לא נמצאו תגובות במסד הנתונים';
  }else {
     while(
$row mysql_fetch_array($select_comments)){
    
$author htmlspeichalchars($row['author']);
    
$title htmlspecialchars($row['title']);
    
$content htmlspecialchars($row['content']);
         echo 
'
                <table>
                     <tr>
                              <td>
                               שולח ההודעה:  '
.$author.'
                              </td>
                     </tr>
                     <tr>
                              <td>
כותרת ההודעה: '
.$title.'
                              </td>
                     </tr>
                     <tr>
                              <td>
תוכן ההודעה:  '
.$content.'
                              </td>
                     </tr>
                </table>
         '
;
     }
}
?>

<center><h2>תגובות</h2></center> <br />
<form action="send.php" method="post">
   <table>
        <tr>
              <td>שמך המלא:</td>
              <td><input type="text" name="author" /></td>
         </tr>
        <tr>
               <td>כותרת התגובה:</td>
               <td><input type="text" name="title" /></td>
          </tr>
        <tr>
               <td>אימייל:</td>
               <td><input type="text" name="email" /></td>
          </tr>
        <tr>
        <tr>
               <td>תוכן התגובה:</td>
               <td><textarea name="content" cols="40" rows="10"></textarea></td>
          </tr>
        <tr>
               <td><input type="submit" value="שלח" /></td>
          </tr>
   </table>
</form> 

</body>
</html>
החלק האחרון בקוד האתר, הינו הדף send.php הדף הזה מכיל את שליחת הנתונים ולאחר מכן מעבר חזרה אל דף התגובות אוטומטית, כאן נלמד לאבטח את המידע שאנו שולחים.

בחלק הראשון, נעשה מספר בדיקות בעזרת התנאי if, בינהם: האם האייפי של הגולש נמצא במסד, ואם כן, האם עברו 30 שניות מאז התגובה האחרונה שלו? והאם השדות מלאים? או שהגולש השאיר מספר שדות ריקים?

מתחילים: נתחיל עם בדיקת השדות, האם הם מולאו? נעזר במערך POST, בו קיבלנו מידע מן הטופס, במבנה הבקרה if, ובפונקציה empty שבודקת האם ערך כלשהו הינו ריק.

PHP קוד:
if(empty($_POST['author']) || empty($_POST['title']) || empty($_POST['email']) || empty($_POST['content'])){
    echo 
'נא מלא את כל השדות!';

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

כאן נשתמש בפונקציות: mysql_query, time, mysql_num_rows.

time - זמן לינוקס, שניות שעברו מאז ינואר 1970.

PHP קוד:
if(empty($_POST['author']) || empty($_POST['title']) || empty($_POST['email']) || empty($_POST['content'])){
    echo 
'נא מלא את כל השדות!';
  }else {
     
$IP $_SERVER['REMOTE_ADDR'];
      
$check mysql_query("SELECT * FROM comments WHERE IP = '$IP' AND ".time()." - time_sent > '30'");
          if(
mysql_num_rows($check) > 0){
                 echo 
'נא חכה שיעברו 30 שניות בין תגובה לתגובה';
           }

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

".time()." - time > 30

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

במידה ותנאי זה אינו מתקיים גם הוא, הגיע זמן להכנסת הנתונים למסד..

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

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

הקוד יראה בצורה הבאה:

PHP קוד:
$author mysql_real_escape_string($_POST['author']);
$title mysql_real_escape_string($_POST['title']);
$email mysql_real_escape_string($_POST['email']);
$content mysql_real_escape_string($_POST['content']); 
כאן הגנו על המידע אשר הגיע מן המשתמש, מן הטופס.

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

PHP קוד:
$ip $_SERVER['REMOTE_ADDR'];
$time_sent time(); 
יאללה חברה, הגענו לשני הקטעים האחרונים במדריך, ובמערכת, שליחת הנתונים למסד, והפניית הדפדפן חזרה לדף התגובות.

כל מה שעלינו לעשות, לאחר הצבת המשתנים, והגנה על המידע, היא שאילתה פשוטה:

PHP קוד:
mysql_query("INSERT INTO `comments` (author,title,content,email,time_sent,ip) VALUES ('$author','$title','$content','$email','$time_sent','$ip')"); 
פשוט וקל

והחלק האחרון במדריך, הוא הפניית הדפדפן חזרה אל דף התגובות, בפשטות, ע"י הפונקציה header:

PHP קוד:
header("location: index.php"); 
הערה!: שימוש בפונקציות header לאחר פלט HTML יפלוט שגיאה ולכן אנו מציבים בראש הדף את הפונקציה ob_start שמעכבת את פלט הHTML ומעבדת אותו רק לאחר עיבוד קוד הPHP.

לבסוף, קוד העמוד כולו הינו:
PHP קוד:
<?Php
ob_start
();
require 
"config.php";
if(empty(
$_POST['author']) || empty($_POST['title']) || empty($_POST['email']) || empty($_POST['content'])){
    echo 
'נא מלא את כל השדות!';
  }else {
     
$IP $_SERVER['REMOTE_ADDR'];
      
$check mysql_query("SELECT * FROM comments WHERE IP = '$IP' AND ".time()." - time_sent > '30'");
          if(
mysql_num_rows($check) > 0){
                 echo 
'נא חכה שיעברו 30 שניות בין תגובה לתגובה';
           }
  else {
      
$author mysql_real_escape_string($_POST['author']);
     
$title mysql_real_escape_string($_POST['title']);
     
$email mysql_real_escape_string($_POST['email']);
     
$content mysql_real_escape_string($_POST['content']); 

     
$ip $_SERVER['REMOTE_ADDR'];
     
$time_sent time();

mysql_query("INSERT INTO `comments` (author,title,content,email,time_sent,ip) VALUES ('$author','$title','$content','$email','$time_sent','$ip')");
      
header("location: index.php");

}
?>
נכתב באהבה לכל השמנים בעולם (או לפחות בפורום :P)

תהנו לכם, אני השקעתי הרבה זמן בכתיבת המדריך =]

אני חייב לציין שעוד לא בדקתי, אם יש שגיאות, תודיעו לי, ואסדר


תהנו =]

Last edited by WebProject; 04-09-06 at 21:15..
 
ישן 04-09-06, 20:40   # 2
Gal Shafrir
חבר וותיק
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
הודעות: 1,626

Gal Shafrir לא מחובר  

ואו טל המדריך הכי מושקע פה בפורום =] כל הכבוד, תמשיך להביא לנו מדריכים טובים.

מדריך מושקע מאוד, עוזר למתחילים כמוני :|, מפורט, עם תמונות וכמו שצריך.

אני אנסה עוד כמה דקות להפעיל את המערכת בעצמי =]
__________________
בברכה,
גל שפריר - מעצב ומפתח אתרים.

עופר שפריר - במאי, תסריטאי ומפיק.
 
ישן 04-09-06, 20:44   # 3
WebProject
מ.תיכנות
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
מיקום: אשדוד
הודעות: 3,070
Send a message via Skype™ to WebProject

WebProject לא מחובר  

תודה =]

אני חייב לציין... אחרי כתיבה של שעתיים רצופות, האצבעות שלי כבר מדממות :P
 
ישן 04-09-06, 20:45   # 4
FANATICS
חבר וותיק
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
מיקום: שער 11
הודעות: 1,054

FANATICS לא מחובר  

טל . מישהו פעם אמר לך שאתה תותח אש ? [אולי פבל ]
אז עכשיו גם אני
__________________
מסנג'ר:bestman3@walla.co.il
 
ישן 04-09-06, 20:46   # 5
WebProject
מ.תיכנות
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
מיקום: אשדוד
הודעות: 3,070
Send a message via Skype™ to WebProject

WebProject לא מחובר  

תודה לך דור
 
ישן 04-09-06, 20:47   # 6
mlnn
משתמש - היכל התהילה
 
mlnn's Avatar
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
מיקום: בחדר של חני
גיל: 34
הודעות: 4,417

mlnn לא מחובר  

פשש, לא קראתי הכל, אבל קבל חח =]
__________________
.

בחורות ערומות
 
ישן 04-09-06, 20:50   # 7
Elad-A
הוסטסניון
 
מיני פרופיל
תאריך הצטרפות: May 2006
הודעות: 1,987

Elad-A לא מחובר  

תודה רבה על ההשקעה.
 
ישן 04-09-06, 21:01   # 8
Rom
Winner
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
הודעות: 1,359

Rom לא מחובר  

יפה אחי
מצאתי בעיה קטנה
בהצגת התגובות עשית שתיהיה טבלה חדשה לכל תגובה
לדעתי כדאי שתיהיה טבלה אחת לכל התגובות
__________________
בברכה, רום.
מתכנת אפליקציות אינטרנט.

אימייל: Rom.As10@gmail.com
מסנג'ר: Rom_as10@hotmail.com
 
ישן 04-09-06, 21:07   # 9
Tal
משתמש - היכל התהילה
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
מיקום: Israel
הודעות: 2,785

Tal לא מחובר  

מדהים טל... תודה רבה
__________________
בברכה, טל
 
ישן 04-09-06, 21:08   # 10
WebProject
מ.תיכנות
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
מיקום: אשדוד
הודעות: 3,070
Send a message via Skype™ to WebProject

WebProject לא מחובר  

ציטוט:
נכתב במקור על ידי DragonRom
יפה אחי
מצאתי בעיה קטנה
בהצגת התגובות עשית שתיהיה טבלה חדשה לכל תגובה
לדעתי כדאי שתיהיה טבלה אחת לכל התגובות
לא :| עשיתי טבלה אחת לכל התגובות ... אל תדבר אם אתה לא מבין על מה אתה מדבר.
 
סגור את ההודעה

חברים פעילים הצופים באשכול זה: 1 (0 חברים ו- 1 אורחים)
 

Tags
מדריך למתקדמים, מדריך מומלץ, מדריך php, מדריך sql


חוקי פירסום
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is מופעל
סמיילים הם מופעל
[IMG] קוד מופעל
קוד HTML מכובה

קפיצה לפורום


כל הזמנים הם GMT +2. הזמן כעת הוא 18:21.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ