【发布时间】:2018-01-18 06:10:49
【问题描述】:
我目前正在使用 datatables 插件来动态列出我为我正在使用的系统制作的表数据。
目前我已经阅读了足够多的插件并且我使用它并没有遇到很多问题,但是今天我遇到了一个大问题。有一个按特定类型列出人员的数据表,一切正常,按我所指示的类型(在本例中为一个人)向我显示信息,但令我惊讶的是,在进行搜索时,通过放置字母“M”,数据表会自动查找表中以字母 M 开头或包含字母 M 的所有内容。我已经搜索过,但找不到如何保持必须显示信息的限制,以便它也保留在搜索。
我有以下方式显示信息和执行搜索的代码:
//Ordenacion
if ( isset( $_GET['iSortCol_0'] ) )
{
$sOrder = "ORDER BY ";
for ( $i=0 ; $i<intval( $_GET['iSortingCols'] ) ; $i++ )
{
if ( $_GET[ 'bSortable_'.intval($_GET['iSortCol_'.$i]) ] == "true" )
{
$sOrder .= $aColumnas[ intval( $_GET['iSortCol_'.$i] ) ]."
".$_GET['sSortDir_'.$i] .", ";
}
}
$sOrder = substr_replace( $sOrder, "", -2 );
if ( $sOrder == "ORDER BY" )
{
$sOrder = "";
}
}
//Filtracion
$sWhere = " WHERE s.id_tipo = 1";
if ( $_GET['sSearch'] != "" )
{
$sWhere = "WHERE (";
for ( $i=0 ; $i<count($aColumnas) ; $i++ )
{
$sWhere .= $aColumnas[$i]." LIKE '%".$_GET['sSearch']."%' OR ";
}
$sWhere = substr_replace( $sWhere, "", -3 );
$sWhere .= ')';
}
// Filtrado de columna individual
for ( $i=0 ; $i<count($aColumnas) ; $i++ )
{
if ( $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' )
{
if ( $sWhere == "" )
{
$sWhere = "WHERE ";
}
else
{
$sWhere .= " AND ";
}
$sWhere .= $aColumnas[$i]." LIKE '%".$_GET['sSearch_'.$i]."%'";
}
}
//Obtener datos para mostrar SQL queries
$sQuery = "
SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumnas))."
FROM personas p
INNER JOIN sesion s ON s.personas_cedula=p.cedula
$sWhere
$sOrder
$sLimit
";
$rResult = $mysqli->query($sQuery);
/* Data set length after filtering */
$sQuery = "
SELECT FOUND_ROWS()
";
$rResultFilterTotal = $mysqli->query($sQuery);
$aResultFilterTotal = $rResultFilterTotal->fetch_array();
$iFilteredTotal = $aResultFilterTotal[0];
/* Total data set length */
$sQuery = "
SELECT COUNT(".$sIndexColumn.")
FROM $sTabla
";
$rResultTotal = $mysqli->query($sQuery);
$aResultTotal = $rResultTotal->fetch_array();
$iTotal = $aResultTotal[0];
我有点担心搜索情况,因为不应该显示其他数据。也许这是发生了什么愚蠢的事情,但我真的无法解决它,这就是我寻求帮助的原因。
【问题讨论】:
-
了解prepared Statements以防止SQL注入
-
首先你的代码容易被SQL注入 Datatable发送一个包含搜索字符串的参数,即
sSearch,你可以使用这个参数您要允许搜索的列离子。 -
但这可以放在 sSearch 中,以便在搜索中仅根据 sWhere 参数进行搜索??
标签: php jquery mysql datatables