Jump to content

displaying form and validation errors


runnerjp

Recommended Posts

current i have my form

 

<?php
require_once '../settings.php';
checkLogin('1 2');
include "../info.php"; // sets username/id ect
include "../getuser.php"; // records user view on page
$getuser = mysql_fetch_assoc(mysql_query("SELECT * from users where Username='$username'"));
$getuserprofile = mysql_fetch_assoc(mysql_query("SELECT * from profile where ID='" .
			$getuser['ID'] . "'")); ?>
            
            

<table width="100%" cellspacing="0" cellpadding="0">
   <tr>
     <td width="10%"> </td>
     <td width="42%"><ul id="countrytabs" class="shadetabs">
      <li><a href="#" rel="#default" class="selected">About me</a></li>
      <li><a href="include/profiletab/edit1.htm" rel="countrycontainer">Hobbies</a></li>
      <li><a href="include/profiletab/edit2.htm" rel="countrycontainer">Goals</a></li>
      <li><a href="include/profiletab/edit3.htm" rel="#iframe">Films and Books</a> </li>
    </ul>
    
      <div id="countrydivcontainer" style="border:1px solid gray; width:800px; margin-bottom: 1em; padding: 10px">
      
       <?
foreach ($_POST as $field => $value)
{
			if (!$value)
			{
							$err .= "$field cannot be empty. <br>";
							$warnings[$field] = "required";
			}
}

if (!$_POST["firstname"] || !preg_match("/^[a-zA-Z]+$/", $_POST["firstname"]))
{
			$warnings["firstname"] = " <label for=\"uname\" class=\"error\"><em>*</em>First name can only contain letters</label>";
}
if (!$_POST["lastname"] || !preg_match("/^[a-zA-Z]+$/", $_POST["firstname"]))
{
			$warnings["lastname"] = " <label for=\"uname\" class=\"error\"><em>*</em>Last name can only contain letters</label>";

}

if ($err)
{ ?>
      <div class="errors">
	<p align="center"><em>Oops... the following errors were encountered:</em></p>

	<div align="center">
	  <ul>
	    <?php echo $err; ?>
      </ul>
    </div>
	<p align="center">Data has <strong>not</strong> been saved.</p>
</div>
      <p>
        <?
			if (count($warnings) > 0)
			{


?>
      <fieldset>
	<legend>User Details</legend>	 
      <form id="FormName" action='<?php "$_SERVER[php_SELF]" ?>' method="post" name="basic">
        <label>
        <table width="75%" align="left" cellpadding="0" cellspacing="0">
          <tr>
            <td height="30"width="28%"><div align="right">FirstName:</div></td>
            <td width="2%"> </td>
            <td width="70%"><input name="firstname" id="firstname" <? if ($warnings['firstname'])
											echo "class=\"inputerror\""; ?> value="<?php echo
$getuserprofile['first_name'] ?>"  />
              <?php echo $warnings["firstname"]; ?> </td>
          </tr>
          <tr>
            <td height="30"><div align="right">Last Name: </div></td>
            <td><label></label></td>
            <td><input type="text" name="lastname" id="lastname" <? if ($warnings['lastname'])
											echo "class=\"inputerror\""; ?> value="<?php echo
$getuserprofile['last_name'] ?>" />
            <?php echo $warnings["lastname"]; ?>
            </td>
          </tr>
          <tr>
            <td height="30"><div align="right">Birthday :</div></td>
            <td> </td>
            <td><?php
							// include the class
							require "datepicker/class.datepicker.php";
							// instantiate the object
							$dp = new datepicker();
?>
(dd-mm-yyyy)
  <input id="date" value="<?php echo $getuserprofile['dob'] ?>" />
  <input type="button" value="..." onclick="<?= $dp->show("date") ?>" /></td>
          </tr>
          <tr>
            <td height="30"><div align="right">Gender : </div></td>
            <td> </td>
            <td><select  id="gender" name="gender">
              <option value="Male" >Male</option>
              <option value="Female"  >Female</option>
            </select></td>
          </tr>
          <tr>
            <td height="30"><div align="right">club :</div></td>
            <td> </td>
            <td><?php $lines = file('runningclubs.txt');
							echo '<select id="club" name="club">';
							foreach ($lines as $line)
							{
											if ($pclub == trim($line))
											{
															echo '<option value="' . $line . '" selected="selected">' . $line . '</option>';
											}
											else
											{
															echo '<option value="' . $line . '">' . $line . '</option>';
											}
							}
							echo "</select>";
			}
}
?>
              <input type="hidden" name="id" value="<?php echo $id ?>" /></td>
          </tr>
          <tr>
            <td colspan="3"><div align="center">
              <input  type="submit" class="submit-btn" value="" />
            </div></td>
          </tr>
        </table>
      </form>      
      </fieldset>  
      
      </div>
      </td>
     <td width="10%"> </td>
   </tr>
</table>
<script type="text/javascript">
var countries=new ddajaxtabs("countrytabs", "countrydivcontainer")
countries.setpersist(true)
countries.setselectedClassTarget("link") //"link" or "linkparent"
countries.init()
  </script>

 

these have validation errors all ready written... the poblem is that the form on shows if there are any validation errors in it due to this

 

 <?
			if (count($warnings) > 0)
			{


?>

 

how could i show the form and the warnings in i bit of script.... or would i also have to add an else statement and add the form without the error part??

 

im sure this could be done as just 1 form without the else statement but im unusre how....

Link to comment
https://forums.phpfreaks.com/topic/142992-displaying-form-and-validation-errors/
Share on other sites

ok i have dine something like this

 

<?php            $count  = count($warnings);
if($count === 0)
{

if ($_POST['submit']{

$club = mysql_real_escape_string($_POST['club']);
$first_name = mysql_real_escape_string($_POST['firstname']);
$last_name =  mysql_real_escape_string($_POST['lastname']);
$gender =  mysql_real_escape_string($_POST['gender']);
$birthyear =  mysql_real_escape_string($_POST['date']);
$update = "UPDATE profile SET dob='$dob', club= '$club', first_name = '$first_name', gender = '$gender', last_name = '$last_name' WHERE id='$id' ";
$result = mysql_query($update);

// Check result
// This shows the actual query sent to MySQL, and the error. Useful for debugging.
if (!$result) {
    $er  = 'Invalid query: ' . mysql_error() . "\n";
    $er .= 'Whole query: ' . $query;
    die($er);
       }}
  echo '			<p class="error">' . $message . '</p>' . "\n";
}
}

}
            if ($err){?>

 

i get synthax error here though if ($_POST['submit']{

 

$club = mysql_real_escape_string($_POST['club']);  :S

ok you mean liek this

 

<link rel="stylesheet" type="text/css" href="http://www.runningprofiles.com/css/login.css">
<link rel="stylesheet" type="text/css" href="include/profiletab/ajaxtabs/ajaxtabs.css">
<script type="text/javascript" src="include/profiletab/ajaxtabs/ajaxtabs.js"></script>

<?php
require_once '../settings.php';
checkLogin('1 2');
include "../info.php"; // sets username/id ect
include "../getuser.php"; // records user view on page
$getuser = mysql_fetch_assoc(mysql_query("SELECT * from users where Username='$username'"));
$getuserprofile = mysql_fetch_assoc(mysql_query("SELECT * from profile where ID='" .
            $getuser['ID'] . "'")); ?>
            
            

<table width="100%" cellspacing="0" cellpadding="0">
   <tr>
     <td width="10%"> </td>
     <td width="42%"><ul id="countrytabs" class="shadetabs">
      <li><a href="#" rel="#default" class="selected">About me</a></li>
      <li><a href="include/profiletab/edit1.htm" rel="countrycontainer">Hobbies</a></li>
      <li><a href="include/profiletab/edit2.htm" rel="countrycontainer">Goals</a></li>
      <li><a href="include/profiletab/edit3.htm" rel="#iframe">Films and Books</a> </li>
    </ul>
    
      <div id="countrydivcontainer" style="border:1px solid gray; width:800px; margin-bottom: 1em; padding: 10px">
      
       <?         
         foreach($_POST as $field => $value) {
   if (!$value) {
      $err .= "$field cannot be empty. <br>";
      $warnings[$field] ="required";
   }
}

if (!$_POST["firstname"] || !preg_match("/^[a-zA-Z]+$/", $_POST["firstname"])) {
   $warnings["firstname"] = " <label for=\"uname\" class=\"error\"><em>*</em>First name can only contain letters</label>";
   }
if (!$_POST["lastname"] || !preg_match("/^[a-zA-Z]+$/", $_POST["firstname"])) {
   $warnings["lastname"] = " <label for=\"uname\" class=\"error\"><em>*</em>Last name can only contain letters</label>";
   
}
           $count  = count($warnings);
if($count === 0)
{

if(array_key_exists('submit', $_POST))
{


$club = mysql_real_escape_string($_POST['club']);
$first_name = mysql_real_escape_string($_POST['firstname']);
$last_name =  mysql_real_escape_string($_POST['lastname']);
$gender =  mysql_real_escape_string($_POST['gender']);
$birthyear =  mysql_real_escape_string($_POST['date']);
$update = "UPDATE profile SET dob='$dob', club= '$club', first_name = '$first_name', gender = '$gender', last_name = '$last_name' WHERE ID='$id' ";
$result = mysql_query($update);

// Check result
// This shows the actual query sent to MySQL, and the error. Useful for debugging.
if (!$result) {
    $er  = 'Invalid query: ' . mysql_error() . "\n";
    $er .= 'Whole query: ' . $query;
    die($er);
       }}
  echo '			<p class="error">' . $message . '</p>' . "\n";
}



            if ($err){?>
      <div class="errors">
	<p align="center"><em>Oops... the following errors were encountered:</em></p>

	<div align="center">
	  <ul>
	    <?php echo $err; ?>
      </ul>
    </div>
	<p align="center">Data has <strong>not</strong> been saved.</p>
</div>
      <p>
       <?php } ?>
      <fieldset>
	<legend>User Details</legend>	 
      <form id="submit" action='<?php "$_SERVER[php_SELF]" ?>' method="post" name="submit">
        <label>
        <table width="75%" align="left" cellpadding="0" cellspacing="0">
          <tr>
            <td height="30"width="28%"><div align="right">FirstName:</div></td>
            <td width="2%"> </td>
            <td width="70%"><input name="firstname" id="firstname" <? if (count($warnings) > 0){ if ($warnings['firstname']) echo "class=\"inputerror\""; }?> value="<?php echo $getuserprofile['first_name'] ?>"  />
              <?php if (count($warnings) > 0){ echo $warnings["firstname"];} ?> </td>
          </tr>
          <tr>
            <td height="30"><div align="right">Last Name: </div></td>
            <td><label></label></td>
            <td><input type="text" name="lastname" id="lastname" <? if (count($warnings) > 0){ if ($warnings['lastname']) echo "class=\"inputerror\"";} ?> value="<?php echo $getuserprofile['last_name'] ?>" />
            <?php if (count($warnings) > 0){ echo $warnings["lastname"];} ?>
            </td>
          </tr>
          <tr>
            <td height="30"><div align="right">Birthday :</div></td>
            <td> </td>
            <td><?php
// include the class
require "datepicker/class.datepicker.php";
// instantiate the object
$dp = new datepicker();
?>
(dd-mm-yyyy)
  <input id="date" value="<?php echo $getuserprofile['dob'] ?>" />
  <input type="button" value="..." onclick="<?= $dp->show("date") ?>" /></td>
          </tr>
          <tr>
            <td height="30"><div align="right">Gender : </div></td>
            <td> </td>
            <td><select  id="gender" name="gender">
              <option value="Male" >Male</option>
              <option value="Female"  >Female</option>
            </select></td>
          </tr>
          <tr>
            <td height="30"><div align="right">club :</div></td>
            <td> </td>
            <td><?php $lines = file('runningclubs.txt');
echo '<select id="club" name="club">';
foreach ($lines as $line)
{
            if ($pclub == trim($line))
            {
                        echo '<option value="' . $line . '" selected="selected">' . $line . '</option>';
            }
            else
            {
                        echo '<option value="' . $line . '">' . $line . '</option>';
            }
}
echo "</select>";

?>
              <input type="hidden" name="id" value="<?php echo $id ?>" /></td>
          </tr>
          <tr>
            <td colspan="3"><div align="center">
              <input  type="submit" class="submit-btn" value="" />
            </div></td>
          </tr>
        </table>
      </form>      
      </fieldset>  
      
      </div>
      </td>
     <td width="10%"> </td>
   </tr>
</table>
<script type="text/javascript">
var countries=new ddajaxtabs("countrytabs", "countrydivcontainer")
countries.setpersist(true)
countries.setselectedClassTarget("link") //"link" or "linkparent"
countries.init()
  </script>

 

the think is its not inserting anything into the db :S

 

and when u go on the page both firstname and last name are highlighted red even though its correct form the db :S

Let's test first if all of the script is executed:

 

Look for

echo 'Test1<br />';

echo 'Test2<br />';

echo $update';

 

in the code below.

 

if($count === 0)
{

echo 'Test1<br />';
   
if(array_key_exists('submit', $_POST))
{

echo 'Test2<br />';

$club = mysql_real_escape_string($_POST['club']);
$first_name = mysql_real_escape_string($_POST['firstname']);
$last_name =  mysql_real_escape_string($_POST['lastname']);
$gender =  mysql_real_escape_string($_POST['gender']);
$birthyear =  mysql_real_escape_string($_POST['date']);
$update = "UPDATE profile SET dob='$dob', club= '$club', first_name = '$first_name', gender = '$gender', last_name = '$last_name' WHERE ID='$id' ";

echo $update;

$result = mysql_query($update);

// Check result
// This shows the actual query sent to MySQL, and the error. Useful for debugging.
if (!$result) {
    $er  = 'Invalid query: ' . mysql_error() . "\n";
    $er .= 'Whole query: ' . $query;
    die($er);
       }}
  echo '         <p class="error">' . $message . '</p>' . "\n";
}

ahhh its because i didnt have a name attribute set to submit.

 

now it wont submit as it says submit cannot be empty. :S

 

i know its due to

 

 <?php
foreach($_POST as $field => $value) {
   if (!$value) {
      $err .= "$field cannot be empty. <br>";
      $warnings[$field] ="required";
   }
} ?> 

but why is it treating it as i field

Submit buttons are special creatures.  You can filter them out.  I also added asnippet to check against values with only whitespace:

 

<?php
foreach($_POST as $field => $value) {
   if (($field != 'submit') && ((!$value) || (trim($value) == ''))) {
      $err .= "$field cannot be empty. <br>";
      $warnings[$field] ="required";
   }
} ?> 

 

 

ah thanks yes

 

could i ask a few more questions...

 

 

1) why is it wheni go onto edit profile it displays the error "first/last name can only contain letters".. even though the name taken from the db is letters? ...

 

2) how comes  my code

<?php $lines = file('runningclubs.txt');
echo '<select id="club" name="club">';
foreach ($lines as $line)
{
            if ($pclub == trim($line))
            {
                        echo '<option value="' . $line . '" selected="selected">' . $line . '</option>';
            }
            else
            {
                        echo '<option value="' . $line . '">' . $line . '</option>';
            }
}
echo "</select>";

?> 

does not show the previous selected club from the db?

 

and when a dob is selcted how comes it does not save to my db :S

As for 1):

 

This code apparently results to false:

if (!$_POST["firstname"] || !preg_match("/^[a-zA-Z]+$/", $_POST["firstname"]))

 

I wouldn't be surprised if it is the !$_POST["firstname"] part.  To see if an array element exists, use array_key_exists() or at least isset()

 

I'll take a look at 2 asap.

 

As for 2):

 

file() will return an array of lines within the file, but I'm pretty sure that the newline characters for each line are preserved.  For example:

 

Contents of runningclubs.txt:

Club1

Club2

Club3

 

Then you use foreach ($lines as $line).  The first iteration of $line will not be:

 

Club1

 

but instead, $line will be:

 

Club1\n

 

or perhaps even:

 

Club1\n\r

 

If your clubnames do not contain \ then filter out the newline characters:

 

if ($pclub == trim(str_replace(array('\n', '\r'), '', $line)))

 

As for 1):

 

This code apparently results to false:

if (!$_POST["firstname"] || !preg_match("/^[a-zA-Z]+$/", $_POST["firstname"]))

 

I wouldn't be surprised if it is the !$_POST["firstname"] part.  To see if an array element exists, use array_key_exists() or at least isset()

 

I'll take a look at 2 asap.

 

 

 

ermm where would i stick these...  could it not be because i will not have a $_POST array set until i submit the form.

 

 

i also changed th club code to

 

<?php $lines = file('runningclubs.txt');

echo '<select id="club" name="club">';
foreach ($lines as $line)
{
          
           if ($pclub == trim(str_replace(array('\n', '\r'), '', $line)))

            {
                        echo '<option value="' . $line . '" selected="selected">' . $line . '</option>';
            }
            else
            {
                        echo '<option value="' . $line . '">' . $line . '</option>';
            }
}
echo "</select>";
?>

but with no result... in the text file the code is saved just as

 

club

club

club(but obviusly the club name)

 

You need to wrap the entire process in a check for submition then. eg;

 

if (isset($_POST['submit'])) {

  // process form

}

 

This is not guaranteed to work all of the time. In some browsers, when the user submits the form by pressing the enter key with a field in focus then the submit button element of the $_POST array will not be set and it will skip the form processor code resulting in a confused user.

 

The best way to do it is have a hidden field in the form, and check if that is set instead of checking if the submit button has been clicked.

 

E.g. <input type="hidden" name="submitted" value="1" />

 

<?php

 

if(isset($_POST['submitted']))

{

  //process form

}

 

?>

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.