צריך עזרה עם form validation בPHP - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

צריך עזרה עם form validation בPHP


LazyBoy

Recommended Posts

אהלן,

יש לי קוד לשליחת דואר בPHP.

כרגע הקוד בודק האם הוזנו כל שדות החובה ואם לא הוא מעביר לעמוד ERROR כללי.

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

contact.php

<?php

// get posted data into local variables
$Email = Trim(stripslashes($_POST['Email']));
$EmailTo = "EMAIL@SERVER.COM";
$Subject = "AOS contact form";
$FirstName = Trim(stripslashes($_POST['FirstName']));
$LastName = Trim(stripslashes($_POST['LastName']));
$Company = Trim(stripslashes($_POST['Company']));
$Street = Trim(stripslashes($_POST['Street']));
$City = Trim(stripslashes($_POST['City']));
$State = Trim(stripslashes($_POST['State']));
$Zip = Trim(stripslashes($_POST['Zip']));
$Tel = Trim(stripslashes($_POST['Tel']));
$Website = Trim(stripslashes($_POST['Website']));
$Questions = Trim(stripslashes($_POST['Questions']));

// validation
$validationOK=true;
if (Trim($Email)=="") $validationOK=false;
if (Trim($FirstName)=="") $validationOK=false;
if (Trim($LastName)=="") $validationOK=false;
if (Trim($Company)=="") $validationOK=false;
if (Trim($Street)=="") $validationOK=false;
if (Trim($City)=="") $validationOK=false;
if (Trim($State)=="") $validationOK=false;
if (Trim($Zip)=="") $validationOK=false;
if (!is_numeric($Zip)) $validationOK=false;
if (Trim($Tel)=="") $validationOK=false;
if (!is_numeric($Tel)) $validationOK=false;
if (!$validationOK) {
print "<meta http-equiv=\"refresh\" content=\"0;URL=error.htm\">";
exit;
}

// prepare email body text
$Body = "";
$Body .= "FirstName: ";
$Body .= $FirstName;
$Body .= "\n";
$Body .= "LastName: ";
$Body .= $LastName;
$Body .= "\n";
$Body .= "Company: ";
$Body .= $Company;
$Body .= "\n";
$Body .= "Street: ";
$Body .= $Street;
$Body .= "\n";
$Body .= "City: ";
$Body .= $City;
$Body .= "\n";
$Body .= "State: ";
$Body .= $State;
$Body .= "\n";
$Body .= "Zip: ";
$Body .= $Zip;
$Body .= "\n";
$Body .= "Tel: ";
$Body .= $Tel;
$Body .= "\n";
$Body .= "Website: ";
$Body .= $Website;
$Body .= "\n";
$Body .= "Questions: ";
$Body .= $Questions;
$Body .= "\n";

// send email
$success = mail($EmailTo, $Subject, $Body, "From: <$Email>");

// redirect to success page
if ($success){
print "<meta http-equiv=\"refresh\" content=\"0;URL=ok.htm\">";
}
else{
print "<meta http-equiv=\"refresh\" content=\"0;URL=error.htm\">";
}
?>

contact.htm

<form method="POST" action="contact.php">
<blockquote>
<p> Fields marked (*) are required </p>
<p>Email:* <br>
<input type="text" name="Email">
</p>
<p>FirstName:* <br>
<input type="text" name="FirstName">
</p>
<p>LastName:* <br>
<input type="text" name="LastName">
</p>
<p>Company:* <br>
<input type="text" name="Company">
</p>
<p>Street:* <br>
<input type="text" name="Street">
</p>
<p>City:* <br>
<input type="text" name="City">
</p>
<p>State:* <br>
<input type="text" name="State">
</p>
<p>Zip:* <br>
<input type="text" name="Zip">
</p>
<p>Tel:* <br>
<input type="text" name="Tel">
</p>
<p>Website:<br>
<input type="text" name="Website">
</p>
<p>Questions:<br>
<textarea name="Questions" cols='45' rows='10'></textarea>
</p>
<p>
<input type="submit" name="submit" value="Submit">
</p>
</blockquote>
</form>

תודה.

קישור לתוכן
שתף באתרים אחרים

אפשר לגשת לזה בהרבה דרכים..

הדרך שנראית לי הכי מומלצת היא ליצור מערך בשם $errors ולהכניס אליו flag של 1 על כל תא עם שגיאה, בצורה הזאת:

$errors['field_name'] = 1

חלק מהקוד לדוגמה:

// validation
$validationOK=true;
if (Trim($Email)=="") { $validationOK=false; $errors['Email'] = 1; }
if (Trim($FirstName)=="") { $validationOK=false; $errors['FirstName'] = 1; }

השלב הבא הוא לשנות את contact.htm ככה שידע לקרוא את $errors:

לדוגמה:

  <p>Email:* <br>
<input type="text" name="Email"><?=($errors['Email'] == 1) ? ' Required!' : '';?>
</p>
<p>FirstName:* <br>
<input type="text" name="FirstName"><?=($errors['FirstName'] == 1) ? ' Required!' : '';?>
</p>

ובסופו של דבר, לשנות את:

if (!$validationOK) {
print "<meta http-equiv=\"refresh\" content=\"0;URL=error.htm\">";
exit;
}

בזה:

if (!$validationOK) {
include 'contact.htm';
exit;
}

זה כמובן מאוד בגדול.. אבל אני מקווה שנתתי לך כיוון :)

נ.ב.

תעיף את כל ה- redirects האלה, אתה ב-PHP ואתה יכול לשנות את ה-header ישירות..

במקום:

print "<meta http-equiv=\"refresh\" content=\"0;URL=ok.htm\">";

תעשה:

header("Location: ok.htm");

קישור לתוכן
שתף באתרים אחרים

אתה יכל גם בעזרת Iframe חבוי או ajax (אין שנוח לך ובהתאם לידע שלך) לבצע את הקוד שבודק ולצבוע את התיבה עצמה

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

קישור לתוכן
שתף באתרים אחרים

קודם כל, תודה.

החלק הזה

header("Location: ok.htm");

מחזיר לי ERROR

למה? והאם אפשר להשאיר את מה שהיה מקודם?

איך גורמים לזה:

  <p>Email:* <br>
<input type="text" name="Email"><?=($errors['Email'] == 1) ? ' Required!' : '';?>
</p>

לרשום את Required! באדום?

והכי חשוב, אם לא מילאו את כל השדות הוא רושם Required אבל מעלים את כל המידע שהוכנס כבר לשאר השדות :s05:

קישור לתוכן
שתף באתרים אחרים

  <p>Email:* <br>
<input type="text" name="Email"><?=($errors['Email'] == 1) ? '<span style=\"color:red\"> Required!</span>' : '';?>
</p>

זה שהוא מעלים לך את המידע זה כי אתה עושה ריפרש/מפנה אותו חזרה בלי שאתה מקבל את הערכים ומציב אותם חזרה בתיבות.

בכל מקה, אתה יכל ליצור Iframe בשם hdn_iframe לדוגמא וב form של הטפוס לתת לו target=hdn_iframe כך שהוא יבצע את הכל שם.

בקובץ שעושה את הבדיקה אתה רושם משהו בסגנון הזה:

<?php
$first_name = trim(stripslashes($_POST["txt_first_name"]));

if (empty($first_name)) {
echo "<script>\n";
echo " var txt_fname = parent.document.getElementById('txt_first_name');\n";
echo " txt_fname.style.backgroundColor = 'red';\n";
echo "</script>\n";
exit;
}

?>

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

כך אתה לא מאבד שום מידע מהטופס.

ניתן לעשות אותו הדבר עם ajax אבל זה קצת יותר מסובל וצריך לדעת ajax בסיסי.

קישור לתוכן
שתף באתרים אחרים

לא, זה חלק שסתם עשיתי פה copy&paste מהקוד שלו.. :)

בגדול זה יעבוד, הוא פשוט בונה על זה שיהיה בשרת global_register = ON, שזה משהו שעדיף לא לעשות..

הוא הרי לוקח את זה מהמערך של ה-POST מה-FORM, כל המשתנים הם:

$_POST['field_name']

בקשר ל-1, האמת שחשבתי שזה לא יעשה בעיות בגלל הקטע של ה-include (אתה הרי גם יכול לעשות include לקובץ txt..), חשבתי ש"קובץ האם" יפענח כבר את השורות PHP.. טוב נו.. אז תשנה את שם הקובץ למשהו אחר עם סיומת php...

לייזי, הקוד מהתמונה שלך הוא עם השורה ש-UnsignedInteger כתב, שהיא שגויה.. הוא שכח להוסיף את הסימן $ לפני שם המשתנה.

שים לב להודעה הקודמת שלי עם התיקון..

קישור לתוכן
שתף באתרים אחרים

אתה מתכוון לתיקון הזה:

<?=$_POST['Emai']l?>

::)

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

בקיצור מה אתם מבלבלים על זה שאני סומך על הגדרות שרת וכאלה, עוד לא הבנתם שאני לא יודע PHP בכלל?

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...