可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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
回答1:
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
回答2:
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 */
回答3:
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 ...
回答4:
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.
回答5:
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.
回答6:
Ok, I know that this doesn't make any sense, but I solved removing $.ajax({async:true});
from my js file.
回答7:
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.
回答8:
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...
回答9:
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.
回答10:
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.
回答11:
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.
回答12:
$result=mysql_query($sql); echo "result=".$result;
It's because you run mysql_query($sql)
twice. Try it without echo the $result
.