Jump to content
Larry Ullman's Book Forums


  • Posts

  • Joined

  • Last visited

Posts posted by Carbs

  1. Hi all,

    After working through the edit_user script in chapter ten, I thought I would like to try my hand at retrieving user information through a select dropdown. As I will have ~5000 clients, working through the list manually would be something of a chore. I came up with the following;

    $query = "SELECT on_programme, last_name, first_name, middle_name, id FROM constant_client WHERE on_programme=1 ";
    $result = mysqli_query($conn, $query);
    echo  '<form action="selected_client.php" method="get">
    echo '<p><label for="current_clients">Select Client by name: </label>
            <select id="current_clients" name="current_clients">
            <option> -- Select Client -- </option>';
            while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
              echo '<option>'.$row['id'].' '.ucwords($row['last_name']).', '.ucwords($row['first_name']).' '.ucwords($row['middle_name']).'</option>';  
    echo '</select>';
          echo '<input type="submit" name="submit" value="Go!">
    <input type="hidden" name="id" value="'.$row['id'].'">';

    The above populates the dropdown menu, but I am receiving an "array offset type null" error on submission of the form, because the $row['id'] variable doesn't appear to be set outside the while loop.

    Any suggestions would be greatly appreciated.

  2. On 5/7/2020 at 10:24 AM, Larry said:

    Ah, okay. So you're only having this problem when you click submit to update the information? If so, I think that's because of the extra spaces around the stored value here:

     value=" '. $id .' "

    If you look at the HTML source of the page you should see the value stored as " 1 ". I wouldn't think that would cause this problem but I suspect it is. 

    Larry, you're completely correct. I thought the whitespace would be ignored, so just added those to make it more readable for me, but there you go. Thank you very much for following up!

  3. Hi Larry,

      First up, great book, I'm really enjoying working through it.

    I'm having an issue with editing a user as per chapter 10, code below;

    echo '<h1>Edit a User</h1>';
    if ((isset($_GET['id'])) && (is_numeric($_GET['id']))) {
      $id = $_GET['id'];
    } elseif ((isset($_POST['id'])) && (is_numeric($_POST['id']))) {
      $id = $_POST['id'];
    } else { # no valid id, kill the script
      echo '<p>Yo this page has been accessed in error</p>';
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
      $errors = [];
        # check for first name
        if (empty($_POST['first'])) {
          $errors[] = 'You forgot to enter your first name';
        } else {
          $fn = mysqli_real_escape_string($conn, trim($_POST['first']));
        #check for last name
        if (empty($_POST['last'])) {
          $errors[] = 'You forgot to enter your last name';
        } else {
          $ln = mysqli_real_escape_string($conn, trim($_POST['last']));
        # check for email address
        if (empty($_POST['email'])) {
          $errors[] = 'You forgot to enter your email address';
        } else {
          $e = mysqli_real_escape_string($conn, trim($_POST['email']));
        # check for errors, then if everything is ok proceed
        if (empty($errors)) {
          #test for unique email address
          $query = "SELECT id FROM users WHERE email='$e' AND id != $id";
          $result = @mysqli_query($conn, $query);
          if (mysqli_num_rows($result) == 0) {
            # make the query
            $query = "UPDATE users SET first='$fn', last='$ln', email='$e'
            WHERE id=$id LIMIT 1";
            $result = @mysqli_query($conn, $query);
            if (mysqli_affected_rows($conn) == 1) { // if it ran fine
              # print a message
              echo '<p>The User has been edited.</p>';
            } else {
              #print an error message
              echo '<p>The User could not be edited, sorry.</p>';
              echo '<p>' . mysqli_error($conn) . '<br>Query: ' . $query . '</p>';
          } else {
            # the email address has already been registered
            echo '<p>The email address has already been registered.</p>';
        } else {
          #report the errors
          echo '<p>The following error(s) occurred: <br>';
          foreach ($errors as $msg) {
            echo " - $msg<br>\n";
          echo '</p><p>Please try again</p>';
        } # end of IF conditional
    } # end of submit conditionals
    # show the form
    #retrieve user information
    $query = "SELECT first, last, email FROM users WHERE id=$id";
    $result = mysqli_query($conn, $query);
    if (mysqli_num_rows($result) == 1) {
      #user ID is valid, show form
      # get user information
      $row = mysqli_fetch_array($result, MYSQLI_NUM);
      #create the form
      echo '<form action="edit_user.php" method="post">
        <p>First Name: <input type="text" name="first" size="15" maxlength="15"
          value=" '. $row[0] .' "></p>
        <p>Last Name: <input type="text" name="last" size="15" maxlength="30"
          value=" '. $row[1] .' "></p>
        <p>Email Address: <input type="email" name="email" size="20" maxlength="60"
          value=" '. $row[2] .' "></p>
        <p><input type="submit" name="submit" value="Submit"></p>
        <input type="hidden" name="id" value=" '. $id .' ">
    } else {
      # not a valid user
      echo '<p>Hey this page has been accessed in error!</p>';

    I'm getting the error from the GET/POST conditional in the beginning where the $id variable is set (as in the exit() function runs and $id is not set). I can see from running through the links from view_users.php to the edit_users.php page that the GET request is showing the user id in the address bar, and if I echo $id after the first conditional I get the id for the user. Additionally when I access edit_users.php the sticky forms are prefilled with the user data, so something somewhere is working. I just wanted to check that I hadn't made a syntax error or mislabeled something somewhere that I can't see that might lead to this error.


  • Create New...