未能执行数据表搜索

Posted

技术标签:

【中文标题】未能执行数据表搜索【英文标题】:Failed to perform datatable search 【发布时间】: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 参数进行搜索?? 【参考方案1】:

暂时将 SQL 注入风险放在一边,在过滤 Person Type 并使用 M 作为搜索词时,您没有得到正确结果的原因是:

$sWhere = " WHERE  s.id_tipo = 1";

您已声明 PersonType 过滤器参数,但随后您检查搜索字符串中的值:

if ( $_GET['sSearch'] != "" )

然后你覆盖 sWhere 变量,所以你现在根本没有过滤 PersonType:

$sWhere = "WHERE (";

你需要做的是:

$sWhere .=  " AND (";

我不熟悉 php,但我假设 .=+= 相同,即 $sWhere = $sWhere +

【讨论】:

hello @markpsmith 放置 .= 时,我在数据表中进行搜索时收到此错误:DataTables 警告:表 id=mitabla - JSON 响应无效。有关此错误的更多信息,请参阅datatables.net/tn/1 您必须调试查询以确保在所有字符串连接后没有拼写错误。

以上是关于未能执行数据表搜索的主要内容,如果未能解决你的问题,请参考以下文章

MS SQL执行大脚本文件时,提示“未能完成操作,存储空间不足,无法处理此命令”的解决办法

查询处理器未能为执行并行查询启动必要的线程资源啥意思

未能读取更新的 AnyLogic DB 值

未能加载的文件或程序集.怎么解决

sqlserver2005怎么执行260M的大脚本文件? 打开脚本总是报“未能完成操作,存储空间不足”

未能执行目标 org.apache.maven.plugins:maven-surefire-plugin:2.10:test