PHP 函数在未调用时执行
PHP Function Executes when not called
我的简单脚本中发生了一些非常奇怪的事情。我有一个静态函数,它从服务器传递 $_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 语句,并转到回显 "there" 的 else 语句。所以 If 语句正常工作,但是 sql 语句仍然执行,但是静态函数中的 echo 不 运行 只有 sql 准备好的语句。
服务器没有 运行 memcache、opcache 或任何其他缓存解决方案,所以不是那样。
此外,这里的代码中的其他任何地方都没有调用查询。包含的 class 不会通过任何其他函数调用静态函数。
我很困惑,非常感谢任何建议。
您可能在没有意识到的情况下发送了多个请求。如果第一个请求进入 if 语句而第二个请求没有,它将覆盖第一个 echo 并产生您看到的结果。
要检查向服务器发送了哪些请求,请在重现该行为(刷新页面或提交表单)时查看访问日志。
典型LAMP:tail -f /var/log/apache/access.log
nginx: tail -f /var/log/nginx/access.log
我的简单脚本中发生了一些非常奇怪的事情。我有一个静态函数,它从服务器传递 $_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 语句,并转到回显 "there" 的 else 语句。所以 If 语句正常工作,但是 sql 语句仍然执行,但是静态函数中的 echo 不 运行 只有 sql 准备好的语句。
服务器没有 运行 memcache、opcache 或任何其他缓存解决方案,所以不是那样。
此外,这里的代码中的其他任何地方都没有调用查询。包含的 class 不会通过任何其他函数调用静态函数。
我很困惑,非常感谢任何建议。
您可能在没有意识到的情况下发送了多个请求。如果第一个请求进入 if 语句而第二个请求没有,它将覆盖第一个 echo 并产生您看到的结果。
要检查向服务器发送了哪些请求,请在重现该行为(刷新页面或提交表单)时查看访问日志。
典型LAMP:tail -f /var/log/apache/access.log
nginx: tail -f /var/log/nginx/access.log