|
home—lects—hws
D2L—breeze (snow day)
We've been talking about input forms (html elements), and then php scripts to process a submitted form:
<!-- inside form.php (or, form.html) --> <form submit='submit.php' action="post"> Login: <input type='text' name='userid' /> <br /> Remember me?: <input type='checkbox' name='remember' value='yep' /> … </form> |
<!-- inside submit.php --> <?php echo "Hey there ", $_POST['userid']; if (array_has_index('remember',$_POST)) { echo "How could I ever forget?"; // $_POST['remember'] = 'yep' } ?> |
Our functions have test cases, and this helps gives us confidence before we ever deploy to the web. But what about form-handlers? The result from form-handler is a long page that includes various bits from the form. It's too tedious to make this a check/expect sort of test, since the details of the html part of the output aren't relevant (and might change). Moreover, generating the page requires the POST data, that were entered by hand back in the form. But we would like to be able to check that the form-handler without going through the web, and also eyeball-check the result on certain inputs w/o having to continually re-type the inputs and call up the form.
Solution:
Make a php program which simply initializes
Awesome sauce: We can run these sample-inputs locally, or over the web. The former is useful when the latter isn't showing up as expected.Although we use these to manually test our handler, I'll avoid the suffix "test" since they're not automated test-cases. Admittedly, the filename topic-handle-sample-input-N.php might be better a more descriptive name than just topic-handle-sample-N.php, but we'll concede to a shorter, more convenient name.
When creating a page which includes something typed in by the user (from a previous text-input), we must be careful! What could the user have typed, that would goof up our web page?
Note that to prevent errors, some php servers used to
enable “magic quotes”:
When setting up the
A poor solution is to always call
/** Return $_POST[$fieldname] (removing magically-introduced slashes if any were added). */ function getInput($fieldname) { return get_magic_quotes_gpc() ? stripslashes($_POST[$fieldname]) : $_POST[$fieldname] |
Quick q: suppose a user types:
hi <3in a textarea whose name is
We have seen arrays,
and mentioned that if they have all-numeric indices (keys) then
we can process them with a
Then we saw that if an array has keys which aren't all numeric,
we can use a
$myData = array( 'hi' => 'hallo', 'good day' => 'guten Tag', 'see you later' => 'auf wiedersehen' ); foreach ($mydata as $german) { echo $german, "\n"; } foreach ($mydata as $english => $german) { echo "You say '$english', I say '$german'.\n"; } |
Look at the documentation for
Since it returns an array of filenames,
it's a natural match to use with other functions that want an array of strings:
For example,
Suppose we wanted an English list of hyperlinks, separated by commas, with the word "and" before the last item. This decomposes into two orthogonal parts:
To create the array, hopefully you also used your function
$URLsAsText = array( "http://d20srd.org", "http://www.radford.edu", "http://google.com" ); $URLsAsHTML = array(); foreach ($URLsAsText AS $url) { $URLsAsHTML[] = hyperlink($url); } echo "It should appeal to users of ", commaSeparatedList( $URLsAsHTML ), "." |
Any other repeated stuff?
Hmm, the “http:” prefix
was kinda annoying, but writing a loop for that seems definite overkill.
(Design Question:
Should
It's kinda annoying to keep writing loops that
make a new array of updated values.
Most of the loop is very rote — the only part that differs is
the particular rule to transform the individual element to the new element.
(In the example above, the answer is
“the function
There is a handy function,
$URLsAsText = array( "http://d20srd.org", "http://www.radford.edu", "http://google.com" ); $URLsAsHTML = array_map( $URLsAsText, "hyperlink" ); echo "It should appeal to users of ", commaSeparatedList( $URLsAsHTML ), "."; |
$URLsAsText = array( "http://d20srd.org", "http://www.radford.edu", "http://google.com" ); echo "It should appeal to users of ", commaSeparatedList( array_map( $URLsAsText, "hyperlink" ) ), "."; |
Finally, note that we can also handle the
“prepend “http://” to each item” issue.
We could make a separate function and pass that to
$URLsAsText = array_map( array( "d20srd.org", "www.radford.edu", "google.com" ), function ($domain) { return "http://" . $domain; }2 ); |
1 Heck, if you don't even want to name the original array, you could inline that. This is arguably in-lining too much, but that can be an issue of taste (and requires taking care with indentation):
echo "It should appeal to users of ", commaSeparatedList( array_map( array( "http://d20srd.org", "http://www.radford.edu", "http://google.com" ), "hyperlink" ) ), "."; |
2
This is a function that we declare in the middle of the line; note it
doesn't even have a name.
We don't call this function ourselves: we are giving the function to
function arraymap( $arr, $func ) { $result = array(); foreach ($arr AS $k => $v) { $result[$k] = $func($v); // call the function we were handed, and store the answer in our array $result. } return $result; } |
home—lects—hws
D2L—breeze (snow day)
©2015, Ian Barland, Radford University Last modified 2016.Feb.18 (Thu) |
Please mail any suggestions (incl. typos, broken links) to ibarlandradford.edu |