עבור לתוכן

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

Featured Replies

פורסם

אהלן,

יש לי קוד לשליחת דואר ב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;
}

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

נ.ב.

תעיף את כל ה-meta 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" value="<?=Email?>"><?=($errors['Email'] == 1) ? '<div class="req">Required!</div>' : '';?>
</p>

ובHEAD תרשום:


<style>
div.req {text-color: #FF0000; }
div.req:before { content: " "; }
</style>

פורסם

  <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 בסיסי.

פורסם

רק תיקון קטן (לקוד של UnsignedInteger)

  <p>Email:* <br>
<input type="text" name="Email" value="<?=$_POST['Emai']l?>"><?=($errors['Email'] == 1) ? '<div class="req">Required!</div>' : '';?>
</p>

וכך אתה לא מאבד את מה שכבר נכתב.

פורסם
  • מחבר

הקוד שלכם נותן לי את זה

[attachment deleted by admin]

פורסם

1) תשנה את הסיומת של הקובץ הזה לPHP.

2) תשנה ל

value="<?=$Email?>"

עמרי, מכיוון שבאחת ההודעות הקודמות רשמת

if (Trim($Email)=="")

הנחתי שכבר קיים משתנה כזה עם הערך המתאים.

פורסם

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

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

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

$_POST['field_name']

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

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

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

פורסם
  • מחבר

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

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

::)

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

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

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

פורסם

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

שים לב שאחרי הסוגריים המרובעים יש את ה-l החסרה, אז תדאג למחוק אותה.
פורסם
  • מחבר

עשיתי את זה כמובן..

פורסם

למה לא לעשות את זה ב-JS?

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

פורסם
  • מחבר

אפשרי, פשוט JS נחסם ע"י דברים כמו noscript אז עדיף PHP.

ארכיון

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

דיונים חדשים