Wrox Programmer Forums
|
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
 
Old April 2nd, 2012, 05:44 PM
Registered User
 
Join Date: Aug 2011
Posts: 3
Thanks: 0
Thanked 0 Times in 0 Posts
Default 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_HOSTMYSQL_USERMYSQL_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_HOSTMYSQL_USERMYSQL_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_HOSTMYSQL_USERMYSQL_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(=> 'alias ASC',
               
=> 'real_name ASC',
               
=> 'alignment ASC, alias ASC');

$o = (isset($_GET['o']) && ctype_digit($_GET['o'])) ? $_GET['o'] : 1;
if (!
in_array($oarray_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.





Similar Threads
Thread Thread Starter Forum Replies Last Post
Chapter 10, listing 10-10-app kiwibrit BOOK: Professional ASP.NET 3.5 : in C# and VB ISBN: 978-0-470-18757-9 2 August 18th, 2009 04:21 AM
Problems with the editor example in ch 10 arne Beginning PHP 4 August 21st, 2004 02:24 PM
Chapter 10 Editor Problems kellenjb BOOK: Beginning PHP4/PHP 5 ISBN: 978-0-7645-4364-7; v5 ISBN: 978-0-7645-5783-5 4 June 8th, 2004 08:16 PM
Beginning php 4 chapter 10 problems dakey Beginning PHP 3 February 13th, 2004 06:21 PM
Beginning php 4 chapter 10 problems ade Beginning PHP 2 June 19th, 2003 02:43 PM





Powered by vBulletin®
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Copyright (c) 2020 John Wiley & Sons, Inc.