Php SQL查询:按2而不是1递增
我试图通过将整数值增加1来更新表中的字段。以下是我正在使用的:Php SQL查询:按2而不是1递增,php,sql,debugging,mysql,Php,Sql,Debugging,Mysql,我试图通过将整数值增加1来更新表中的字段。以下是我正在使用的: function updateViews($id){ $sql = "UPDATE tweets SET tweet_views = tweet_views + 1 WHERE tweet_key = '$id'"; $result = mysql_query($sql) or die("DB Error : ". mysql_error()); return $result; } 但是,我发现它每次递增2而不是1?我做错
function updateViews($id){
$sql = "UPDATE tweets SET tweet_views = tweet_views + 1 WHERE tweet_key = '$id'";
$result = mysql_query($sql) or die("DB Error : ". mysql_error());
return $result;
}
但是,我发现它每次递增2而不是1?我做错了什么
谢谢
更新
从答案来看,SQL是正确的。您认为这可能会受到重写引擎的影响吗???我之所以这么问,是因为我100%确定这不会运行两次,或者因为有两个脚本,所以我不会打电话。一个调用函数,一个保存函数!这令人困惑
更新2
使用调试功能。我得到这个输出:
array(4) {
["file"]=>
string(35) "/home/magic/public_html/dbUpdate.php"
["line"]=>
int(16)
["function"]=>
string(15) "myDebugFunction"
["args"]=>
array(0) {
}
}
array(4) {
["file"]=>
string(31) "/home/magic/public_html/view.php"
["line"]=>
int(10)
["function"]=>
string(11) "updateViews"
["args"]=>
array(1) {
[0]=>
&string(5) "7jjdd"
}
}
看起来脚本只被调用了一次,但它仍然被更新了两次???救命啊(
同样从日志文件来看,脚本似乎被调用了三次
13:16:28 id:4a6c9d7cf38016.29304000
_SERVER[REQUEST_URI]=/lucic
_SERVER[REDIRECT_URL]=/lucic
/home/magic/public_html/dbUpdate.php@16 :myDebugFunction
/home/magic/public_html/view.php@10 :updateViews
13:16:30 id:4a6c9d7eaf93e3.88114161
_SERVER[REQUEST_URI]=/lucic
_SERVER[REDIRECT_URL]=/lucic
/home/magic/public_html/dbUpdate.php@16 :myDebugFunction
/home/magic/public_html/view.php@10 :updateViews
13:16:31 id:4a6c9d7f846557.12618673
_SERVER[REQUEST_URI]=/lucic
_SERVER[REDIRECT_URL]=/lucic
/home/magic/public_html/dbUpdate.php@16 :myDebugFunction
/home/magic/public_html/view.php@10 :updateViews
更新3
以下是可能导致问题的htaccess文件的内容
# REWRITE DEFAULTS
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC]
RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L]
# /view.php?t=h5k6 externally to /h5k6
RewriteCond %{THE_REQUEST} ^GET\ /view\.php
RewriteCond %{QUERY_STRING} ^([^&]*&)*t=([^&]+)&?.*$
RewriteRule ^view\.php$ /%2? [L,R=301]
# /h5k6 internally to /view.php?t=h5k6
RewriteRule ^([0-9a-z]+)$ view.php?t=$1 [L]
您多次错误地运行查询。:)
(好的,这只是一个猜测,但我建议进行一些日志记录以确保)SQL是正确的。我将跟踪PHP并确保没有对运行SQL的函数的重复调用。您可以通过一些调试日志来测试函数是否被调用两次或脚本
function myDebugFunction() {
static $iid = null;
if ( is_null($iid) ) {
$iid = uniqid('', true);
}
$log = date('H:i:s').' id:'.$iid."\n".
" _SERVER[REQUEST_URI]=". @$_SERVER['REQUEST_URI']."\n" .
" _SERVER[REDIRECT_URL]=". @$_SERVER['REDIRECT_URL'];
foreach(debug_backtrace() as $bt) {
echo '<pre>'; var_dump($bt); echo '</pre>';
$log .= "\n ".$bt['file'].'@'.$bt['line'].' '.@$bt['class'].':'.$bt['function'];
}
$log .= "\n";
error_log($log, 3, 'mydebug.log');
}
function updateViews($id) {
myDebugFunction();
$sql = "
UPDATE
tweets
SET
tweet_views = tweet_views + 1
WHERE
tweet_key = '".mysql_real_escape_string($id) ."'
";
$result = mysql_query($sql) or die("DB Error : ". mysql_error());
return $result;
}
函数myDebugFunction(){
静态$iid=null;
如果(为空($iid)){
$iid=uniqid(“”,真);
}
$log=日期('H:i:s')。'id:'。$iid。“\n”。
“\u SERVER[REQUEST\u URI]=”@$\u SERVER['REQUEST\u URI']。“\n”。
“_SERVER[REDIRECT_URL]=”@$_SERVER['REDIRECT_URL'];
foreach(debug_backtrace()作为$bt){
echo“”;变量转储($bt);echo“”;
$log.=“\n”。$bt['file'].@.$bt['line'..”。@$bt['class'.]:'。$bt['function'];
}
$log.=“\n”;
错误日志($log,3,'mydebug.log');
}
函数updateViews($id){
myDebugFunction();
$sql=”
更新
推特
设置
推特视图=推特视图+1
哪里
tweet\u key='.mysql\u real\u escape\u string($id)。''
";
$result=mysql_query($sql)或die(“DB Error:.mysql_Error());
返回$result;
}
如果在mydebug.log中两次找到相同的id,则函数已被调用两次(在同一个php实例中)。否则您的脚本已被调用两次。没有涉及触发器,是吗?检查文件的编码。如果浏览器在页面中发现非ascii字母,则可能会使用其他编码重新加载页面。非ascii字母可以是æå、俄语、汉语或希伯来语字母。即使您有指定编码的元标记,浏览器仍将重新加载页面并再次开始处理 要解决此问题,请在高级浏览器(例如记事本+)中打开文件并指定编码。在记事本++中,这是UTF-8格式>编码。如果使用格式>转换为UTF-8,文档开头可能会出现一些奇怪的字节,因此使用编码方法更安全。是否使用Smarty --编辑-- 我这样问是因为Smarty有一个bug,当您有一个img标记,但模板中没有定义src时,base index.php将包含两次
如果您在同一页面中有一个img(您可以使用for ex)或一个iframe,那么同样的情况也会发生,因为基本脚本可能会在页面的一次刷新中显示两次(或更多)。此页面是错误处理页面吗 重定向URL与请求URI相同这一事实表明了这一点,因为重定向URL似乎是apache在处理错误文档或类似文档时设置的变量 考虑到该文件确实多次运行,可能会发生一些重定向循环-您的.htaccess文件中有什么内容
编辑:这里有更多的信息:当前有一些浏览器(我认为Chrome就是其中之一)错误地向表单发送了一个GET后的帖子,这可能是您看到的问题的原因
您是否也可以将请求记录到php应用程序中,并查看是否有两次被浏览器击中?您可能希望在此处包含生成页面的HTML。可能是脚本、链接(css)或img标记的格式不正确,并且正在通过“、”或“?”进行重写,因为它们将“解析”到相同的url。如果您没有对所有URL(images/header.gif而不是/images/header.gif等)进行绝对路径设置,则其中一些URL可能会丢失,尤其是在浏览器中,这些短URL看起来像目录。尝试在curl中执行请求(没有镜像,只是一个简单的GET),看看它是否发生在那里 另外,打开HTTP访问和重写日志记录,查看在该级别发生了什么(注意,您必须在编译的配置中放入rewritelog指令,它在.htaccess中不起作用)。如果做不到这一点,请在tamperdata或更好的wireshark中查看请求,以查看实际发出的请求
需要考虑的其他事项:apache conf中的多视图可能试图添加后缀扩展,它可能会奇怪地被您的重写捕获(不知道如何,但谁知道)-您的重写日志将显示这一点。mod_dir可能试图添加一个尾随斜杠(因为这些短URL看起来有点像目录),不过,您可能会看到这一点。只是猜测,但您是否安装了病毒扫描程序?有时他们会预取一个页面,从而导致两次点击。要查看这些信息,请查看access.log。随机查看:您的页面是否具有自动刷新/重新加载功能,以获取最新的评论、价格、更新等信息?这可能会导致第二次加载页面,这可能会影响您看到的内容
另外,您是否使用AJAX?我将创建一个存储过程/触发器来在数据库端处理此问题 在特定事件(如单击按钮)上从页面调用存储过程 您的问题可能来自意外的浏览器刷新,也可能来自数据库端的作用域错误 将代码重新设计为存储过程应该修复