2017-08-10 68 views
0

我目前使用数据表插件来动态列出我为我正在使用的系统所做的表数据。无法执行数据表搜索

目前我已经阅读了足够的插件,我没有很多问题使用它,但今天我遇到了一个大问题。有一个数据表按特定类型列出人,一切都很好,以我所指出的类型(本例中是一个人)向我显示信息,但是我感到惊讶的是,在进行搜索时,通过将字母“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]; 

我对搜索的情况有点担心,因为没有其他数据应显示。也许这是一件愚蠢的事情,但我真的无法解决它,这就是为什么我在寻求帮助。

+0

了解准备好的发言,以防止SQL注入 – Jens

+0

**的所有代码首先是容易受到SQL注入** 数据表发送包含海中的参数你可以使用这个参数和你想允许搜索的所有列离子。 –

+0

但是,这可以放在sSearch中,以便在搜索时只根据sWhere参数进行搜索? – rodrigo2324

回答

0

把SQL注入风险一面,现在,在Person Type过滤和使用M作为搜索词,当你没有得到正确的结果的原因是这样的:

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

声明该PersonType过滤参数,但你检查在搜索字符串的值:

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

然后你覆盖sWhere变量,所以你现在未过滤的PersonType可言:

$sWhere = "WHERE ("; 

你需要做的是这样的:

$sWhere .= " AND ("; 

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

+0

hello @markpsmith放置。= AND时,我在执行搜索时在数据表中出现此错误:DataTables警告:table id = mitabla - 无效的JSON响应。有关此错误的更多信息,请参阅http://datatables.net/tn/1 <---如果有某些内容写得不好或者存在于数据源代码中,则会出现此错误。如果我只输入AND,虽然我有一个单人类型1,但要写另一个名字,我发现它是因为它们存在于人员数据库中... – rodrigo2324

+0

您必须调试查询以确保没有输入错误它毕竟是字符串连接。 – markpsmith