PHP函数未调用时执行

时间:2016-01-28 16:08:08

标签: php mysql prepared-statement

在我的简单脚本中出现了一些非常奇怪的事情。我有一个静态函数,它从服务器传递$ _GET数据并在其上运行一个准备好的语句。

奇怪的是,这个函数在内部和if语句中被调用,当不满足if时,SQL预处理语句仍将运行,但函数中没有其他内容。

if(Filter::isBlacklisted($domain) || $domain == null || Filter::forbiddenCountry($country)) {

    $pid = ($_GET['pid'] == null) ? 0 : $_GET['pid'];
    $tid = ($_GET['tid'] == null) ? 0 : $_GET['tid'];

    //THIS WILL NOT ECHO OUT CAUSE THE IF IS NOT MET
    echo "here";

    //IF I UNCOMMENT THIS THE QUERY WILL NOT RUN
    //exit; 

    //THIS LINE IS THE CULPRIT, ITS QUERY RUNS ON EVERY PAGE REQUESTS
    Filter::blockedRequest($tid,$pid); 

}
else {

    echo "there";

    exit;

}

这里是相应的静态函数

 public static function blockedRequest($tid,$pid) {

    //The QUERY executes but this will not echo out
    echo "Hello";


    $date = date("Y-m-d");
    $mysqli = DB::dbConnect();

    if($stmt = $mysqli->prepare("INSERT INTO adserver.requests VALUES(?,1,1,?,?) ON DUPLICATE KEY UPDATE requests=requests+1, blocked=blocked+1")) {

      $stmt->bind_param("isi",$tid,$date,$pid);
      $stmt->execute();
      $stmt->close();
      $mysqli->close();

    }

    return;

  }

发送的每个请求都不符合第一个if语句,并转到else语句,该语句回显"那里"。因此,If语句可以正常工作,但sql语句仍然执行,但静态函数中的echo不会只运行sql prepared语句。

服务器不运行memcache,opcache或任何其他缓存解决方案,所以不是这样。

此处的代码中的其他任何地方都不会调用查询。包含类不会通过任何其他函数调用静态函数。

我感到困惑,非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

您可能在没有意识到的情况下发送多个请求。如果第一个请求输入if语句而第二个请求没有输入,它将覆盖第一个echo并产生你看到的结果。

要检查发送到服务器的请求,请在重现行为时查看访问日志(刷新页面或提交表单)。

典型的LAMP:tail -f /var/log/apache/access.log

nginx:tail -f /var/log/nginx/access.log