Tablesorter:过滤和 Ajax 寻呼机问题
Tablesorter: Filtering and Ajax Pager Issues
当过滤器小部件和寻呼机插件启用时,我注意到 tablesorter
有奇怪的行为。场景如下:
我有一个 table,总共有 366 个条目,我已经应用了过滤器小部件和寻呼机插件。下面是我正在操作的 table 数据集的片段。
例如,我通过 Register BIN_d_USE_RBLKS\s
过滤结果(其中 \s 只是表示我在搜索中包含了一个白色 space 字符)...
如下面的屏幕截图所示,显示的筛选结果与之前显示的结果没有变化。然而,寻呼机已准确更新(如左上角所示)Ajax 查询表明没有匹配这些搜索参数的结果。
理想情况下,过滤搜索 return 是一个空集,但事实并非如此。我怎样才能解决这个问题?是否缺少我的设置?
更新 1
我知道寻呼机将核心 config.serverSideSorting
选项和 filter_serversideFiltering
小部件选项都设置为 true。这意味着服务器负责根据寻呼机传递给服务器的过滤条件对数据进行排序。以下是用于生成 Ajax 响应的 PHP 服务器端代码片段。
$page = $_GET['page'];
$size = $_GET['size'];
$design_filter = stripslashes($_GET['filter'][0]);
$reg_filter = stripslashes($_GET['filter'][1]);
// row entry offset.
$offset = $page*$size;
try {
$con = new PDO( "mysql:host=$host;dbname=$dbname", $username, $passwd);
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// If the filter is surrounded in quotes, treat it literally. Otherwise,
// match it as a substring.
$quote_regex = '/^([\"\']).*$/m';
$literal_design = preg_match($quote_regex, $design_filter);
$literal_reg = preg_match($quote_regex, $reg_filter);
// both filters specify literal interpretation
if ($literal_design && $literal_reg)
{
SELECT SOMETHING
}
// only treat design filter as a literal
if ($literal_design && !$literal_reg)
{
SELECT SOMETHING
}
// only treat register filter as a literal
if (!$literal_design && $literal_reg)
{
SELECT SOMETHING
}
// no filters are literals
if (!$literal_design && !$literal_reg)
{
SELECT SOMETHING
}
// get the page and size limited entries
$stmt = $con->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
$result = $con->query("SELECT FOUND_ROWS()")->fetch();
$total_rows = $result['FOUND_ROWS()'];
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"), "rows" => array());
foreach ($rows as $row) {
$reg_rule = array("Design" => $row['design_id'], "Register" => $row['data_register']);
array_push($data_payload['rows'], $reg_rule);
}
$json_payload = json_encode($data_payload);
echo $json_payload;
我还通过手动检查 SQL 查询验证过滤器适当地限制了来自数据库的 returned 响应。我的过滤效果很好,除了上面提到的情况。
更新 2
如果没有数据匹配搜索过滤器,服务器不应在 JSON 中使用 rows
字段进行响应。
// get the page and size limited entries
$stmt = $con->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
$result = $con->query("SELECT FOUND_ROWS()")->fetch();
$total_rows = $result['FOUND_ROWS()'];
if ($total_rows == 0)
{
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"));
echo json_encode($data_payload);
} else {
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"), "rows" => array());
foreach ($rows as $row) {
$reg_rule = array("Design" => $row['design_id'], "Register" => $row['data_register']);
array_push($data_payload['rows'], $reg_rule);
}
$json_payload = json_encode($data_payload);
echo $json_payload;
}
这确保当搜索在数据库服务器端没有匹配条目时,过滤器小部件将清除 table。我没有在文档中的任何地方看到它,我强烈建议在某处添加它。这会节省我几个小时的时间。
当使用带 ajax 的寻呼机时,寻呼机设置了两个核心 config.serverSideSorting
option and the filter_serversideFiltering
widget option to true
(src) 因为如果没有服务器的输出,客户端无法执行这些功能,或者有客户端的整个数据库,但是你不需要 ajax.
服务器应该对数据库进行排序,并使用 ajax 请求提供的过滤器和 return 将结果发送给寻呼机 ajax 函数进行显示。
如果没有数据匹配搜索过滤器,服务器不应在 JSON 中使用 rows
字段进行响应。
// get the page and size limited entries
$stmt = $con->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
$result = $con->query("SELECT FOUND_ROWS()")->fetch();
$total_rows = $result['FOUND_ROWS()'];
if ($total_rows == 0)
{
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"));
echo json_encode($data_payload);
} else {
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"), "rows" => array());
foreach ($rows as $row) {
$reg_rule = array("Design" => $row['design_id'], "Register" => $row['data_register']);
array_push($data_payload['rows'], $reg_rule);
}
$json_payload = json_encode($data_payload);
echo $json_payload;
}
这确保当搜索在数据库服务器端没有匹配条目时,过滤器小部件将清除 table。我没有在文档中的任何地方看到它,我强烈建议在某处添加它。这会节省我几个小时的时间。
当过滤器小部件和寻呼机插件启用时,我注意到 tablesorter
有奇怪的行为。场景如下:
我有一个 table,总共有 366 个条目,我已经应用了过滤器小部件和寻呼机插件。下面是我正在操作的 table 数据集的片段。
例如,我通过 Register BIN_d_USE_RBLKS\s
过滤结果(其中 \s 只是表示我在搜索中包含了一个白色 space 字符)...
如下面的屏幕截图所示,显示的筛选结果与之前显示的结果没有变化。然而,寻呼机已准确更新(如左上角所示)Ajax 查询表明没有匹配这些搜索参数的结果。
理想情况下,过滤搜索 return 是一个空集,但事实并非如此。我怎样才能解决这个问题?是否缺少我的设置?
更新 1
我知道寻呼机将核心 config.serverSideSorting
选项和 filter_serversideFiltering
小部件选项都设置为 true。这意味着服务器负责根据寻呼机传递给服务器的过滤条件对数据进行排序。以下是用于生成 Ajax 响应的 PHP 服务器端代码片段。
$page = $_GET['page'];
$size = $_GET['size'];
$design_filter = stripslashes($_GET['filter'][0]);
$reg_filter = stripslashes($_GET['filter'][1]);
// row entry offset.
$offset = $page*$size;
try {
$con = new PDO( "mysql:host=$host;dbname=$dbname", $username, $passwd);
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// If the filter is surrounded in quotes, treat it literally. Otherwise,
// match it as a substring.
$quote_regex = '/^([\"\']).*$/m';
$literal_design = preg_match($quote_regex, $design_filter);
$literal_reg = preg_match($quote_regex, $reg_filter);
// both filters specify literal interpretation
if ($literal_design && $literal_reg)
{
SELECT SOMETHING
}
// only treat design filter as a literal
if ($literal_design && !$literal_reg)
{
SELECT SOMETHING
}
// only treat register filter as a literal
if (!$literal_design && $literal_reg)
{
SELECT SOMETHING
}
// no filters are literals
if (!$literal_design && !$literal_reg)
{
SELECT SOMETHING
}
// get the page and size limited entries
$stmt = $con->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
$result = $con->query("SELECT FOUND_ROWS()")->fetch();
$total_rows = $result['FOUND_ROWS()'];
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"), "rows" => array());
foreach ($rows as $row) {
$reg_rule = array("Design" => $row['design_id'], "Register" => $row['data_register']);
array_push($data_payload['rows'], $reg_rule);
}
$json_payload = json_encode($data_payload);
echo $json_payload;
我还通过手动检查 SQL 查询验证过滤器适当地限制了来自数据库的 returned 响应。我的过滤效果很好,除了上面提到的情况。
更新 2
如果没有数据匹配搜索过滤器,服务器不应在 JSON 中使用 rows
字段进行响应。
// get the page and size limited entries
$stmt = $con->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
$result = $con->query("SELECT FOUND_ROWS()")->fetch();
$total_rows = $result['FOUND_ROWS()'];
if ($total_rows == 0)
{
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"));
echo json_encode($data_payload);
} else {
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"), "rows" => array());
foreach ($rows as $row) {
$reg_rule = array("Design" => $row['design_id'], "Register" => $row['data_register']);
array_push($data_payload['rows'], $reg_rule);
}
$json_payload = json_encode($data_payload);
echo $json_payload;
}
这确保当搜索在数据库服务器端没有匹配条目时,过滤器小部件将清除 table。我没有在文档中的任何地方看到它,我强烈建议在某处添加它。这会节省我几个小时的时间。
当使用带 ajax 的寻呼机时,寻呼机设置了两个核心 config.serverSideSorting
option and the filter_serversideFiltering
widget option to true
(src) 因为如果没有服务器的输出,客户端无法执行这些功能,或者有客户端的整个数据库,但是你不需要 ajax.
服务器应该对数据库进行排序,并使用 ajax 请求提供的过滤器和 return 将结果发送给寻呼机 ajax 函数进行显示。
如果没有数据匹配搜索过滤器,服务器不应在 JSON 中使用 rows
字段进行响应。
// get the page and size limited entries
$stmt = $con->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
$result = $con->query("SELECT FOUND_ROWS()")->fetch();
$total_rows = $result['FOUND_ROWS()'];
if ($total_rows == 0)
{
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"));
echo json_encode($data_payload);
} else {
$data_payload = array("total_rows" => $total_rows, "headers" => array("Design", "Register"), "rows" => array());
foreach ($rows as $row) {
$reg_rule = array("Design" => $row['design_id'], "Register" => $row['data_register']);
array_push($data_payload['rows'], $reg_rule);
}
$json_payload = json_encode($data_payload);
echo $json_payload;
}
这确保当搜索在数据库服务器端没有匹配条目时,过滤器小部件将清除 table。我没有在文档中的任何地方看到它,我强烈建议在某处添加它。这会节省我几个小时的时间。