在我的简单脚本中出现了一些非常奇怪的事情。我有一个静态函数,它从服务器传递$ _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或任何其他缓存解决方案,所以不是这样。
此处的代码中的其他任何地方都不会调用查询。包含类不会通过任何其他函数调用静态函数。
我感到困惑,非常感谢任何建议。
答案 0 :(得分:1)
您可能在没有意识到的情况下发送多个请求。如果第一个请求输入if语句而第二个请求没有输入,它将覆盖第一个echo并产生你看到的结果。
要检查发送到服务器的请求,请在重现行为时查看访问日志(刷新页面或提交表单)。
典型的LAMP:tail -f /var/log/apache/access.log
nginx:tail -f /var/log/nginx/access.log