Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][MySQL][PHP]jqGrid sortowanie polskich znaków
Forum PHP.pl > Forum > Przedszkole
cent4
Witam.
Używam obsługi tabel z danych branych z bazy MySql i mam problem z sortowaniem polskich znaków.
Tzn. np. jak są rekordy w bazie: a, b, c, ą - to literkę ą mam na końcu - a powinna być po a.
Niestety sortowania poprzez zapytanie SQL nie mogę wykonać - bo ten skrypt pracuje na AJAX'sie i sortować można dowolną kolumnę poprzez naciśnięcie jej nagłówka.
Proszę pomóżcie...
nospor
Cytat
Niestety sortowania poprzez zapytanie SQL nie mogę wykonać - bo ten skrypt pracuje na AJAX'sie i sortować można dowolną kolumnę poprzez naciśnięcie jej nagłówka.
No i właśnie AJAX polega na tym, że leci na serwer do Twojego skryptu php gdzie wykonujesz swoje zapytanie SQL. Więc nie ma żadnego problemu z tym co chcesz zrobić bo czy stronicowanie czy sortowanie tak czy siak przechodzi przez php a co za tym idzie przez SQL
cent4
No ok - tylko jak to zpiąć i gdzie szukać funkcji, która sortuje?
Bo strona korzysta tylko z biblioteki: jquery-1.4.2.min.js ?
Jakie polecenia php z MySql mam zastosować i gdzie je podpiąć?
nospor
Przecież na stronie jqGRID masz masę przykładów które pokazują zarówno kod js oraz php i mysql jaki należy użyć by daną rzecz wykonać.
cent4
Czytam i przeglądam manuala już parę godzin i nie wiem jak zrobić polskie sortowanie :-(

Czy ktoś ma pomysł jak posortować polskie znaki poprzez mysql?
nospor
Jesli ci mysql nie sortuje polskich znaków, znaczy ze masz zwalone collation
Jesli uzywasz utf8 to dla kolumny po której sortujesz masz ustawic collation na utf8-polish-ci
cent4
Problem w tym nospor, że tak to jest ustawione...
nospor
Masz to gdzies wystawione? Bo mi się nie chce wierzyć że ty przy sortowaniu ajaxa uzywasz
cent4
Dzięki uprzejmości znajomego podłączyłem to na: http://www.infocent.pl/!projekty/cent4/myfirstgrid.html


i jak?
nospor
Jest tak jak mówiłem - przy sortowaniu w ogóle nie używasz AJAXA czyli nie pobierasz rekordów bazy a są sortowanie jedynie przez js.
CZy ja nie wyraźnie mówiłem, że ma być AJAX? Ze ma być to zwracane przez mysql? Ale oczywiscie ty w zaparte ze wszystko zawsze idzie przez mysql :/
I weź tu człowieku pomagaj, jak prostej komendy nie rozumieją... Jak nie wiesz kiedy masz ajax a kiedy nie to sobie zainstaluj FIREBUG dla firefoxa bo inaczej to nawet niemamy co rozmawiać gdy ty nie wiesz kiedy masz AJAXa i kiedy używasz bazy a kiedy nie :/
cent4
No ok, a tak jak to jest - przez sortowanie javascript da się to porządkować właściwie?
nospor
Szczerze to nie wiem. Nie miałem potrzeby się nigdy nad tym zastanawiać. Ja używam grida do danych, których zawsze jest kilka stron. Sortowanie więc danych przez js, które zajmują kilka stron, mija się z jakimkolwiek sensem, gdyż wówczas będzie sortowana tylko dana strona a nie wszystkie dane.

Jeśli więc i ty masz zamiar mieć tam danych na kilka stron, więc lepiej włącz tryb AJAXA smile.gif
cent4
skoro robiłeś to w gridzie to może zdradzisz mi jak mam to zrobić z ajaxem? Bo to co zrobiłem, co wisi na stronie to wziąłem z manuala, a szczerze mówiąc nie mam pojęcia jak to zrobić poprzez ajaxa?
Tak masz rację - danych będzie kilka stron :-)
nospor
To miałeś cholerny niefart, bo wziąłeś akurat przykład, który naraz ładuje wszystko tongue.gif
Z dziesiątków przykładów u nich na stronie chyba tylko ten jeden jest taki i ty akurat musiałeś go wziąść wink.gif

loadonce:true,
albo to wywal, albo ustaw na false.

Być może jeszcze coś będziesz musiał zmienić. Nawwalałeś tych parametrów, niektóre pierwszy raz widzę na oczy
cent4
2 sprawy:
1. Dzięki wielkie - chyba już działa odpowiednio bo sortowanie się inaczej zachowuje - czy teraz wygląda Ci to w porządku?
2. Dlaczego "dziwnie sortuje" tzn. ą przed a?

3. siadło też wyszukiwanie - filtry u góry :-( - będę musiał nad tym popracować :-(
nospor
ąa pewnie dlatego, ze jednak nie masz collate utf-polish-ci wink.gif
Co do filtrowania to pewnie też w zapytaniu nie uwzględniasz wyszukiwania. Do tej pory ci dzialalo, bo to js filtrowal. teraz skoro masz ajax to zapytanie ma filtrowac
cent4
Jesteś geniuszem - poprawiłem poprzez PhpMyAdmin kodowanie i gra :-).
Wielkie dzięki.

Ale z tym filtrowaniem będę miał problem.

Dla Ciebie to będzie 2 sekundy - jak spojrzysz.

Załączamam plik php, z którego ten plik html korzysta:

  1. <?php
  2.  
  3. include("dbconfig.php");
  4. // initialization
  5.  
  6. $page = $_GET['page']; // get the requested page
  7. $limit = $_GET['rows']; // get how many rows we want to have into the grid
  8. $sidx = $_GET['sidx']; // get index row - i.e. user click to sort
  9. $sord = $_GET['sord']; // get the direction
  10. if(!$sidx) {
  11. $sidx = 1;
  12. }
  13. $totalrows = isset($_GET['totalrows']) ? $_GET['totalrows']: false;
  14. if($totalrows) {
  15. $limit = $totalrows;
  16. }
  17. // connect to the database
  18. $db = mysql_connect($dbhost, $dbuser, $dbpassword) or die("Connection Error: " . mysql_error());
  19. mysql_select_db($database) or die("Database connection error.");
  20.  
  21. //mysql_query("SET NAMES utf8");
  22. //mysql_query("SET CHARACTER SET utf8");
  23. //mysql_query("SET collation_connection = utf8");
  24. //mysql_query("SET NAMES 'utf8' COLLATE 'utf8_polish_ci'");
  25.  
  26. //mysql_query("SET NAMES 'utf8' COLLATE 'utf8_polish_ci'");
  27. mysql_set_charset('utf8',$db);
  28.  
  29.  
  30. // get the count of rows
  31. $result = mysql_query("SELECT COUNT(*) AS count FROM users");
  32. $row = mysql_fetch_array($result, MYSQL_ASSOC);
  33. $count = $row['count'];
  34. // get the required variables
  35. if( $count>0 ) {
  36. $total_pages = ceil($count / $limit);
  37. } else {
  38. $total_pages = 0;
  39. }
  40. if ($page> $total_pages) {
  41. $page = $total_pages;
  42. }
  43. if ($limit <0) {
  44. $limit = 0;
  45. }
  46. $start = $limit * $page - $limit;
  47. if ($start <0) {
  48. $start = 0;
  49. }
  50. // get the actual stuff to be displayed in the grid
  51. $SQL = "SELECT * FROM users ORDER BY $sidx $sord LIMIT $start , $limit";
  52. $result = mysql_query($SQL) or die("Could not execute query." . mysql_error());
  53.  
  54.  
  55. // create a response array from the obtained result
  56. $response->page = $page;
  57. $response->total = $total_pages;
  58. $response->records = $count;
  59. $i = 0;
  60. while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
  61. $response->rows[$i]['id'] = $row['id'];
  62. $response->rows[$i]['cell'] = array($row['id'],$row['name'],$row['code'],$row['opis']);
  63. $i++;
  64. }
  65. // convert the response into JSON representation
  66. echo json_encode($response);
  67. // close the database connection
  68.  
  69. ?>
nospor
Nie, poprostu ty nie czytasz co się do ciebie pisze.
Powiedziałem ci wcześniej:
Cytat
Jesli uzywasz utf8 to dla kolumny po której sortujesz masz ustawic collation na utf8-polish-ci
Na co ty mi odpowiedziałeś:
Cytat
Problem w tym nospor, że tak to jest ustawione...
To jakim cudem to mogło być tak ustawione, skoro teraz piszesz, że jednak dopiero teraz to ustawiłeś :/

u nich w przykładach masz wyszukiwanie. Poprostu przejrzyj ich przykłady, które w nazwie mają "search"
cent4
Już śpieszę z wyjaśnieniami - jak działało mi to lokalnie (na zainstalowanym w systemie WebServ'ie) - było ustawione na polish i faktycznie nie działało.

Teraz jak udostępnił mi znajomy serwer www i to powiesiłem - nie było to ustawione i dlatego to zmieniłem i teraz jest efekt.

Nie wiem, dlaczego wyeksportowana baza tego ustawienia nie miała.

Na lokalnym komputerze dalej to mam i mam ustawione polish - więc nie wiem dlaczego po pierwsze, źle się to wyeksportowało i źle zaimportowało - może to inaczej działa jako serwer lokalny a inaczej na normalnym serwerze, ale na tym się nie znam.
nospor
Ok, wyjaśnienie przyjęte smile.gif
cent4
OK :-).
Cieszę się.
A jakaś podpowiedź odnośnie wylistowanego pliku php i prawidłowego działania filtra?
nospor
Podpowiedź dostałeś w przedostatnim poście. No dobrze, zacytuję ci ją, byś nie musiał szukac
Cytat
u nich w przykładach masz wyszukiwanie. Poprostu przejrzyj ich przykłady, które w nazwie mają "search"
smile.gif
cent4
Czyli muszę szukać :-(. To trochę mi zajmie...
nospor
http://trirand.com/blog/jqgrid/jqgrid.html
Znalezienie na tej liście przykładów ze słowem "search" w nazwie to dwie minuty roboty.
cent4
Nie no - to to zajmie nawet parę sekund - cały szkopuł polega na tym, że trzeba wiedzieć co zmienić :-(

Dlaczego przy włączonym: loadonce:true, wszystko z filtrowaniem działa :-(? Wiem, że wtedy filtruje javascript, a nie mysql, ale jak to przestawić żeby filtrował mysql?

już mi ręce opadają :-(

Już na prawdę nie wiem co robić - proszę pomóżcie...

to mój html:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  4. <title>jqGrid Demo</title>
  5. <link type="text/css" href="css/ui.jqgrid.css" rel="stylesheet" />
  6. <link type="text/css" href="css/jquery-ui-1.8.9.custom.css" rel="stylesheet" />
  7. <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
  8. <script type="text/javascript" src="js/jquery-ui-1.8.9.custom.min.js"></script>
  9. <script type="text/javascript" src="js/i18n/grid.locale-en.js"></script>
  10. <script type="text/javascript" src="js/jquery.jqGrid.min.js"></script>
  11.  
  12. <script type="text/javascript">
  13. jQuery('document').ready(function() {
  14. jQuery("#users").jqGrid({
  15. url:'example.php',
  16. datatype: "json",
  17. height: 255,
  18. width: 600,
  19. colNames:['ID','Name', 'Code','Opis'],
  20. colModel:[
  21. {name:'id',index:'id', width:65, sorttype:'int'},
  22. {name:'name',index:'name', width:150},
  23. {name:'code',index:'code', width:100},
  24. {name:'opis',index:'opis', width:100}
  25. ],
  26. rowNum:50,
  27. rowTotal: 2000,
  28. rowList : [20,30,50],
  29. //loadonce:true,
  30. mtype: "GET",
  31. rownumbers: true,
  32. rownumWidth: 40,
  33. gridview: true,
  34. pager: '#usersPage',
  35. sortinvid: 'id',
  36. viewrecords: true,
  37. sortorder: "asc",
  38. caption: "Toolbar Searching"
  39. });
  40. jQuery("#users").jqGrid('navGrid','#ptoolbar',{del:false,add:false,edit:false,search:false});
  41. jQuery("#users").jqGrid('filterToolbar',{stringResult: true,searchOnEnter : true});
  42. });
  43. </script>
  44.  
  45.  
  46. </head>
  47. <body>
  48. <script type="text/javascript" src="users.js"></script>
  49. <h2>jqGrid Example</h2>
  50. <!--Your grid will be diplayed here-->
  51. <table id="users"></table>
  52. <div id="usersPage"></div>
  53. <!--End of grid-->
  54. </center>
  55. </body>
  56. </html>


a to mój php:
  1. <?php
  2.  
  3. include("dbconfig.php");
  4. // initialization
  5.  
  6. $page = $_GET['page']; // get the requested page
  7. $limit = $_GET['rows']; // get how many rows we want to have into the grid
  8. $sidx = $_GET['sidx']; // get index row - i.e. user click to sort
  9. $sord = $_GET['sord']; // get the direction
  10. if(!$sidx) {
  11. $sidx = 1;
  12. }
  13.  
  14. $totalrows = isset($_GET['totalrows']) ? $_GET['totalrows']: false;
  15. if($totalrows) {
  16. $limit = $totalrows;
  17. }
  18. // connect to the database
  19. $db = mysql_connect($dbhost, $dbuser, $dbpassword) or die("Connection Error: " . mysql_error());
  20. mysql_select_db($database) or die("Database connection error.");
  21.  
  22. mysql_set_charset('utf8',$db);
  23.  
  24. // get the count of rows
  25. /*$result = mysql_query("SELECT COUNT(*) AS count FROM users");
  26. $row = mysql_fetch_array($result, MYSQL_ASSOC);
  27. $count = $row['count'];
  28. // get the required variables
  29. if( $count>0 ) {
  30. $total_pages = ceil($count / $limit);
  31. } else {
  32. $total_pages = 0;
  33. }
  34. if ($page> $total_pages) {
  35. $page = $total_pages;
  36. }
  37. */
  38. if ($limit <0) {
  39. $limit = 0;
  40. }
  41. $start = $limit * $page - $limit;
  42. if ($start <0) {
  43. $start = 0;
  44. }
  45. // get the actual stuff to be displayed in the grid
  46. $SQL = "SELECT * FROM users ORDER BY $sidx $sord LIMIT $start , $limit";
  47. $result = mysql_query($SQL) or die("Could not execute query." . mysql_error());
  48.  
  49.  
  50. // create a response array from the obtained result
  51. $response->page = $page;
  52. $response->total = $total_pages;
  53. $response->records = $count;
  54. $i = 0;
  55. while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
  56. $response->rows[$i]['id'] = $row['id'];
  57. $response->rows[$i]['cell'] = array($row['id'],$row['name'],$row['code'],$row['opis']);
  58. $i++;
  59. }
  60. // convert the response into JSON representation
  61. echo json_encode($response);
  62. // close the database connection
  63.  
  64. ?>



I jak tam?
Ma ktoś jakiś pomysł?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.