Jump to content

Archived

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

jdubwelch

validating a form

Recommended Posts

I have 16 input boxes where users need to rank items 1 through 16. I need to make some sort of validation system so they can't enter in the same number twice.

How would i got through and check to see if there's no doubles of numbers besides doing a bunch of coding for.

For example, say the input boxes are A, B, ..., O, P. I don't want to be like:

[code] if ( A == B || A== C || A== D ... || A== O ) {
// not valid;
} else {
//is valid;
}
[/code]

if i did it that way, that would be a heck of a lot of coding and quite a headache. I was thinking possibly putting each value into an array and then checking A through the rest of the array, but not really sure how code that or what it'd look like.

any suggestions?

Share this post


Link to post
Share on other sites
Here's how I did it; you can try it out at:
[a href=\"http://www.skypaint.com/gavin/code/rankIt.php\" target=\"_blank\"]http://www.skypaint.com/gavin/code/rankIt.php[/a]
... and download the code from there.


[code]
<?php
ob_start();
?>
<html>
<head>
<title>fillInForm: lots of select boxes example</title>
<style>
.error { color: red; }
</style>
</head>
<body>
<p>Sixteen, sixteen-valued selects.  Validation is making sure there
are no duplicates...
</p>
<h1>Rank Them!</h1>
<ul class="error"><li>PLACEHOLDER FOR FORM ERRORS</li></ul>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST">
<table border="0">
<?php for ($i = 1; $i <= 16; $i++) {
  $name = "rank_$i";
?>
<tr>
<td><label for="<?php echo $name; ?>">Item <?php echo $name; ?>:</label></td>
<td><select name="<?php echo $name; ?>" id="<?php echo $name; ?>">
<?php
  for ($j = 1; $j <= 16; $j++) { echo "<option value=\"$j\">$j</option>"; }
?>
  </select>
</td>
</tr>
<?php
} // Phew, end of 16 select boxes.
?>
<tr><td> </td>
<td><input type="submit" name="submit" value="Rank'Em"></td>
</tr>
</table>
</form>
<p><hr/><a href="fillInFormValues.zip">Download PHP code</a></p>
</body>
</html>
<?php
$html = ob_get_contents();
ob_end_clean();

require_once("fillInFormValues.php");
require_once("validateForm.php");

$request = (get_magic_quotes_gpc() ? array_map('stripslashes', $_REQUEST) : $_REQUEST);

for ($i = 1; $i <= 16; $i++) {
  $name = "rank_$i";
  $validationData[$name] = array('isRequired', 'type' => 'number');
}
if (isset($request['submit'])) {
  $formErrors = validateForm($request, $validationData);

  $checkDuplicates = array();
  for ($i = 1; $i <= 16; $i++) {
    $name = "rank_$i";
    $rank = $request[$name];
    if (isset($checkDuplicates[$rank])) {
      $formErrors[$name] = "You ranked two or more items as number $rank";
    }
    else if (!empty($rank)) {
      $checkDuplicates[$rank] = $name;
    }
  }

  if (count($formErrors) == 0) {
    // Normally there would be code here to process the form
    // and redirect to a thank you page...
    // ... but for this example, we just always re-display the form.
    $info = "No errors; got these values:".
      nl2br(htmlspecialchars(print_r($request, 1)));
    $html = preg_replace('/<body>/', "<body><p>$info</p>", $html);
  }
}
else {
  $formErrors = array();
}

echo fillInFormValues($html, $request, $formErrors);

?>
[/code]

Share this post


Link to post
Share on other sites
on your input boxes..the HTML part
change the name of each box to something like whatever[]...note the brackets
the when the form is sent you'll have a 0 to 15 list of all the input in an array called whatever

[code]A<input name='stuff[]' type='text'>
B<input name='stuff[]' type='text'>
C<input name='stuff[]' type='text'>
D<input name='stuff[]' type='text'>
//$stuff[2] would be the C one
[/code]

anyway...once you do that...do a foreach loop with it
to make sure each one is unique
and if it is just continue
if not.....stop everything I guess and throw your error

say
[code]foreach($stuff as $val) [
if(in_array($val, $stuff))
   die("ERROR");
}[/code]

Share this post


Link to post
Share on other sites
Here's my take on the problem.

I used radio buttons for inputting the ranking on each item and used the array_unique() function to determine whether 16 unique rankings were entered. About 1/2 of the code is PHP the other 1/2 is CSS styling information to make the form and the errors look "nice" . :-)

[code]<?php
$err_style = array();
$radio_sylye = array();
if (isset($_POST['submit'])) {
    $unique_opts = array_unique($_POST['opt']);
    for ($i=1;$i<17;$i++)
        if (!isset($unique_opts[$i])) {
            $err_style[$i] = ' style="color:red;font-weight:bold;"';
            $radio_style[$i] = ' style="background-color: red';
        }
}
?>
< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <title>Ranking Test</title>
    <style type="text/css" media="screen">
    .row {
        clear:both;
        display:block;
        height:1.5em;
        width:100%;
    }
    .label {
        display:block;
        float:left;
        width:5em;
    }
    .header {
        float:left;
        display:block;
        height:1.5em;
        width:2em;
        text-decoration:underline;
        font-weight:bold;
    }
    .radiob {
        float:left;
        display:block;
        height:1.5em;
        width:2em;
    }
    .sub {
        clear:both;
        float:left;
        display:block;
        margin-top:0.25em;
    }
    .red {
        color: Red;
    }
    
    .bold {
        font-weight: bold;
    }
    
    hr {
        clear: both;
    }
    </style>
</head>

<body>
<form method="post">
<div class="row"><span class="label"> </span>
<?php
for ($i=1;$i<17;$i++)
    echo '<span class="header">' . $i . '</span>';
echo '</div>'."\n";
for ($row = 1; $row < 17; $row++) {
    echo '<div class="row"><span class="label"';
    if (isset($err_style[$row])) echo $err_style[$row];
    echo '>Item #' . $row . ':</span>';
    for ($opt = 1; $opt < 17; $opt++) {
        echo '<span class="radiob"';
        if (isset($_POST['opt'][$row]) && $_POST['opt'][$row] == $opt && isset($radio_style[$row])) echo $radio_style[$row];
        echo '">';
        echo '<input type="radio" id="opt_' . $row . '_' . $opt . '" name="opt[' . $row . ']" value="' . $opt . '"';
        if (isset($_POST['opt'][$row]) && $_POST['opt'][$row] == $opt) {
            echo ' checked="checked"';
        }
        echo '></span>'; }
    echo "</div>\n";}
?>
<div class="sub"><input type="submit" name="submit" value="Submit Rankings"></div>
</form>
<?php
if (isset($_POST['submit'])) {
    echo '<hr>';
    if (count($_POST['opt']) != 16) echo "<p class='red'>You didn't rank all of the items, try again</p>\n";
    else {
        $unique_opts = array_unique($_POST['opt']);
        if (count($unique_opts) != 16) {// duplicate ranking found
            $tmp = array();
            for ($i=1;$i<17;$i++){
                if (!isset($unique_opts[$i])) $tmp[] = $i.'<span class="bold">(Rank: ' . $_POST['opt'][$i] . ')</span>';
            }
            echo 'The rankings of the following Items were already used: ' . implode(', ',$tmp) . '<br>';
        }
    }
}
?>
</body>
</html>[/code]

You can try it out at [a href=\"http://www.rbnsn.com/phpfreaks/ranking.php\" target=\"_blank\"]http://www.rbnsn.com/phpfreaks/ranking.php[/a]

(Note: remove the space after the "<" on the DOCTYPE line)

Ken

Share this post


Link to post
Share on other sites

×

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.