Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL查询:按2而不是1递增_Php_Sql_Debugging_Mysql - Fatal编程技术网

Php SQL查询:按2而不是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?我做错

我试图通过将整数值增加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?

我将创建一个存储过程/触发器来在数据库端处理此问题

在特定事件(如单击按钮)上从页面调用存储过程

您的问题可能来自意外的浏览器刷新,也可能来自数据库端的作用域错误

将代码重新设计为存储过程应该修复