In this activity you'll learn how to obtain data from a form and insert it into a database table.
form.php
<?php include('database.php'); include('header.php'); include('menu.php'); // get list of heroes $query = "SELECT * FROM heroes"; $args = array(); $hrslt = $pdo->prepare($query); $hrslt->execute($args); // get list of movies $query = "SELECT movie FROM appearances GROUP BY movie"; $args = array(); $mrslt = $pdo->prepare($query); $mrslt->execute($args); ?> <main> <form name="add_hero" action="process_form.php" method="post"> <fieldset> <legend>Add Hero</legend> <ul> <li> <label>Hero Alias:</label> <input type="text" name="alias" size="30" maxlength="50" hint="Iron Man"> </li> <li> <label>Hero Name:</label> <input type="text" name="identity" size="30" maxlength="50" hint="Tony Stark"> </li> <li> <label>Side:</label> <ul> <li><input type="radio" name="side" value="Hero" checked> Hero</li> <li><input type="radio" name="side" value="Villain"> Villain</li> </ul> </li> <li> <label>First Appearance:</label> <input type="number" name="year"> </li> <li> <label>Source of Power:</label> <select name="power"> <option value="skill">Skill</option> <option value="bio">Biological</option> <option value="magic">Magic</option> <option value="tech">Technology</option> <option value="mutant">Mutant</option> </select> </li> </ul> <input type="submit" name="submit" value="Add Hero"> </fieldset> </form> <form name="add_appearances" action="process_form.php" method="post"> <fieldset> <legend>Add Appearances</legend> <ul> <li> <label>Hero</label> <select name="hero"> <?php // display list of heroes while($row = $hrslt->fetch()) { ?> <option value="<?php echo $row['alias']; ?>"><?php echo $row['alias']; ?></option> <?php } ?> </select> </li> <li> <label>Movie</label> <ul> <?php // display list of movies while($row = $mrslt->fetch()) { ?> <li><input type="checkbox" name="movie[]" value="<?php echo $row['movie']; ?>" id=""> <?php echo $row['movie']; ?></li> <?php } ?> <li><input type="checkbox" name="movie[]" value="new" id=""> <input type="text" name="new_movie"></li> </ul> </li> </ul> <input type="submit" name="submit" value="Add Appearance"> </fieldset> </form> </main> <?php include('footer.php'); ?>
process_form.php
<?php include('header.php'); include('menu.php'); ?> <main> <p><?php print_r($_POST); ?></p> </main> <?php include('footer.php'); ?>
alias | identity | hero_villain | first_appeared | power |
---|---|---|---|---|
Thor | Thor Odinson | 1962 | Magic | |
Red Skull | Johan Schmidt | 1941 | Biological | |
Winter SolBucky Barnes | Winter Soldier | 1941 | Tech | |
Clint Barton | Hawkeye | 1969 | Skill | |
Odin | Odin | 1962 | Magic | |
Nick Fury | Nick Fury | 1963 | Skill | |
Phil Coulson | Agent Coulson | 2008 | Skill | |
Peter Quill | Starlord | 1976 | Tech | |
Gamora | Gamora | 1975 | ||
Pepper Potts | Rescue | 1963 | Tech |
INSERT INTO `heroes` (`alias`, `identity`, `hero_villain`, `first_appeared`, `power`) VALUES ('Bucky Barnes', 'Winter Soldier', 'Villain', '1941', 'Tech');
// check which form if ($_POST['submit'] == 'Add Hero') { } else if ($_POST['submit'] == 'Add Appearance') { } else { }
switch ($variable) { case 'value': # code... break; default: # code... break; }
break
command.default:
.break
at the end of a case
, the code from the next case
will also run. This can be useful if you want the same code to run for multiple cases like this. (Don't add this code)switch ($age) { case 1: case 17: case 43: # code... break; case 22: case 39: # code... break; }
$_POST['submit']
.switch ($_POST['submit']) { case 'Add Hero': break; case 'Add Appearance': break; default: break; }
case 'Add Hero':
.$query = ""; $args = array(); $rslt = $pdo->prepare($query); $rslt->execute($args)
?
then add the respective user input as elements in the '$args' array.$query = "INSERT INTO `heroes` (`alias`, `identity`, `hero_villain`, `first_appeared`, `power`) VALUES (?,?,?,?,?)"; $args = array($_POST['alias'], $_POST['identity'], $_POST['alias'], $_POST['side'], $_POST['year'], $_POST['power']);
$rslt->execute($args)
to the following.if ($rslt->execute($args)) { } else { }
if ($rslt->execute($args)) { $message = "{$_POST['name']} was inserted successfully."; } else { $message = "There was a problem inserting {$_POST['name']}."; }
INSERT INTO appearances (character_name, movie) VALUES ('Thor Odinson', 'Thor: Dark World'), ('Thor Odinson', 'Avengers: Age of Ultron')
foreach
loop.foreach($_POST['movie'] as $movie) { }
array_push
function.array_push($args, $_POST['hero'], $movie);
foreach
.$args = array(); foreach($_POST['movie'] as $movie) { array_push($args, $_POST['hero'], $movie); }
// check if it exists already $mquery = "SELECT * FROM appearances WHERE character_name=? AND movie=?"; $margs = array($_POST['hero'], $movie); $rslt = $pdo->prepare($mquery); $rslt->execute($margs); if (!$row = $rslt->fetch()) { array_push($args, $_POST['hero'], $movie); }
if (!$row = $rslt->fetch())
) then we add it to the list of arguments.$_POST['new_movie']
instead.if ($movie == 'new') { array_push($args, $_POST['hero'], $_POST['new_movie']); } else { // check if it exists already $mquery = "SELECT * FROM appearances WHERE character_name=? AND movie=?"; $margs = array($_POST['hero'], $movie); $rslt = $pdo->prepare($mquery); if (!$rslt->execute($margs)) { array_push($args, $_POST['hero'], $movie); } }
$_POST['new_movie']
as the movie name instead of the value stored in $_POST['movie']
.(?,?)
at the end of the query.$args
array using count
and then halve it.count
is like .length
in Javascript, counting the number of elements in an array.foreach
loop.$movies = count($args)/2;
(?,?)
at the end of the query, but they need to be separated by a ,
.$values = str_repeat('(?,?), ', $movies-1) . '(?,?)';
str_repeat
to repeat a set string a number of times. If we repeated '(?,?),' the correct number of times, we'd have a hanging ,
at the end which would cause an error. Instead, we add one less than the required amount (count($movies) -1
), then add (?,?)
at the end.$query = "INSERT INTO heroes ('alias', 'movie') VALUES $values";
break
.error_log("MURRAY: $query\n" . print_r($args, 1);
$rslt = $pdo->prepare($query); if ($rslt->execute($args)) { $message = "$movies appearances were inserted successfully."; } else { $message = "There was a problem inserting $movies appearances."; }
if ($movies > 0) { $values = str_repeat('(?,?), ', $movies-1) . '(?,?)'; $query = "INSERT INTO appearances (alias, movie) VALUES $values"; error_log("MURRAY: $query " . print_r($args, 1)); $rslt = $pdo->prepare($query); if ($rslt->execute($args)) { $message = "$movies appearances were inserted successfully."; } else { $message = "There was a problem inserting $movies appearances."; } } else { $checked = count($_POST['movie']); $message = "All $checked appearances are already in the database."; }
$movies
, which will be 0 in this case, I've changed the message to refer to the original number of movies submitted and stating that they were all already in the database.