Home » Php » php run once and insert twice in mysql database

php run once and insert twice in mysql database

Posted by: admin July 12, 2020 Leave a comment

Questions:

I’ve got a simple code below. After it’s run once, it inserts results twice into the mysql database.

if it run twice or request twice base on 1 refresh on the page, why the output is just 1 result?

I have been googling for the whole day and struggling to resolve this issue. However, I failed to figure out what is wrong with this code. The code runs perfectly on localhost, but after it’s moved to the server, the problem pops up. Has anyone faced something like this before? How can this problem be resolved?

FULL CODE:

<?php
$db=mysql_connect('localhost','zzzzzzz','xxxxxx') or die('Unable to connect.'.mysql_error());
mysql_select_db('test',$db) or die(mysql_error($db));

$sql="INSERT INTO test_table(value,insert_time) VALUES ('testing','".time()."')";
$result=mysql_query($sql);
echo "result=".$result;

$select="select * from test_table";
$rs=mysql_query($select);
while($row=mysql_fetch_array($rs)){
echo $row["test_id"]." -- ".$row["value"]." -- ".$row["insert_time"]."<br />";
}
?>

RESULT:
result=1
1 — testing — 1298185509

BUT IN DATABASE:
test_id , value , insert_time
1 , testing , 1298185509
2 , testing , 1298185511

How to&Answers:

I’m facing the same issue as you, the problem only occus when I use Opera or chrome.

For my case, I have an .htaccess to point every thing to the index file. Naturally the browser will request the script twice, once for the script it self, the other is for the favicon.

The fix:
Try to edit the .htaccess to prevent redirection to the index file when the browser is requesting for favicon.ico

Answer:

Do you see this

$result = $db->query($query);

And the next line:

if ($db->query($query) === TRUE) {

This means that you run your query twice. Remove one of the $db->query, e.g.:

$result = $db->query($query);
if ($result === TRUE) {    /* do stuff */

Answer:

As you mentioned the problem does not occur when you test locally, only occurs when you deploy in server — I guess you have Google Adsense in your page.
In that case, adsense crawler is crawling your page (sending the second http request to the url)

To avoid this, add following in start of your php file:

if(strpos($_SERVER['HTTP_USER_AGENT'],'Mediapartners-Google') !== false) {
        exit();
}

I had faced similar issue in a script which sends emails. I was getting double emails per action 🙁

Then, I investigated into the server access log, and discovered the second request per action from this user agent …

Answer:

There’re many reasons to cause this, so I would suggest you using the best practice:

If you’re creating a new record in your DB, you should init the logic with a POST request.

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // …
}

The non-code problems should be easily avoided now: .htaccess thing, Firebug thing, ads tracking thing…

Answer:

This problem may also be arising due to you may be mixing the GET and POST

Or

you may have downloaded online template which is may be making an background ajax call before the page is submitted.

Please have a look and if you find a solution or if there is any other problem let us know.

Answer:

Code is fine.

Try to change browser.
If still not worked.

Restart server
Still not

Try to write in another file outside of project as single script.

It will work.

I tried your code its working on my system.

Answer:

I had this issue happening on Chrome Browser and found 2 ways to solve it;

  1. You can add a captcha control on your form. This prevents it from running twice and entering that extra data line to SQL.You can get the captcha code from here;

click for Captcha information

  1. Create a session control by starting a session on your form page;

    $_SESSION['formzt']= 0;

And in your POST page use an “if” statement before your insert;

if ($_SESSION['formzt']==0){

$sql="INSERT INTO members (user)
VALUES ('testini')";

if (mysqli_query($conn, $sql)) {
   echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

  $_SESSION['formzt']++;

 }

This will prevent it from reinsert.

Answer:

Ok, I know that this doesn’t make any sense, but I solved removing $.ajax({async:true});
from my js file.

Answer:

I had the same issue on my site. After debugging I found the root cause. It is Yandex Metrica js library. It calls ajax request to the same page to calculate loading time and some other params.

Do you use it? If not open chrome dev panel and look at http request. May be it is request for favicon or etc.

Answer:

There is no problem with your code.Firebug or similar tools can make double request sometimes. Also metric scripts (yandex metrica, chartbeat etc) in your page can do same behavior. You should inspect these situations.

To debug it you can log insert requests, and you can inspect it to find what is wrong.

If you are using linux environment ;

Add a log line to your code :

error_log(print_r($_SERVER,true));

Open a console window and type (log directory depends on your sever configuration)

tail -f /var/log/apache/error.log

And then you can call your insert page. At every request you can see what is happening.

Answer:

I guess this code from index.php which is front-controller for all requests.
When browser fetches page it usually trying to get favicon.ico too. And if favicon is missing, second request is processed your php file again. You can examine this
supposition by writing $_SESSION[‘REQUEST_URI’] to DB.

I recommend do not change data in GET requests and research web server access log from time to time.

Answer:

Your code seems fine, and it should be probably due to external plugins that you are using, which send a 2nd request each time.


If you are using Google Chrome, it would most likely be due to this bug, https://bugs.chromium.org/p/chromium/issues/detail?id=123121. This bug causes Chrome to redirect every request into index.php, so the PHP script will run twice.

This can be fixed using the following code, as according to website.

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !favicon.ico
RewriteRule .* index.php [L]

You can also debug using debug_print_backtrace: http://php.net/debug_print_backtrace.

debug_print_backtrace() prints a PHP backtrace. It prints the function calls, included/required files and eval()ed stuff.


Alternatively, you can use SQL UNIQUE Constraint to prevent duplicate rows from being inserted in the first place. Find out more at http://www.w3schools.com/sql/sql_unique.asp.


Just a note: There are mysql() have been deprecated, use MySQLi instead.

Answer:

The solution by Endy Jasmi worked for me. Here is how I edited my .htaccess file.


    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /site2/
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /site2/ [L]
    </IfModule>

    # END WordPress

earlier it was like


    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /site2/
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /site2/index.php [L]
    </IfModule>

    # END WordPress

Answer:

Try this solution in your header html.

<base href="/">

Answer:

$result=mysql_query($sql); echo "result=".$result;

It’s because you run mysql_query($sql) twice. Try it without echo the $result.