Jump to content
Larry Ullman's Book Forums

When Using Netbeans To Debug Ch10 Script, 'Affected_Rows' Will Change From 1 To -1 And Other Strange Errors


Recommended Posts

When I use NetBeans to debug scripts of Ch10, I encountered some strange issues:

 

1.   Script 10.2 - delete_user.php

 

The code block  in this script:

// Check if the form has been submitted:
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    
        if ($_POST['sure'] == 'Yes') { // Delete the record.
    
            // Make the query:
            $q = "DELETE FROM users WHERE user_id=$id LIMIT 1";        
            $r = @mysqli_query ($dbc, $q);
            if (mysqli_affected_rows($dbc) == 1) { // If it ran OK.  

When I use NetBeans to debug this script, after the record is deleted($r = @mysqli_query ($dbc, $q) is executed), the affected_rows = 1 in the variable section of NetBeans, which is correct. But then after I press F7 to step into and 'if (mysqli_affected_rows($dbc) == 1)' is executed, affected_rows suddenly becomes -1, and the program logic jumps to the error reporting branch.

If I don't debug and just run the script, the Deletion is totally OK. What's the possible cause?

Here's the whole script:

        <?php # Script 10.2 - delete_user.php
    // This page is for deleting a user record.
    // This page is accessed through view_users.php.
    
    $page_title = 'Delete a User';
    include ('includes/header.html');
    echo '<h1>Delete a User</h1>';
    
    // Check for a valid user ID, through GET or POST:
    if ( (isset($_GET['id'])) && (is_numeric($_GET['id'])) ) { // From view_users.php
        $id = $_GET['id'];
    } elseif ( (isset($_POST['id'])) && (is_numeric($_POST['id'])) ) { // Form submission.
        $id = $_POST['id'];
    } else { // No valid ID, kill the script.
        echo '<p class="error">This page has been accessed in error.</p>';
        include ('includes/footer.html'); 
        exit();
    }
    
    require ('./mysqli_connect.php');
    
    // Check if the form has been submitted:
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    
        if ($_POST['sure'] == 'Yes') { // Delete the record.
    
            // Make the query:
            $q = "DELETE FROM users WHERE user_id=$id LIMIT 1";        
            $r = @mysqli_query ($dbc, $q);
            if (mysqli_affected_rows($dbc) == 1) { // If it ran OK.
    
                // Print a message:
                echo '<p>The user has been deleted.</p>';    
    
            } else { // If the query did not run OK.
                echo '<p class="error">The user could not be deleted due to a system error.</p>'; // Public message.
                echo '<p>' . mysqli_error($dbc) . '<br />Query: ' . $q . '</p>'; // Debugging message.
            }
        
        } else { // No confirmation of deletion.
            echo '<p>The user has NOT been deleted.</p>';    
        }
    
    } else { // Show the form, to confirm that this user should be deleted.
    
        // Retrieve the user's information:
        $q = "SELECT CONCAT(last_name, ', ', first_name) FROM users WHERE user_id=$id";
        $r = @mysqli_query ($dbc, $q);
    
        if (mysqli_num_rows($r) == 1) { // Valid user ID, show the form. (Just 1 result as user_id is PK)
    
            // Get the user's information:
            $row = mysqli_fetch_array ($r, MYSQLI_NUM);
            
            // Display the record being deleted:
            echo "<h3>Name: $row[0]</h3>
            Are you sure you want to delete this user?";
            
            // Create the form:
            echo '<form action="delete_user.php" method="post">
        <input type="radio" name="sure" value="Yes" /> Yes 
        <input type="radio" name="sure" value="No" checked="checked" /> No
        <input type="submit" name="submit" value="Submit" />
        <input type="hidden" name="id" value="' . $id . '" />
        </form>';
        
        } else { // Not a valid user ID.
            echo '<p class="error">This page has been accessed in error.</p>';
        }
    
    } // End of the main submission conditional.
    
    mysqli_close($dbc);
            
    include ('includes/footer.html');
    ?>

2. Another problem is that after finish debugging the script, there are many lines of warnings:

Warning: main(): Couldn't fetch mysqli in C:\xampp\htdocs\phpmysql4_working\delete_user.php on line 75
    
     Warning: main(): Couldn't fetch mysqli in C:\xampp\htdocs\phpmysql4_working\includes\footer.html on line 11
    Call Stack
    #    Time    Memory    Function    Location
    1    0.1000    146128    {main}( )    ..\delete_user.php:0
    2    249.5054    187032    include( 'C:\xampp\htdocs\phpmysql4_working\includes\footer.html' )    ..\delete_user.php:75  

But MySQL was actually been accessed successfully.

 

 

3. Script 10.4 - view_users.php #4

// This script retrieves all the records from the users table.
// This new version paginates the query results

 

The problem here is similar to question 2 above: If I directly run the script, the result in the browser is good. But if I debug it, after debug finishes, there are many lines of error messages like:

Warning: main(): Couldn't fetch mysqli_result in C:\xampp\htdocs\phpmysql4_working\view_users_pagination.php on line 80
Call Stack
#	Time	Memory	Function	Location
1	0.1090	146936	{main}( )	..\view_users_pagination.php:0

( ! ) Warning: main(): Couldn't fetch mysqli_result in C:\xampp\htdocs\phpmysql4_working\view_users_pagination.php on line 80
Call Stack
#	Time	Memory	Function	Location
1	0.1090	146936	{main}( )	..\view_users_pagination.php:0

Anyone met this kind of issue during debugging?

Link to comment
Share on other sites

This might be because NetBeans tries to debug footer.php on it's own and don't keep the variables from the old script in memory. If that's not the problem, I have no idea.

 

If the goal is to ensure that everything is working correctly, you might want to look into Unit testing with PHPUnit. You'll find some good sources on NetTuts and Youtube as examples.

Link to comment
Share on other sites

 Share

×
×
  • Create New...