71 lines
1.9 KiB
PHP
Executable File
71 lines
1.9 KiB
PHP
Executable File
<?php
|
||
/**
|
||
* MySQL 辅助(PHP 8 兼容:禁止向 mysqli 传入 null)
|
||
*/
|
||
|
||
if (!function_exists('cloak_db_string')) {
|
||
/**
|
||
* 将任意值转为可写入 SQL 的字符串(null → 空串)
|
||
*
|
||
* @param mixed $value
|
||
*/
|
||
function cloak_db_string($value): string
|
||
{
|
||
if ($value === null) {
|
||
return '';
|
||
}
|
||
return (string) $value;
|
||
}
|
||
}
|
||
|
||
if (!function_exists('cloak_db_escape')) {
|
||
/**
|
||
* @param mysqli $conn
|
||
* @param mixed $value
|
||
*/
|
||
function cloak_db_escape(mysqli $conn, $value): string
|
||
{
|
||
return mysqli_real_escape_string($conn, cloak_db_string($value));
|
||
}
|
||
}
|
||
|
||
if (!function_exists('cloak_visitor_log_format_timing')) {
|
||
/**
|
||
* @param mixed $raw JSON 或已格式化的摘要
|
||
*/
|
||
function cloak_visitor_log_format_timing($raw)
|
||
{
|
||
$raw = trim((string) $raw);
|
||
if ($raw === '') {
|
||
return '';
|
||
}
|
||
if (!class_exists('CloakPipelineTimer', false)) {
|
||
require_once dirname(__DIR__) . '/Cloak/PipelineTimer.php';
|
||
}
|
||
$decoded = json_decode($raw, true);
|
||
if (is_array($decoded)) {
|
||
return CloakPipelineTimer::formatText($decoded);
|
||
}
|
||
return $raw;
|
||
}
|
||
}
|
||
|
||
if (!function_exists('cloak_visitor_log_apply_result_filter')) {
|
||
/**
|
||
* 日志列表 result 筛选:默认排除 wait(检测中);显式选 wait/true/false 时精确匹配
|
||
*
|
||
* @return string SQL 片段(含前导 AND)
|
||
*/
|
||
function cloak_visitor_log_apply_result_filter(mysqli $conn, $resultParam): string
|
||
{
|
||
$resultParam = trim((string) $resultParam);
|
||
if ($resultParam === 'wait') {
|
||
return " AND `result` = 'wait'";
|
||
}
|
||
if ($resultParam === 'true' || $resultParam === 'false') {
|
||
return " AND `result` = '" . cloak_db_escape($conn, $resultParam) . "'";
|
||
}
|
||
return " AND (`result` IS NULL OR `result` <> 'wait')";
|
||
}
|
||
}
|