在 DataTables 服务器端处理脚本中运行 MySQL 查询

Posted

技术标签:

【中文标题】在 DataTables 服务器端处理脚本中运行 MySQL 查询【英文标题】:Run MySQL query in DataTables server-side processing script 【发布时间】:2017-02-07 06:43:07 【问题描述】:

我正在使用DataTables server-side processing 将数据从 mysql 表中提取到 DataTables 表中。

这是我想在我的 DataTables 表中运行和显示的有效 MySQL 查询:

$sql = "SELECT Client,EstimateNumber,Status,TotalEstimatedTime,CostToDateRoleTotal,ROUND((CostToDateRoleTotal/TotalEstimatedTime)*100) as PercentComplete FROM Estimates WHERE " . ($studioName != null ? "Studio = '" . $studioName. "' AND" : '') . " Status != 'Invoiced' AND Status != 'Cancelled' AND TotalEstimatedTime > 0 AND CostToDateRoleTotal > 0 ORDER BY PercentComplete DESC";

我已将 DataTables 服务器端处理脚本调整为:

<?php

// connection configuration
require_once 'config.php';

// db table to use
$table = 'Estimates';

// table's primary key
$primaryKey = 'EstimateNumber';

$percent_complete = "('CostToDateRoleTotal'/'TotalEstimatedTime')*100";

// array of database columns which should be read and sent back to DataTables.
// the 'db' parameter represents the column name in the database, while the 'dt'
// parameter represents the DataTables column identifier.
$columns = array(
array('db' => 'Client', 'dt' => 0),
array('db' => 'EstimateNumber', 'dt' => 1),
array('db' => 'Status', 'dt' => 2),
array('db' => 'TotalEstimatedTime', 'dt' => 3),
array('db' => 'CostToDateRoleTotal', 'dt' => 4),
array('db' => $percent_complete, 'dt' => 4),
); // end columns array

// sql server connection information
$sql_details = array(
'user' => $currentConfig['user'],
'pass' => $currentConfig['pass'],
'db' => $currentConfig['name'],
'host' => $currentConfig['host'],
);

// DataTables helper class
require 'ssp.class.php';

function utf8ize($d) 
if (is_array($d)) 
    foreach ($d as $k => $v) 
        $d[$k] = utf8ize($v);
    
 else if (is_string ($d)) 
    return utf8_encode($d);

return $d;



$data = SSP::complex($_GET, $sql_details, $table, $primaryKey, $columns, null, "Status != 'Invoiced' AND Status != 'Cancelled' AND TotalEstimatedTime > 0 AND CostToDateRoleTotal > 0");

echo json_encode(utf8ize($data));

这行报错了:

$percent_complete = "('CostToDateRoleTotal'/'TotalEstimatedTime')*100";

错误是:"error":"出现 SQL 错误:SQLSTATE[42S22]: Column not found: 1054 Unknown column '('CostToDateRoleTotal'/'TotalEstimatedTime')*100' in 'field list'"

在上面的原始$sql 查询中,我运行了这个计算并将结果显示为一个新列$percent_complete。我试图在我的 DataTables 表中显示相同的结果。如何更改我的服务器端处理脚本以执行此计算并将其显示在新列中?

【问题讨论】:

只需从您的 percent_complete 中删除 '。检查下面由 mike 提供的答案。 【参考方案1】:

原因

ssp.class.php 中定义的类 SSP 无法处理列别名、表达式或 JOIN。

解决方案

您需要更改 ssp.class.php 并删除所有转义列和表名称的 `(反引号)字符。如果名称是保留字,您将负责自己转义列/表名称。

然后替换

array('db' => $percent_complete, 'dt' => 4)

array('db' => 'ROUND((CostToDateRoleTotal/TotalEstimatedTime)*100)', 'dt' => 4)

【讨论】:

感谢您的回复。如果我从 ssp.class.php 中删除反引号,我是否需要更改我的服务器端处理脚本以使我的列/表名称周围有反引号? @LizBanach,仅当您使用保留关键字的名称时,但您使用的名称(ClientEstimateNumber 等)应该没问题。【参考方案2】:

我不知道 SSP 类如何格式化查询,但您可能想尝试添加“AS percent_complete”。

$percent_complete = "(CostToDateRoleTotal/TotalEstimatedTime)*100 AS percent_complete";

当您选择一个列时,它需要一个名称。

【讨论】:

不幸的是,问题不在于查询本身。类 SSP 无法处理列别名、表达式或 JOIN。

以上是关于在 DataTables 服务器端处理脚本中运行 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Ajax 的 JQuery DataTables 中使用服务器端处理

DataTables 服务器端处理 - 如何添加不是来自数据库的计算列值?

DataTables:使用多个表、分组和 html 内容加速服务器端处理?

服务器端处理后复选框在 DataTables 中不起作用

DataTables 中的服务器端处理 UTF-8 搜索

Spring 中具有服务器端处理的 JQuery DataTables(使用 Java 和 Thymeleaf)