2017-08-10 70 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