Jump to content
imgrooot

Is there a way to submit same entry multiple times on a single form submit?

Recommended Posts

Say I have an "Entries" table. I want to submit same multiple entries using a form submission. And If I have other queries submitted in the same form, I want those quarries to be submitted only once.  Is that possible to do? 

Here's my code.

if(isset($_POST['submit'])) {

  $entries = 10;

  $id   = 55;
  $name = 'Smith';

  $insert = $db->prepare("INSERT INTO entries(id, name) VALUES(:id, :name)");
  $insert->bindParam(':id', $id);
  $insert->bindParam(':name', $name);
  $result_insert = $insert->execute();
  if($result_insert == false) {
    echo 'Fail';
  } else {
    echo 'Success';
  }

}
?>
<form action="" method="post">
  <input type="submit" name="submit" value="SUBMIT" />
</form>

 

Edited by imgrooot

Share this post


Link to post
Share on other sites

I see a form with no inputs, just a button to submit.  Then I see a block of code that builds a query and executes it to insert a record with a static id and static name, neither of which comes from any form.  And it happens just once.

Despite your poorly written post I'm concerned that you have a poorly designed methodology here as well.  And where are these other "quarries" (a place to find rocks?) that you want to have executed as well?

From your post I half-expected some kind of input form with values that you then wanted to repeatedly post to a database using a unique key for each.  Quite an easy exercise.  That was not what you presented.

  • Like 1

Share this post


Link to post
Share on other sites
10 hours ago, ginerjm said:

I see a form with no inputs, just a button to submit.  Then I see a block of code that builds a query and executes it to insert a record with a static id and static name, neither of which comes from any form.  And it happens just once.

Despite your poorly written post I'm concerned that you have a poorly designed methodology here as well.  And where are these other "quarries" (a place to find rocks?) that you want to have executed as well?

From your post I half-expected some kind of input form with values that you then wanted to repeatedly post to a database using a unique key for each.  Quite an easy exercise.  That was not what you presented.

I have my reason to use an empty form form to submit outside data. I was not asking advice on that. I simply wanted to know how to insert the same query multiple times. Below is the updated query that does not. It seems to work fine, unless you think other wise.

$entries = 10;

$id   = 55;
$name = 'Smith';

$stmt = $db->prepare("INSERT INTO entries(id, name) VALUES(:id, :name)");

for($i = 1; $i <= $entries; $i++)  {
    $stmt->bindParam(':id', $id);
    $stmt->bindParam(':user_id', $name);
    $result_insert = $stmt->execute();
}
if($result_insert == false) {
  $errors[] = 'There was a problem!';
}

 

Share this post


Link to post
Share on other sites

You only need to bind once.

You are checking only the last insert

 

Share this post


Link to post
Share on other sites

When this all is described better maybe I'll jump in again.

Share this post


Link to post
Share on other sites
7 hours ago, Barand said:

You only need to bind once.

You are checking only the last insert

 

Do you mean like this?

$entries = 10;

$id   = 55;
$name = 'Smith';

$stmt = $db->prepare("INSERT INTO entries(id, name) VALUES(:id, :name)");
$stmt->bindParam(':id', $id);
$stmt->bindParam(':user_id', $name);
for($i = 1; $i <= $entries; $i++)  {
    $result_insert = $stmt->execute();
  	if($result_insert == false) {
      $errors[] = 'There was a problem!';
    }
}

 

Share this post


Link to post
Share on other sites

Almost - you are binding to :user_id when you used :name in the query.

You could speed it up significantly by doing a multiple insert EG

$params = [];
$data = [];
for($i = 1; $i <= $entries; $i++)  {
    $params[] = '(?,?)';
    array_push($data, $id, $name);
}
$stmt = $db->prepare("INSERT INTO entries(id, name) VALUES " . join(',', $params));;
$stmt->execute($data);

which creates a query in the form

INSERT INTO entries (id, name) VALUES (55, 'Smith'), (55, 'Smith'), (55, 'Smith'), ... , (55, 'Smith');

Timings:

Yours : 0.3336 seconds
Mine  : 0.0591 seconds (5.6x faster)

With hundreds of records it could be up to 50 or 60 times faster.

  • Like 1

Share this post


Link to post
Share on other sites
1 hour ago, Barand said:

Almost - you are binding to :user_id when you used :name in the query.

You could speed it up significantly by doing a multiple insert EG


$params = [];
$data = [];
for($i = 1; $i <= $entries; $i++)  {
    $params[] = '(?,?)';
    array_push($data, $id, $name);
}
$stmt = $db->prepare("INSERT INTO entries(id, name) VALUES " . join(',', $params));;
$stmt->execute($data);

which creates a query in the form


INSERT INTO entries (id, name) VALUES (55, 'Smith'), (55, 'Smith'), (55, 'Smith'), ... , (55, 'Smith');

Timings:


Yours : 0.3336 seconds
Mine  : 0.0591 seconds (5.6x faster)

With hundreds of records it could be up to 50 or 60 times faster.

 

Oh wow, that's a much more efficient way of doing it. 

My original query has more fields so i tried to simplify it for demonstration purposes. That's where I made the mistake of having :user_id when there shouldn't be.

Just one question. Your example shows inserting two fields(id, name). If I wanted to insert four fields, would it look like this?

$params[] = '(?,?,?,?)';
array_push($data, $id, $name, $field3, $field4);

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.