Autor Zpráva
Petr
Profil
Dobrý den, mám vytvořenou DataTable. Nefunguje mi vyhledávání v tabulce. Jakým způsobem lze rozšířit vyhledávání více sloupců. Pokud mám tabulku ze třemi sloupci, vyhledávání funguje bez chyb. Pokud mám s více sloupců než tři. A zadám nějaký vyraz s háčkem vykazuje mi tabulka chybu.
Kde může být problém? Domnívám se, že musí nastavit rozmezí počet sloupců, kde se má hledat. Může mi někdo poradit.

Chybová hláška:
DataTables warning: table id=kalendar-akce-my - Invalid JSON response. For more information about this error, please see datatables.net/tn/1

Děkuji
Kajman
Profil
Prosím o odkaz na živou ukázku.
Petr
Profil
Kajman:
Posílám link na kód výpis datatable + tabulku mysgl fotoas.cz/datatable.zip
Kajman
Profil
Zip soubor není živá ukázka. Přečtěte si ještě jednou odkazované povídání o tom, co živá ukázka je. Bez toho se nejspíše rady nedočkáte.
Petr
Profil
Kajman:
Vytvořil jsem živou ukázku data.fotoas.cz/xx7/index.php Jde mi o vyhledávání. Když hledaný Výraz obsahuje např. Město Aš nebo jiný výraz z diagretika, tak vyskočí chyba, pokud hledaná výraz bez diagretiky.
Náhled chyby

<?php
/* Database connection start */
$servername = "";
$username = "";
$password = "";
$dbname = "";

$conn = mysqli_connect($servername, $username, $password, $dbname) or die("Connection failed: " . mysqli_connect_error());
mysqli_set_charset($conn,"utf8");





// storing  request (ie, get/post) global array to a variable  
$requestData= $_REQUEST;

$columns = array(
 
    0 => 'datum',
    1 => 'cas',
    2 => 'poradatel',
    3 => 'misto',
    4 => 'akce'
);

// getting total number records without any search
$sql = "SELECT id, datum, cas, poradatel, misto, akce ";
$sql.=" FROM FOTOAS_akce2 ";
$query=mysqli_query($conn, $sql) or die("data.php: NACTENI MYSGL TABULKY RZH-SONGS-MY DO DATATABLE");
$totalData = mysqli_num_rows($query);
$totalFiltered = $totalData;  // when there is no search parameter then total number rows = total number filtered rows.

$sql = "SELECT id, datum, cas, poradatel, misto, akce ";
$sql.=" FROM FOTOAS_akce2 WHERE 1=1";
if( !empty($requestData['search']['value']) ) 
{   
    $sql.=" AND ( datum LIKE '".$requestData['search']['value']."%' ";
    
    
    
    
    $sql.=" OR cas LIKE '".$requestData['search']['value']."%' ";
    $sql.=" OR poradatel LIKE '".$requestData['search']['value']."%' ";
    $sql.=" OR misto LIKE '".$requestData['search']['value']."%' ";
    $sql.=" OR akce LIKE '".$requestData['search']['value']."%' )";
}


$query=mysqli_query($conn, $sql) or die("data.php: NACTENI MYSGL TABULKY ESHOP-OBJEDNAVKY DO DATATABLE");
$totalFiltered = mysqli_num_rows($query); // when there is a search parameter then we have to modify total number filtered rows as per search result. 
$sql.=" ORDER BY ". $columns[$requestData['order'][0]['column']]."   ".$requestData['order'][0]['dir']."  LIMIT ".$requestData['start']." ,".$requestData['length']."   ";






/* $requestData['order'][0]['column'] contains colmun index, $requestData['order'][0]['dir'] contains order such as asc/desc  */    
$query=mysqli_query($conn, $sql) or die("data.php: NACTENI MYSGL TABULKY ESHOP-OBJEDNAVKY DO DATATABLE");

$data = array();
while( $row=mysqli_fetch_array($query) ) 
{
$nestedData=array();
    
$nestedData[] = $row["datum"];
$nestedData[] = $row["cas"];
$nestedData[] = $row["poradatel"];
$nestedData[] = $row["misto"];
$nestedData[] = $row["akce"];

$nestedData[] = '<button class="btn btn-sm btn-success modal-eshop-edit" id="'.$row["id"].'" data-toggle="modal" data-target="#modal-eshop-edit" title="Editace"><i class="fa fa-edit" aria-hidden="true"></i></button>
<button class="btn btn-sm btn-danger" data-toggle="modal" data-target="#modal-eshop-delete" data-whatever="'.$row["id"].'" title="Smazat"><i class="fa fa-trash-o" aria-hidden="true"></i></button>';



$data[] = $nestedData;
}

$json_data = array(
            "draw"            => intval( $requestData['draw'] ),   // for every request/draw by clientside , they send a number as a parameter, when they recieve a response/data they first check the draw number, so we are sending same number in draw. 
            "recordsTotal"    => intval( $totalData ),  // total number of records
            "recordsFiltered" => intval( $totalFiltered ), // total number of records after searching, if there is no searching then totalFiltered = totalData
            "data"            => $data   // total data array
            );

echo json_encode($json_data);  // send data as json format
?>
anonym_
Profil *
Petr:
Zmíněný kód je náchylný na SQL injection. To je obrovský problém, ale nesouvisející s řešeným.

Nechce se mi to moc studovat, jak vypadá SQL dotaz, který do DB odchází? echo $sql;
Kajman
Profil
Ošetřením vstupů bych klidně začal, je možné, že to s řešením bude souviset. Tedy doplň všude kolem stringů ve where části escapování...
$sql.=" OR cas LIKE '".mysqli_real_escape_string($conn, $requestData['search']['value'])."%' ";
V order části kontroluj a vkládej jen povolené hodnoty a v limit části čísla přetypuj na čísla.

Dále je potřeba alespoň pro to testování vypisovat sestavený dotaz a chybou hlášku, např. přidat do toho die. V ostrém provozu jsou ty hlášky nežádoucí.

die("data.php: NACTENI MYSGL TABULKY ESHOP-OBJEDNAVKY DO DATATABLE\nerror:".mysqli_error($conn)."\nsql:".$sql);
Petr
Profil
Kajman:
Ahoj, první část jsem zkoušel upravit
$sql.=" OR cas LIKE '".mysqli_real_escape_string($conn,$requestData['search']['value'])."%' ";
$sql.=" OR poradatel LIKE '".mysqli_real_escape_string($conn,$requestData['search']['value'])."%' ";
$sql.=" OR misto LIKE '".mysqli_real_escape_string($conn,$requestData['search']['value'])."%' ";
$sql.=" OR akce LIKE '".mysqli_real_escape_string($conn,$requestData['search']['value'])."%') ";

Výsledek je stejný.

V části Order nevím přesně jak to myslíš.

Problém nastává při vyhledávání výrazu obsahující háčky a čárky, např. Město Aš nebo MěDDM Sluníčko Aš atd.
anonym_
Profil *
Petr:
Jak vypadá ten dotaz, který padá? echo $sql;
Petr
Profil
anonym:
Pro načtení:
$sql = "SELECT id, datum, cas, poradatel, misto, akce ";
$sql.=" FROM FOTOAS_akce2 ";

Pro vyhledávání
$sql = "SELECT id, datum, cas, poradatel, misto, akce ";
$sql.=" FROM FOTOAS_akce2 WHERE 1=1";
Kajman
Profil
Chceme vidět ten výsledný dotaz, který padá. Viz úprava die.

Také by se hodil výsledek
show create table FOTOAS_akce2
Petr
Profil
Kajman:
CREATE TABLE IF NOT EXISTS `FOTOAS_akce2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datum` date NOT NULL,
`cas` varchar(1000) COLLATE utf8_czech_ci NOT NULL,
`poradatel` text CHARACTER SET utf32 COLLATE utf32_czech_ci NOT NULL,
`misto` text COLLATE utf8_czech_ci NOT NULL,
`akce` text COLLATE utf8_czech_ci NOT NULL,
`obrazek` varchar(1000) COLLATE utf8_czech_ci NOT NULL,
`plakat` varchar(1000) COLLATE utf8_czech_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `datum` (`datum`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=632 ;
anonym_
Profil *
Petr:
Čteš, co ti opakovaně píšeme?

Potřebujeme vidět i ten dotaz, který padá. S vyplněnými hodnotami (s diakritikou), který do SQL posíláš.
Petr
Profil
anonym:
Čtu vaše odpovědi. Jestli to dělám správně, ale když upravím příkaz SGL show create table tak se mi nezobrazí datatabulka, jen že se načítají data v tabulce.
anonym_
Profil *
Nic, já to vzdávám. Popáté to psát už nemám sílu.

jen pod čarou, nepřijde ti divné, že píšeš SGL a funkce obsahují SQL? Nic si z toho nedělej, ne každý má na programování hlavu a třeba se ti podaří najít koníčka, s nímž budeš více kompatibilní.
Kajman
Profil
Ukázka úpravy die, aby chyba vypisovala důvod pádu dotazu i jeho kompletní sestavení, je v [#7]
Petr
Profil
Kajman:
data.php: NACTENI MYSGL TABULKY ESHOP-OBJEDNAVKY DO DATATABLE error:Illegal mix of collations for operation 'like' sql:SELECT id, datum, cas, poradatel, misto, akce FROM FOTOAS_akce2 WHERE 1=1 AND ( datum LIKE 'Mě%' OR cas LIKE 'Mě%' OR poradatel LIKE 'Mě%' OR misto LIKE 'Mě%' OR akce LIKE 'Mě%') 
N71
Profil *
Proč má sloupec "poradatel" znakovou sadu UTF32?

No… letmým pohledem to toho ZIPu je to obvyklý špagetový prasečí kód bez jakékoliv kontroly nebo bezpečnosti. Nemá cenu ho opravovat, bylo by vhodné ho zahodit a napsat znovu.

Jednu věc nechápu, Petře. Zabýváte se programováním a webovou tvorbou už 20 let (soudě podle této diskuse) a za tu dobu jste se odborně neposunul absolutně nikam. To snad není ani v lidských silách.
Kajman
Profil
Petr:
Buď můžeš sjednotit kódování u všech sloupců, nebo by snad šlo pro tu podmínku na sloupec poradatel dát do dotazu navíc collation. Doporučuje se používat utf8mb4, pokud ho tato instalace mysql databáze umí.
Kcko
Profil
N71:
Může to mít jako koníček a ještě jako vedlejší, ke kterému se dostane sporadicky z nutnosti, tak by to pak třeba odpovídalo ;-)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0