ראיתי לאחרונה שיש עם זה בעיה בעיקר אצל המתחילים בתחום של PHP.
ראיתי את זה פה וראיתי את זה בעוד פורום שאני גולש בו.
חשבתי לעצמי למה לא להסביר את הנושא.
הכנתי במיוחד בשביל המדריך את הסקריפט המלא.
דוגמא אפשר לראות פה:
http://phpbbskins.gofreeserve.com/Demo/contact.html
הרמה של המדריך היא בין בנוני לקל.
ובכן אני ינסה להסביר את המדריך כך שכמה שיותר אנשים יבינו. אה וכן....שאלות בסוף
נתחיל כמובן מדף HTML פשוט וקל:
קוד: בחר הכל
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>טופס יצירת קשר</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="css.css" type="text/css" />
</head>
<body>
<h1>טופס יצירת קשר</h1>
<form name="theform" method="post" action="contact.php">
<table><tr>
<td>שם פרטי:</td>
<td><input type="text" name="Pname" /></td>
</tr><tr>
<td>שם משפחה:</td>
<td><input type="text" name="Lname" /></td>
</tr><tr>
<td>האימייל שלך:</td>
<td><input type="text" name="Email" /></td>
</tr><tr>
<td>כותרת ההודעה:</td>
<td><input type="text" name="Mtitle" /></td>
</tr><tr>
<td valign="top">תוכן ההודעה:</td>
<td><textarea name="Mtext"></textarea></td>
</tr><tr>
<td></td>
<td><input type="submit" value="שלח טופס" class="botton" name="Submit" />
<input type="reset" value="נקה טופס" class="botton" /></td>
</tr></table>
</form>
</body>
</html>
ניתן לראות פה עמוד HTML רגיל שכולל 4 שדות INPUT ושדה אחד של TEXTAREA...שום דבר מיוחד...
אני בא מנקודת הנחה שאתם יודעים HTML כי אחרת להתחיל להתעסק עם PHP בלי לדעת HTML בסיסי כמו זה פשוט מיותר לחלוטין.
עמוד הHTML שאני קראתי לו contact.html אחרי שליחה מעביר את הנתונים לעמוד contact.php (כמה אורגינלי מצידי )
נתחיל בקוד המלא של העמוד CONTACT.PHP
קוד: בחר הכל
<?php
header('Content-Type: text/html; charset=utf-8');
Define("MY_EMAIL", "[email protected]");
$Mess = array(
'אחד או יותר מן השדות ריקים',
'האימייל נשלח בהצלחה',
'האימייל שציינתה לא חוקי'
);
function skin($content) {
return <<<EOB
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>טופס יצירת קשר</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="css.css" type="text/css" />
</head>
<body>
<h1>טופס יצירת קשר</h1>
{$content}
<br /><br />
<a href="contact.html">חזור לעמוד הקודם</a>
</body>
</html>
EOB;
}
if(isset($_POST['Submit'])) {
$Pname = trim($_POST['Pname']);
$Lname = trim($_POST['Lname']);
$Email = trim($_POST['Email']);
$Mtitle = trim($_POST['Mtitle']);
$Mtext = trim($_POST['Mtext']);
if(($Pname == null) OR ($Lname == null) OR ($Email == null) OR ($Mtitle == null) OR ($Mtext == null)) {
$cont = $Mess[0];
} else {
if(filter_var($Email, FILTER_VALIDATE_EMAIL)) {
$header = "From: {$Pname} {$Lname} <{$Email}>\r\n";
mail(MY_EMAIL, $Mtitle, $Mtexty, $header);
$cont = $Mess[1];
} else {
$cont = $Mess[2];
}
}
echo skin($cont);
} else {
header("Location: contact.html");
}
?>
כעת נעבור שורה שורה ואני יסביר.
השורה:
קוד: בחר הכל
header('Content-Type: text/html; charset=utf-8');
למעשה מגדירה שימוש בUTF-8 (זהו קידוד אוניברסלי שמאפשר שימוש בכל השפות באותו עמוד ללא שינויי META וכו'.)
לאחר שהגדרתי את הקידוד אני מגדיר מה האימייל שלי, לאן ישלחו כל ההודעות שהמשתמשים ירצו לשלוח בעזרת השורה:
קוד: בחר הכל
Define("MY_EMAIL", "[email protected]");
חשוב לציין שמותר לערוך רק את האימייל עצמו ולא את הMY EMAIL.
לאחר מכן יצרתי מערך שמכיל את ההודעות שהסקריפט ידפיס כשצריך.
מטעמי נוחות ובגלל שאני אוהב יופי החלטתי שלא צריך הודעה משעממת ומגעיל שאומר XYZ
העדפתי ליצור "עיצוב" ושיראה טיפה יותר נחמד. לכן עשיתי פונקציה שמקבלת את התוכן של ההודעה.
הסבר יבוא בהמשך בקשר לזה.
כעת מגיעה החלק החשוב.
לאחר שהעשיתי משתנים קבועים ומערכים ופונקציות הגיעה הזמן להשתמש בהם לא כך?
אבל לפני הכל נעשה כמה בדיקות...
קודם כל נבדוק שהמשתמש לא נכנס סתם ככה לעמוד הזה בזה שהוא הקליד את הכתובת.
זאת נעשה בעזרת בדיקה אם המשתמש שלח נתונים דרך טופס.
קוד: בחר הכל
if(isset($_POST['Submit'])) {
לאחר שבדקנו והמשתמש לא מנסה לרמות בואו נקווה שהוא לא מנסה לרמות באופן שונה...
זאת נעשה ע"י הפונקציה trim...הפונקציה מוחקת רווחים מיותרים. כלומר:
אם משעמם לי עד מאוד
התוצאה תהיה
אם משעמם לי עד מאוד
זה מאפשר לנו למנוע מהמשתמש להגזים קצת וגם למקרה שהמשתמש יודע שבעוד מספר שורות נעשה בדיקה אם הINPUTים שהוא שולח ריקים הוא ישים סתם רווחים.
כלומר אם הוא הקליד רק רווחים התוצאה תהיה - ריק.
ובכן הנה הבדיקה אם כל INPUT שנשלח ריק:
קוד: בחר הכל
if(($Pname == null) OR ($Lname == null) OR ($Email == null) OR ($Mtitle == null) OR ($Mtext == null)) {
אם כן תודפס ההודעה:
אחד או יותר מן השדות ריקים
עכשיו נשאלת השאלה: אבל לא כתוב את זה! כתוב:
קוד: בחר הכל
$cont = $Mess[0];
$Mess זו למעשה המערך שעשינו זוכרים? בהתחלה עוד... ה0 מציין שאני רוצה את ההודעה מספר 0 (בPHP ובכלל ברוב שפות התכנות אם לא כולם הספירה מתחילה לא מ1 אלא מ0)
מה זה $cont ? בינתיים זה סתם משתנה שהגדרנו לו את הערך של המערך מספר 0 שהוא "אחד או יותר מן השדות ריקים"
עכשיו מה יקרה אם המשתמש הוא אחלה בנאדם ולא מנסה להספים (כמובן שהוא יכול סתם לחרטט אבל לזה אף פעם לא תהיה לנו שליטה לדעתי) צריך לבדוק שלפחות הוא יתן לנו לדבר איתו לא?
קוד: בחר הכל
if(filter_var($Email, FILTER_VALIDATE_EMAIL)) {
השורה הבעיה בודקת אם אכן האימייל שהמשתמש ציין הוא אכן אימייל חוקי, אימייל תקין...אם האימייל עובד או לא זה לא בודק אבל את התקינות של זה, זה כן.
ובסופו של דבר...הדבר שלמטרתו כל החפירה הענקית הזאת, השליחה עצמה:
קוד: בחר הכל
$header = "From: {$Pname} {$Lname} <{$Email}>\r\n";
mail(MY_EMAIL, $Mtitle, $Mtexty, $header);
להסביר על הפונקציה ממש אין לי חשק אבל למזלי עשו זאת רבים אחרים:
http://www.php.net/mail
והנה שוב מופיעה $cont = $Mess[1];
אבל עם מספר שונה ... פה אני מבקש הודעה אחרת מן המערך.
ומתחת עוד הודעה זו הודעה נוספת...
כעת תרדו למטה ותראו שם:
קוד: בחר הכל
echo skin($cont);
פה אני רוצה להציג את התוכן של הפונקציה SKIN ומזרים לפונקציה את התוכן של המשתנה CONT...למעשה המשתנה הזה נקבע כל פעם בצורה שונה בהתאם להודעה, בהתאם למצב.
למטה למטה שחכתי לציין דבר שמחזיר אותנו להתחלה...
זוכרים אם הבדיקה האם המשתמש נכנס ללא שליחת טופס?
ובכן אם הוא כן נכנס ללא שליחת טופס הוא יועבר אוטומתית לעמוד CONTACT.HTML
ובכן כמו שאמרתי שאלות בסוף.
סוף
עריכה:
הוספתי לכם גם את הסקריפט להורדה, תשתמשו בו חופשי