好的,我试图使用jQuery DataTable(DataTables.net)显示来自我的数据库的信息。 我可以让它工作得很好,显示整个表格'注释'但我想只显示尚未阅读的笔记。所以我需要以某种方式包含一个WHERE子句,但我不清楚最好的方法。
以下是我目前显示整个表格的方式:
// DB table to use
$table = 'Notes';
// Table's primary key
$primaryKey = 'CID';
// 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. In this case simple
// indexes
$columns = array(
array( 'db' => 'CID', 'dt' => 0 ),
array(
'db' => 'CID',
'dt' => 0,
'formatter' => function( $d, $row ) {
return '<a href="profile.php?search='.$d.'" target="_Blank">'.$d."</a>";
}
),
array( 'db' => 'Title', 'dt' => 1 ),
array( 'db' => 'Name', 'dt' => 2 ),
array(
'db' => 'Date',
'dt' => 3,
'formatter' => function( $d, $row ) {
return date( 'jS M y', strtotime($d));
}
)
);
// SQL server connection information
$sql_details = array(
'user' => '*DB_USER*',
'pass' => '*Password*',
'db' => '*DatabaseName*',
'host' => 'localhost'
);
require( 'ssp.class.php' );
echo json_encode(
SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns )
);
我需要相当于SELECT * FROM Notes WHERE Status ='Unread'
答案 0 :(得分:29)
您必须更改 DataTables 默认功能才能执行此操作!
使用此 ssp.class.php 自定义类
怎么用?
像这个例子一样使用:
require( 'ssp.class.php' );
$where = "Status ='Unread'";
echo json_encode(
SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns,$where )
);
如果设置参数$ where,则此类添加选择语句的位置!
更新:
2015年的DataTables增加了复杂的方法
这个新方法可以在查询中设置where子句!
答案 1 :(得分:8)
嗯..你不能不编辑或扩展SSP
。这是非常糟糕的风格,有很多复制的代码,但SSP
不允许更好的自定义...
class SSPCustom extends SSP
{
/**
* @param array $request Data sent to server by DataTables
* @param array $sql_details SQL connection details - see sql_connect()
* @param string $table SQL table to query
* @param string $primaryKey Primary key of the table
* @param array $columns Column information array
* @param string $whereCustom Custom (additional) WHERE clause
* @return array Server-side processing response array
*/
static function simpleCustom ( $request, $sql_details, $table, $primaryKey, $columns, $whereCustom = '' )
{
$bindings = array();
$db = self::sql_connect( $sql_details );
// Build the SQL query string from the request
$limit = self::limit( $request, $columns );
$order = self::order( $request, $columns );
$where = self::filter( $request, $columns, $bindings );
if ($whereCustom) {
if ($where) {
$where .= ' AND ' . $whereCustom;
} else {
$where .= 'WHERE ' . $whereCustom;
}
}
// Main query to actually get the data
$data = self::sql_exec( $db, $bindings,
"SELECT SQL_CALC_FOUND_ROWS `".implode("`, `", self::pluck($columns, 'db'))."`
FROM `$table`
$where
$order
$limit"
);
// Data set length after filtering
$resFilterLength = self::sql_exec( $db,
"SELECT FOUND_ROWS()"
);
$recordsFiltered = $resFilterLength[0][0];
// Total data set length
$resTotalLength = self::sql_exec( $db,
"SELECT COUNT(`{$primaryKey}`)
FROM `$table`
WHERE " . $whereCustom
);
$recordsTotal = $resTotalLength[0][0];
/*
* Output
*/
return array(
"draw" => intval( $request['draw'] ),
"recordsTotal" => intval( $recordsTotal ),
"recordsFiltered" => intval( $recordsFiltered ),
"data" => self::data_output( $columns, $data )
);
}
}
用以下方式调用:
echo json_encode(
SSPCustom::simpleCustom( $_GET, $sql_details, $table, $primaryKey, $columns, "Status ='Unread'" )
);
未测试
答案 2 :(得分:2)
你可以使用那样的where子句;
$data = SSP::sql_exec( $db, $bindings,
"SELECT SQL_CALC_FOUND_ROWS ".implode(", ", SSP::pluck($columns, 'db'))."
FROM $table where Status = 'Unread' // <--where clause here
$where
$order
$limit"
);
答案 3 :(得分:0)
我也能够解决这个问题,但是在ssp.class.php过滤器函数中插入了一些代码。下面是函数的列表,其中插入了示例custom where子句。 &#34;简单&#34;该课程的功能无需任何进一步的陪审团操作即可运作。它的优点是它可以很好地处理数据表的文本搜索功能。
static function filter ( $request, $columns, &$bindings )
{
$globalSearch = array();
$columnSearch = array();
$dtColumns = self::pluck( $columns, 'dt' );
if ( isset($request['search']) && $request['search']['value'] != '' ) {
$str = $request['search']['value'];
for ( $i=0, $ien=count($request['columns']) ; $i<$ien ; $i++ ) {
$requestColumn = $request['columns'][$i];
$columnIdx = array_search( $requestColumn['data'], $dtColumns );
$column = $columns[ $columnIdx ];
if ( $requestColumn['searchable'] == 'true' ) {
$binding = self::bind( $bindings, '%'.$str.'%', PDO::PARAM_STR );
$globalSearch[] = "`".$column['db']."` LIKE ".$binding;
}
}
}
// Individual column filtering
for ( $i=0, $ien=count($request['columns']) ; $i<$ien ; $i++ ) {
$requestColumn = $request['columns'][$i];
$columnIdx = array_search( $requestColumn['data'], $dtColumns );
$column = $columns[ $columnIdx ];
$str = $requestColumn['search']['value'];
if ( $requestColumn['searchable'] == 'true' &&
$str != '' ) {
$binding = self::bind( $bindings, '%'.$str.'%', PDO::PARAM_STR );
$columnSearch[] = "`".$column['db']."` LIKE ".$binding;
}
}
// Combine the filters into a single string
$where = '';
if ( count( $globalSearch ) ) {
$where = '('.implode(' OR ', $globalSearch).')';
}
if ( count( $columnSearch ) ) {
$where = $where === '' ?
implode(' AND ', $columnSearch) :
$where .' AND '. implode(' AND ', $columnSearch);
}
//------------------------------------------------------------
//############################################################
//EXAMPLE ADDITIONAL WHERE CONDITIONS HERE. THIS IS EQUIVALENT
//TO "WHERE id = 1"
$where = ($where === '') ?
"id = ".self::bind( $bindings, 1, PDO::PARAM_INT) :
$where ." AND "."id = ".self::bind( $bindings, 1, PDO::PARAM_INT);
//############################################################
//############################################################
//------------------------------------------------------------
if ( $where !== '' ) {
$where = 'WHERE '.$where;
}
return $where;
}
答案 4 :(得分:0)
万一其他人偶然发现了这一点,现在的正确答案是:
require( 'ssp.class.php' );
$where = "Status ='Unread'";
echo json_encode(
SSP::complex( $_GET, $sql_details, $table, $primaryKey, $columns, $where )
);
不需要第 3 方类,此功能内置于 DataTables 中。