 |
BOOK: Beginning PHP 6, Apache, MySQL 6 Web Development ISBN: 9780470391143
 | This is the forum to discuss the Wrox book Beginning PHP 6, Apache, MySQL 6 Web Development by Timothy Boronczyk, Elizabeth Naramore, Jason Gerner, Yann Le Scouarnec, Jeremy Stolz; ISBN: 9780470391143 |
|
Welcome to the p2p.wrox.com Forums.
You are currently viewing the BOOK: Beginning PHP 6, Apache, MySQL 6 Web Development ISBN: 9780470391143 section of the Wrox Programmer to Programmer discussions. This is a community of software programmers and website developers including Wrox book authors and readers. New member registration was closed in 2019. New posts were shut off and the site was archived into this static format as of October 1, 2020. If you require technical support for a Wrox book please contact http://hub.wiley.com
|
|
|
|

April 2nd, 2012, 05:44 PM
|
|
Registered User
|
|
Join Date: Aug 2011
Posts: 3
Thanks: 0
Thanked 0 Times in 0 Posts
|
|
Chapter 10: Edit_Character Problems.
Hi.
I was browsing through some of the code that I was working on and I came across an issue in the first comicbook fansite chapter. While each page works (and I did have the same 'on)' issues that have cropped up elsewhere), I tried adding a series of characters with powers, addresses, and rivalries. So far, so good.
And then I tried using the "edit characters" function (click on a character's name). Updating a name or a rivalry for someone. That works, and then I'm back at the character list.
And then I notice something's wrong with a character's name. A typo. So I try to re-edit a character and I'm suddenly I'm at the Add Characters function; all the fields are totally blank. I try this elsewhere. Same result.
...I believe I've located the particular problem. Since I was lazy with the zipcode design for my extra characters, I would put 00001, 00002, 00003 and so on for zip-codes. When I edit the character and that value remains unchanged, it gets compressed down to the one digit, which throws the system off, since the zipcode_id in the "Comic Lair" table gets compressed and the zipcode_id in the "Comic Zipcode" table does not.
I can go into and manually re-edit the mysql tables to fix this, but I would like to know if it's possible to avoid this problem in the future.
My Char_Transaction Code:
PHP Code:
<?php
require 'db.inc.php';
$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
die ('Unable to connect. Check your connection parameters.');
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));
switch ($_POST['action']) {
case 'Add Character':
// escape incoming values to protect database
$alias = mysql_real_escape_string($_POST['alias'], $db);
$real_name = mysql_real_escape_string($_POST['real_name'], $db);
$address = mysql_real_escape_string($_POST['address'], $db);
$city = mysql_real_escape_string($_POST['city'], $db);
$state = mysql_real_escape_string($_POST['state'], $db);
$zipcode_id = mysql_real_escape_string($_POST['zipcode_id'], $db);
$alignment = ($_POST['alignment'] == 'good') ? 'good' : 'evil';
// add character information into database tables
$query = 'INSERT IGNORE INTO comic_zipcode
(zipcode_id, city, state)
VALUES
("' . $zipcode_id . '", "' . $city . '", "' . $state . '")';
mysql_query($query, $db) or die (mysql_error($db));
$query = 'INSERT INTO comic_lair
(lair_id, zipcode_id, address)
VALUES
(NULL, "' . $zipcode_id . '", "' . $address . '")';
mysql_query($query, $db) or die (mysql_error($db));
// retrieve new lair_id generated by MySQL
$lair_id = mysql_insert_id($db);
$query = 'INSERT INTO comic_character
(character_id, alias, real_name, lair_id, alignment)
VALUES
(NULL, "' . $alias . '", "' . $real_name . '", ' .
$lair_id . ', "' . $alignment . '")';
mysql_query($query, $db) or die (mysql_error($db));
// retrieve new character_id generated by MySQL
$character_id = mysql_insert_id($db);
if (!empty($_POST['powers'])) {
$values = array();
foreach ($_POST['powers'] as $power_id) {
$values[] = sprintf('(%d, %d)', $character_id, $power_id);
}
$query = 'INSERT IGNORE INTO comic_character_power
(character_id, power_id)
VALUES ' .
implode(',', $values);
mysql_query($query, $db) or die (mysql_error($db));
}
if (!empty($_POST['rivalries'])) {
$values = array();
foreach ($_POST['rivalries'] as $rival_id) {
$values[] = sprintf('(%d, %d)', $character_id, $rival_id);
}
// alignment will affect column order
$columns = ($alignment = 'good') ? '(hero_id, villain_id)' :
'(villain_id, hero_id)';
$query = 'INSERT IGNORE INTO comic_rivalry
' . $columns . '
VALUES
' . implode(',', $values);
mysql_query($query, $db) or die (mysql_error($db));
}
$redirect = 'list_characters.php';
break;
case 'Delete Character':
// make sure character_id is a number just to be safe
$character_id = (int)$_POST['character_id'];
// delete character information from tables
$query = 'DELETE FROM c, l
USING
comic_character AS c, comic_lair AS l
WHERE
c.lair_id = l.lair_id AND
c.character_id = ' . $character_id;
mysql_query($query, $db) or die (mysql_error($db));
$query = 'DELETE FROM comic_character_power
WHERE
character_id = ' . $character_id;
mysql_query($query, $db) or die (mysql_error($db));
$query = 'DELETE FROM comic_rivalry
WHERE
hero_id = ' . $character_id . ' OR villain_id = ' . $character_id;
mysql_query($query, $db) or die (mysql_error($db));
$redirect = 'list_characters.php';
break;
case 'Edit Character':
// escape incoming values to protect database
$character_id = (int)$_POST['character_id'];
$alias = mysql_real_escape_string($_POST['alias'], $db);
$real_name = mysql_real_escape_string($_POST['real_name'], $db);
$address = mysql_real_escape_string($_POST['address'], $db);
$city = mysql_real_escape_string($_POST['city'], $db);
$state = mysql_real_escape_string($_POST['state'], $db);
$zipcode_id = mysql_real_escape_string($_POST['zipcode_id'], $db);
$alignment = ($_POST['alignment'] == 'good') ? 'good' : 'evil';
// update existing character information in tables
$query = 'INSERT IGNORE INTO comic_zipcode
(zipcode_id, city, state)
VALUES
("' . $zipcode_id . '", "' . $city . '", "' . $state . '")';
mysql_query($query, $db) or die (mysql_error($db));
$query = 'UPDATE comic_lair l, comic_character c
SET
l.zipcode_id = ' . $zipcode_id . ',
l.address = "' . $address . '",
c.real_name = "' . $real_name . '",
c.alias = "' . $alias . '",
c.alignment = "' . $alignment . '"
WHERE
c.character_id = ' . $character_id . ' AND
c.lair_id = l.lair_id';
mysql_query($query, $db) or die (mysql_error($db));
$query = 'DELETE FROM comic_character_power
WHERE
character_id = ' . $character_id;
mysql_query($query, $db) or die (mysql_error($db));
if (!empty($_POST['powers'])) {
$values = array();
foreach ($_POST['powers'] as $power_id) {
$values[] = sprintf('(%d, %d)', $character_id, $power_id);
}
$query = 'INSERT IGNORE INTO comic_character_power
(character_id, power_id)
VALUES
' . implode(',', $values);
mysql_query($query, $db) or die (mysql_error($db));
}
$query = 'DELETE FROM comic_rivalry
WHERE
hero_id = ' . $character_id . ' OR villain_id = ' . $character_id;
mysql_query($query, $db) or die (mysql_error($db));
if (!empty($_POST['rivalries'])) {
$values = array();
foreach ($_POST['rivalries'] as $rival_id) {
$values[] = sprintf('(%d, %d)', $character_id, $rival_id);
}
// alignment will affect column order
$columns = ($alignment = 'good') ? '(hero_id, villain_id)' :
'(villain_id, hero_id)';
$query = 'INSERT IGNORE INTO comic_rivalry
' . $columns . '
VALUES
' . implode(',', $values);
mysql_query($query, $db) or die (mysql_error($db));
}
$redirect = 'list_characters.php';
break;
case 'Delete Selected Powers':
if (!empty($_POST['powers'])) {
// escape incoming values to protect database-- they should be numeric
// values, but just to be safe
$powers = implode(',', $_POST['powers']);
$powers = mysql_real_escape_string($powers, $db);
// delete powers
$query = 'DELETE FROM comic_power
WHERE
power_id IN (' . $powers . ')';
mysql_query($query, $db) or die (mysql_error($db));
$query = 'DELETE FROM comic_character_power
WHERE
power_id IN (' . $powers . ')';
mysql_query($query, $db) or die (mysql_error($db));
}
$redirect = 'edit_power.php';
break;
case 'Add New Power':
// trim and check power to prevent adding blank values
$power = trim($_POST['new_power']);
if ($power != '')
{
// escape incoming value
$power = mysql_real_escape_string($power, $db);
// create new power
$query = 'INSERT IGNORE INTO comic_power
(power_id, power)
VALUES
(NULL, "' . $power . '")';
mysql_query($query, $db) or die (mysql_error($db));
}
$redirect = 'edit_power.php';
break;
default:
$redirect = 'list_characters.php';
}
header('Location: ' . $redirect);
?>
My Edit_Character php:
PHP Code:
<?php
require 'db.inc.php';
$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
die ('Unable to connect. Check your connection parameters.');
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));
$action = 'Add';
$character = array('alias' => '',
'real_name' => '',
'alignment' => 'good',
'address' => '',
'city' => '',
'state' => '',
'zipcode_id' => '');
$character_powers = array();
$rivalries = array();
// validate incoming character id value
$character_id = (isset($_GET['id']) && ctype_digit($_GET['id'])) ?
$_GET['id'] : 0;
// retrieve information about the requested character
if ($character_id != 0) {
$query = 'SELECT
c.alias, c.real_name, c.alignment,
l.address, z.city, z.state, z.zipcode_id
FROM
comic_character AS c, comic_lair AS l, comic_zipcode AS z
WHERE
z.zipcode_id = l.zipcode_id AND
c.lair_id = l.lair_id AND
c.character_id = ' . $character_id;
$result = mysql_query($query, $db) or die (mysql_error($db));
if (mysql_num_rows($result) > 0) {
$action = 'Edit';
$character = mysql_fetch_assoc($result);
}
mysql_free_result($result);
if ($action == 'Edit') {
// get list of character's powers
$query = 'SELECT
power_id
FROM
comic_character_power
WHERE character_id = ' . $character_id;
$result = mysql_query($query, $db) or die (mysql_error($db));
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_array($result)) {
$character_powers[$row['power_id']] = true;
}
}
mysql_free_result($result);
// get list of character's rivalries
$query = 'SELECT
c2.character_id
FROM
comic_character c1
JOIN comic_character c2
JOIN comic_rivalry r
ON (c1.character_id = r.hero_id AND
c2.character_id = r.villain_id) OR
(c2.character_id = r.hero_id AND
c1.character_id = r.villain_id)
WHERE
c1.character_id = ' . $character_id . '
ORDER BY
c2.alias ASC';
$result = mysql_query($query, $db) or die (mysql_error($db));
$rivalries = array();
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_array($result)) {
$rivalries[$row['character_id']] = true;
}
}
}
}
?>
<html>
<head>
<title><?php echo $action; ?> Character</title>
<style type="text/css">
td { vertical-align: top; }
</style>
</head>
<body>
<img src="logo.jpg" alt="Comic Book Appreciation Site" style="float: left;" />
<h1>Comic Book<br/>Appreciation</h1>
<h2><?php echo $action; ?> Character</h2>
<hr style="clear: both;"/>
<form action="char_transaction.php" method="post">
<table>
<tr>
<td>Character Name:</td>
<td><input type="text" name="alias" size="40" maxlength="40"
value="<?php echo $character['alias'];?>"></td>
</tr><tr>
<td>Real Name:</td>
<td><input type="text" name="real_name" size="40" maxlength="80"
value="<?php echo $character['real_name'];?>"></td>
</tr><tr>
<td>Powers:<br/><small><em>CTRL-click to select multiple powers</em></small>
</td>
<td>
<?php
// retrieve and present the list of powers
$query = 'SELECT
power_id, power
FROM
comic_power
ORDER BY
power ASC';
$result = mysql_query($query, $db) or die (mysql_error($db));
if (mysql_num_rows($result) > 0) {
echo '<select multiple name="powers[]">';
while ($row = mysql_fetch_array($result)) {
if (isset($character_powers[$row['power_id']])) {
echo '<option value="' . $row['power_id'] . '" selected="selected">';
} else {
echo '<option value="' . $row['power_id'] . '">';
}
echo $row['power'] . '</option>';
}
echo '</select>';
} else {
echo '<p><strong>No Powers entered...</strong></p>';
}
mysql_free_result($result);
?>
</td>
</tr><tr>
<td rowspan="2">Lair Location:<br/><small><em>Address<br/>City, State,
Zip Code</em></small></td>
<td><input type="text" name="address" size="40" maxlength="40"
value="<?php echo $character['address'];?>"></td>
</tr><tr>
<td><input type="text" name="city" size="23" maxlength="40"
value="<?php echo $character['city'];?>">
<input type="text" name="state" size="2" maxlength="2"
value="<?php echo $character['state'];?>">
<input type="text" name="zipcode_id" size="5" maxlength="5"
value="<?php echo $character['zipcode_id'];?>"></td>
</tr><tr>
<td>Alignment:</td>
<td><input type="radio" name="alignment" value="good"
<?php echo ($character['alignment']=='good') ? 'checked="checked"' : '';
?>/> Good<br/>
<input type="radio" name="alignment" value="evil"
<?php echo ($character['alignment']=='evil') ? 'checked="checked"' : '';
?>/> Evil
</td>
</tr><tr>
</tr><tr>
<td>Rivalries:<br/><small><em>CTRL-click to select multiple enemies</em>
</small>
</td>
<td>
<?php
// retrieve and present the list of existing characters (excluding the character
// being edited)
$query = 'SELECT
character_id, alias
FROM
comic_character
WHERE
character_id != ' . $character_id . '
ORDER BY
alias ASC';
$result = mysql_query($query, $db) or die (mysql_error($db));
if (mysql_num_rows($result) > 0) {
echo '<select multiple name="rivalries[]">';
while ($row = mysql_fetch_array($result)) {
if (isset($rivalries[$row['character_id']])) {
echo '<option value="' . $row['character_id'] .
'" selected="selected">';
} else {
echo '<option value="' . $row['character_id'] . '">';
}
echo $row['alias'] . '</option>';
}
echo '</select>';
} else {
echo '<p><strong>No Characters entered...</strong></p>';
}
mysql_free_result($result);
?>
</td>
</tr><tr>
<td colspan="2">
<input type="submit" name="action"
value="<?php echo $action; ?> Character" />
<input type="reset" value="Reset">
<?php
if ($action == "Edit") {
echo '<input type="submit" name="action" value="Delete Character" />';
echo '<input type="hidden" name="character_id" value="' .
$character_id . '" />';
}
?>
</td>
</tr>
</table>
</form>
<p><a href="list_characters.php">Return to Home Page</a></p>
</body>
</html>
My List Characters php:
PHP Code:
<html>
<head>
<title>Character Database</title>
<style type="text/css">
th { background-color: #999; }
td { vertical-align: top; }
.odd_row { background-color: #EEE; }
.even_row { background-color: #FFF; }
</style>
</head>
<body>
<img src="logo.jpg" alt="Comic Book Appreciation Site" style="float: left;" />
<h1>Comic Book<br/>Appreciation</h1>
<h2>Character Database</h2>
<hr style="clear: both;"/>
<?php
require 'db.inc.php';
$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or
die ('Unable to connect. Check your connection parameters.');
mysql_select_db(MYSQL_DB, $db) or die(mysql_error($db));
// determine sorting order of table
$order = array(1 => 'alias ASC',
2 => 'real_name ASC',
3 => 'alignment ASC, alias ASC');
$o = (isset($_GET['o']) && ctype_digit($_GET['o'])) ? $_GET['o'] : 1;
if (!in_array($o, array_keys($order))) {
$o = 1;
}
// select list of characters for table
$query = 'SELECT
character_id, alias, real_name, alignment
FROM
comic_character
ORDER BY ' . $order[$o];
$result = mysql_query($query, $db) or die (mysql_error($db));
if (mysql_num_rows($result) > 0) {
echo '<table>';
echo '<tr><th><a href="' . $_SERVER['PHP_SELF'] . '?o=1">Alias</a></th>';
echo '<th><a href="' . $_SERVER['PHP_SELF'] . '?o=2">Real Name</a></th>';
echo '<th><a href="' . $_SERVER['PHP_SELF'] . '?o=3">Alignment</a></th>';
echo '<th>Powers</th>';
echo '<th>Enemies</th></tr>';
$odd = true; // alternate odd/even row styling
while ($row = mysql_fetch_array($result)) {
echo ($odd == true) ? '<tr class="odd_row">' : '<tr class="even_row">';
$odd = !$odd;
echo '<td><a href="edit_character.php?id=' . $row['character_id'] .
'">' . $row['alias'] . '</a></td>';
echo '<td>' . $row['real_name'] . '</td>';
echo '<td>' . $row['alignment'] . '</td>';
// select list of powers for this character
$query2 = 'SELECT
power
FROM
comic_power p
JOIN comic_character_power cp
ON p.power_id = cp.power_id
WHERE
cp.character_id = ' . $row['character_id'] . '
ORDER BY
power ASC';
$result2 = mysql_query($query2, $db) or die (mysql_error($db));
if (mysql_num_rows($result2) > 0) {
$powers = array();
while ($row2 = mysql_fetch_assoc($result2)) {
$powers[] = $row2['power'];
}
echo '<td>' . implode(', ', $powers) . '</td>';
} else {
echo '<td>none</td>';
}
mysql_free_result($result2);
// select list of rivalries for this character
$query2 = 'SELECT
c2.alias
FROM
comic_character c1
JOIN comic_character c2
JOIN comic_rivalry r
ON (c1.character_id = r.hero_id AND
c2.character_id = r.villain_id) OR
(c2.character_id = r.hero_id AND
c1.character_id = r.villain_id)
WHERE
c1.character_id = ' . $row['character_id'] . '
ORDER BY
c2.alias ASC';
$result2 = mysql_query($query2, $db) or die (mysql_error($db));
if (mysql_num_rows($result2) > 0) {
$aliases = array();
while ($row2 = mysql_fetch_assoc($result2)) {
$aliases[] = $row2['alias'];
}
echo '<td>' . implode(', ', $aliases) . '</td>';
} else {
echo '<td>none</td>';
}
mysql_free_result($result2);
echo '</tr>';
}
echo '</table>';
} else {
echo '<p><strong>No Characters entered...</strong></p>';
}
?>
<p><a href="edit_character.php">Add New Character</a></p>
<p><a href="edit_power.php">Edit Powers</a></p>
</body>
</html>
Thank you for any assistance.
|
|
 |