Jump to content


Photo

Mass update to SQL database via form

form mysql mass update form

  • Please log in to reply
10 replies to this topic

#1 uncaringuser

uncaringuser

    Member

  • Members
  • PipPip
  • 10 posts

Posted 25 January 2013 - 06:12 AM

Hey people, I am faced with a problem that I need guidance with in order to solve. I have a catering website that is connected to a mysql database that has a back end to do changes to the menu. I have created an update page that originally updated the price but I was asked for it to update all the fields with any changes being made on the page, sounds simple right? Only problem is, is that the data that is being displayed is pulled from the database and displayed as values in input boxes so that the user can make changes. Each input box has a nameid which is a unique number that is pulled from the database that is stored in a field for each entry.

I want it so that the user can change any input box data and click on the one button and it update the records to each correct field based on their own unique id.

Here is the code for the front end

<form action="chstarterprice.php" method="post">
   <br><br>
   <?php
   include("connection.php");


   $result= mysql_query("SELECT title, subtext, nameid, category, price FROM starters");
  
   while($row = mysql_fetch_array($result))
   {


   $nameid = $row['nameid'];
   $title = $row['title'];
   $subtext = $row['subtext'];
   $category = $row['category'];
   $price = $row['price'];
  
  
   echo"<table>";
   echo"<tr>";
   echo"<td width=\"70px\">";
   echo"<p class=\"form2\">";
   echo "<b>Title</b>";
   echo"</td>";
   echo"<td width=\"120px\">";
   echo"<p class=\"form2\">";
   echo "<b>Subtext</b>";
   echo"</td>";
   echo"<td width=\"80px\">";
   echo"<p class=\"form2\">";
   echo "<b>Category</b>";
   echo"</td>";
   echo"<td width=\"80px\">";
   echo"<p class=\"form2\">";
   echo "<b>Price</b>";
   echo"</td>";
  
   echo"</tr>";
   echo"<tr>";
   echo"<td width=\"120px\">";
   echo"<p class=\"form2\">";
   echo"<input type=\"text\" name=\"$nameid\" value=\"$title\">";
   echo"</td>";
   echo"<td width=\"80px\">";
   echo"<p class=\"form2\">";
   echo"<input type=\"text\" name=\"$nameid\" value=\"$subtext\">";
   echo"</td>";
   echo"</td>";
   echo"<td width=\"80px\">";
   echo"<p class=\"form2\">";
   echo"<input type=\"text\" name=\"$nameid\" value=\"$category\">";
   echo"</td>";
   echo"<td width=\"120px\">";
   echo"<p class=\"form2\">";
   echo"<input type=\"text\" name=\"$nameid\" value=\"$price\">";
   echo"</td>";
   echo"</tr>";
   echo"<tr>";
   echo"</tr>";
   echo"</table>";
  
   }
  
   mysql_close($con); ?>


   <br>
   <input name="Submit" type="submit" value="Change" /></p>
   </form>

Here is the backend script that processes the form data

<? ob_start(); ?>
<?php


include("connection.php");

$nameid = $_POST['nameid'];
$query = "update starters set title, subtext, nameid, category, price = ('$_POST[nameid]') where 'starters'.'nameid' = '$nameid' or die(mysql_error)";
if(mysql_query($query)){
header("location:change-prices.php");}
else{
header("location:change-prices.php");}
?>
<? ob_flush(); ?>
 

If you guys can point me in the right direction with the code to make this work I would be greatly appreciated, I am really sure that it has something to do with the backend script as opposed to the front end.

Please get back to me, thanks guys.

Mitch

#2 cyberRobot

cyberRobot

    Advanced Member

  • Gurus
  • 1,413 posts

Posted 25 January 2013 - 08:36 AM

The form inputs need to have their own individual names. Otherwise, PHP isn't going to know the difference from one field to another. Maybe the following link will help:
http://www.tizag.com/phpT/forms.php
Blogging about PHP and other web development topics at ScorpBytes.com

#3 uncaringuser

uncaringuser

    Member

  • Members
  • PipPip
  • 10 posts

Posted 25 January 2013 - 09:34 AM

The forms are generated from how much data is in the tables, so it would be impossible to provide a specified name to each of them, hence why I used a variable which was automatically generated from when the data was created. Is there a way I could automatically assign a name to the form inputs that is recognised by PHP thus resulting in a successful query?

#4 cyberRobot

cyberRobot

    Advanced Member

  • Gurus
  • 1,413 posts

Posted 25 January 2013 - 09:41 AM

The ID could be added after the field name:

echo "<input type=\"text\" name=\"title$nameid\" value=\"$title\">";


Or you could use an array:

echo "<input type=\"text\" name=\"title[$nameid]\" value=\"$title\">";

More information about arrays in HTML forms can be found here:
http://www.thefuture...tml-form-inputs
Blogging about PHP and other web development topics at ScorpBytes.com

#5 uncaringuser

uncaringuser

    Member

  • Members
  • PipPip
  • 10 posts

Posted 25 January 2013 - 09:46 AM

I have tried that and its still not working, im certain that the problem lies with the update statement in the back end script. Thank you for your help so far.

#6 Psycho

Psycho

    Advanced Member

  • Gurus
  • 10,380 posts
  • LocationCanada

Posted 25 January 2013 - 10:24 AM

OK, I think you you need to slow down a moment. Let's take it one step at a time.

You have a list of records that you want to update on a single form. Each record has (at least) 5 fields. So, you need to supply five input fields for each record. And, most important, you must have a way to logically associate those fields together so that when you POST the form you know which ones go together. In your code above you are giving the fields the exact same name. That will not work since only the last field will be sent in the post data. Each field MUST have a unique name. But, you can use arrays as your name. That is the key.

In this case I would name each field according to the value it contains, i.e. the price field will be named price (for all of the price fields). But, you make it an array and use the record's unique ID as the index of the array. So, for example
<input type="text" name="price[$rec_id]" value="$price">

Then, when the form is posted you can associate each "group" of fields using the record ID.
The quality of the responses received is directly proportional to the quality of the question asked.

I do not always test the code I provide, so there may be some syntax errors. In 99% of all cases I found the solution to your problem here: http://www.php.net

#7 uncaringuser

uncaringuser

    Member

  • Members
  • PipPip
  • 10 posts

Posted 25 January 2013 - 10:45 AM

I have followed your example and changed the code for the front end, however I do not know how to take the array and update my database using an array as data in the back end. Would you be able to (based on your example) come up with an example update statement so I can get a better understanding?

#8 cyberRobot

cyberRobot

    Advanced Member

  • Gurus
  • 1,413 posts

Posted 25 January 2013 - 10:49 AM

One problem with the back-end code is it's only processing one set of fields. You'll need to add some type of loop to go through the form input. It isn't too much different than what you have for the front end.
Blogging about PHP and other web development topics at ScorpBytes.com

#9 uncaringuser

uncaringuser

    Member

  • Members
  • PipPip
  • 10 posts

Posted 25 January 2013 - 11:08 AM

I agree, a for each loop would be the best approach I feel however how would I apply the for-loop syntax to the backend script based on the front end variables I have now created?

#10 Psycho

Psycho

    Advanced Member

  • Gurus
  • 10,380 posts
  • LocationCanada

Posted 25 January 2013 - 12:01 PM

OK, here is some sample code to get you started. Your original HTML markup that was being created was very bloated. If you want all the TDs in a table to use a specific class, there is no need to create a span tag around the contents in each cell with a class name. You can do it with a single line in the style sheet. Also, use the table header tag (<th>) instead of using additional markup (i.e. the bold tag). So, I took the liberty of removing a lot of the cruft.

Below are two sample scripts. One to create the form with the input fields created with array names and a second script to process the form.

Form script
<?php

include("connection.php");
$query = "SELECT title, subtext, nameid, category, price FROM starters";
$result= mysql_query($query);

$formFields = '';
while($row = mysql_fetch_array($result))
{
    //Make values safe to use in HTML form
    $id       = intval($row['nameid']);
    $title    = htmlspecialchars($row['title'], ENT_QUOTES);
    $subtext  = htmlspecialchars($row['subtext'], ENT_QUOTES);
    $category = htmlspecialchars($row['category'], ENT_QUOTES);
    $price    = htmlspecialchars($row['price'], ENT_QUOTES);

    $formFields .= "  <tr>\n";
    $formFields .= "    <td><input type=\"text\" name=\"title[$id]\" value=\"$title\"></td>\n";
    $formFields .= "    <td><input type=\"text\" name=\"subtext[$id]\" value=\"$subtext\"></td>\n";
    $formFields .= "    <td><input type=\"text\" name=\"category[$id]\" value=\"$category\"></td>\n";
    $formFields .= "    <td><input type=\"text\" name=\"price[$id]\" value=\"$price\"></td>\n";
    $formFields .= "  </tr>\n";
}

mysql_close($con);

?>

<form action="chstarterprice.php" method="post">
<br><br>
<table>";
  <tr>
    <th width="70px">Title</th>
    <th width="120px">Subtext</th>
    <th width="80px">Category</th>
    <th width="80px">Price</th>
  </tr>
  <?php echo $formFields; ?>
</table>
<input name="Submit" type="submit" value="Change" /></p>
</form>

Processing script:
if(isset($_POST['title']))
{
    foreach($_POST['title'] as $id => $title)
    {
        $id = intval($id);
        $title = trim($title);
        $subtext  = isset($_POST['title'][$id]) ? trim($_POST['title'][$id]) : '';
        $category = isset($_POST['category'][$id]) ? trim($_POST['category'][$id]) : '';
        $price    = isset($_POST['price'][$id]) ? trim($_POST['price'][$id]) : '';

        //Insert code to validate the data.
        //Are certain values required or must be of a certain type?
        //  e.g. price would be expected to be a number

        //Preepare values for use in query
        $titleSQL    = mysql_real_escape_string($title);
        $subtextSQL  = mysql_real_escape_string($subtext);
        $categorySQL = mysql_real_escape_string($category);
        $priceSQL    = floatval($price);

        //Create an run update query
        //NOTE: Running queiries in loops is very inefficient
        //if this is only for a relatively small number of records (e.g. 50)
        //this should be OK.
        $query = "UPDATE starters
                  SET title = '$titleSQL',
                      subtext = '$subtextSQL',
                      category = '$categorySQL',
                      price = '$priceSQL'
                  WHERE nameid = $id";
        $result = mysql_query($query);
    }
}

The quality of the responses received is directly proportional to the quality of the question asked.

I do not always test the code I provide, so there may be some syntax errors. In 99% of all cases I found the solution to your problem here: http://www.php.net

#11 uncaringuser

uncaringuser

    Member

  • Members
  • PipPip
  • 10 posts

Posted 31 January 2013 - 05:32 AM

Psycho thank you so much for the example script, after a few modifications it proved to be exactly what I needed. Thanks again for the help and support. Consider this matter SOLVED :happy-04:




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Cheap Linux VPS from $5
SSD Storage, 30 day Guarantee
1 TB of BW, 100% Network Uptime

AlphaBit.com