Autor | Zpráva | ||
---|---|---|---|
Petr Profil |
#1 · Zasláno: 2. 10. 2024, 20:28:28
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 |
||
Časová prodleva: 3 dny
|
|||
Kajman Profil |
#2 · Zasláno: 5. 10. 2024, 11:55:03
Prosím o odkaz na živou ukázku.
|
||
Petr Profil |
#3 · Zasláno: 7. 10. 2024, 18:15:52
Kajman:
Posílám link na kód výpis datatable + tabulku mysgl fotoas.cz/datatable.zip |
||
Kajman Profil |
#4 · Zasláno: 7. 10. 2024, 19:22:15
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 |
#5 · Zasláno: 7. 10. 2024, 20:08:40
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 * |
#6 · Zasláno: 7. 10. 2024, 21:19:48
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 |
#7 · Zasláno: 8. 10. 2024, 12:38:31
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'])."%' "; 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 |
#8 · Zasláno: 8. 10. 2024, 13:41:05
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 * |
#9 · Zasláno: 8. 10. 2024, 13:52:31
Petr:
Jak vypadá ten dotaz, který padá? echo $sql;
|
||
Petr Profil |
#10 · Zasláno: 8. 10. 2024, 14:10:16
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 |
#11 · Zasláno: 8. 10. 2024, 14:14:36
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 |
#12 · Zasláno: 8. 10. 2024, 14:35:55
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 * |
#13 · Zasláno: 8. 10. 2024, 14:45:27
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 |
#14 · Zasláno: 8. 10. 2024, 15:23:47
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 * |
#15 · Zasláno: 8. 10. 2024, 15:25:49
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 |
#16 · Zasláno: 8. 10. 2024, 15:35:24
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 * |
#18 · Zasláno: 8. 10. 2024, 16:48:26
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 |
#19 · Zasláno: 10. 10. 2024, 20:30:57
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 |
#20 · Zasláno: 11. 10. 2024, 10:14:31
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 ;-) |
||
Časová prodleva: 1 měsíc
|
0