![]() |
![]() ![]() |
![]() |
-Mesajah- |
![]()
Post
#1
|
Goście ![]() |
Witam,
Mam taki kodzik:
W $aResults[] (po translacji strlower) pojawiają mi się zdublowane rekordy. Chciałbym pozbyć się wszystkich powtórzeń i zostawić tylko unikalne elementy. Jak to zrobić najlepiej ? BTW A czy można w zapytaniu użyć distincta który jest case insensitive ? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 61 Dołączył: 20.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
Sprawdź jaki masz metodę porównywania tekstu ustawioną dla tej kolumny. Jeśli kończy się na "_ci" (np. utf8_general_ci), to jest case insensitive. Jeśli kończy się na "_cs" albo "_bin" (np. latin1_general_cs, utf8_bin) to jest case sensitive.
Metodę porównywania napisów kolumny możesz zmienić przez ALTER TABLE, albo zdefiniować bezpośrednio w zapytaniu:
Ale pamiętaj, że DISTINCT odnosi się do całego wiersza, więc jeśli przy okazji pobierasz jakieś ID, czy inne kolumny, to może nie działać jakbyś się tego spodziewał. PS. Zabezpieczenie w postaci mysql_real_escape_string( $input ), podczas gdy większa część zapytania pochodzi bezpośrednio z $_GET wygląda tak: http://3.bp.blogspot.com/_6B8tPuW7TwQ/TQim...0/peclogate.jpg -------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 107 Pomógł: 30 Dołączył: 19.02.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Po odczycie z bazy danych usuwasz z treści minusy i (jak sądzę) dopiero wtedy powstają powtórzenia.
Dlatego słowo DISTINCT w SQL'u to nie to czego trzeba. Usuwać powtórzenia trzeba dopiero gdy one powstaną, czyli po modyfikacji wczytanych danych. Załatwia to funkcja array_unique(). |
|
|
-Mesajah- |
![]()
Post
#4
|
Goście ![]() |
Próbowałem z tym array_unique() ale coś mi nie idzie.
W którym miejscu to wstawić ? Zrobiłem tak:
Ale nie działa ... Gdy zamienię ostatnią linijkę na: ale dalej mam powtórzenia. Jak to poprawić ? |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 107 Pomógł: 30 Dołączył: 19.02.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Kolejność jest taka:
1. Najpierw w pętli gromadzisz dane w tablicy (usuwając minusy). 2. Dopiero po pętli robisz: $aResults = array_unique($aResults); |
|
|
-Mesajah- |
![]()
Post
#6
|
Goście ![]() |
Zrobiłem tak jak mówisz i po pętli dałem array_unique:
jednak wciąż nie działa :/ |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 107 Pomógł: 30 Dołączył: 19.02.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Przeoczyłem, że elementami $aResults nie są "zwykłe" stringi, ale tablice.
Proponuję taką kolejność: 1. W pętli dodawaj do innej tablicy (np. $rob) same stringi: 2. Po pętli usuń powtórzenia: 3. Dopiero wtedy pobieraj z $rob kolejne stringi i zmontuj tablicę - wynik:
Ten post edytował Valdi_B 5.03.2011, 11:03:25 |
|
|
-Mesajah- |
![]()
Post
#8
|
Goście ![]() |
Zrobiłem tak jak mówiłeś:
Jednak wciąż mam powtórzenia (dokłdnie takie jak wcześńiej). Czy coś robię nie tam ? |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 107 Pomógł: 30 Dołączył: 19.02.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Jestem zaskoczony. Sprawdziłem Twój kod na swoich przykładowych danych i (w mnie) powtórzenia się eliminują.
Podejrzenie: A może gdzieś na początku pola masz spację? (końcowe spacje nie powinny mieć znaczenia, bo baza danych je "obcina"). Dla sprawdzenia zmień pętlę na: i dla powtarzających się tekstów porównaj "dlug". Edit: Zrobiłem jeszcze eksperyment ze wstawieniem do tekstów polskich liter i widzę, że: 1. Domyślnym kodowaniem po mysql_connect(...) jest latin1, natomiast ja mam i bazę i stronę w UTF-8. Po otwarciu b.d. należy dać: mysql_set_charset('utf8'); 2. Przekodowanie na małe litery trzeba robić przez mb_strtolower($row2, 'UTF-8'); Zwykła funkcja strtolower(...) wstawia za polskie znaki "?". Może już sam do tego doszedłeś, ale na wszelki wypadek - wspominam o tym. Ten post edytował Valdi_B 7.03.2011, 13:05:10 |
|
|
-Mesajah- |
![]()
Post
#10
|
Goście ![]() |
1. Pomijam kwestie ogonków bo to już inna sprawa (baze mam w utf, ale akurat tą tabele w latin2 a strona znowu utf;)), ale
nawet przy typowo angielskich nazwach są powtórzenia. 2. Nie mogę wyświetlić danych za pomocą print_r, gdyż skrypt działa jakby ajaxowa podpowiedź na stronie, i gdy go wywołuje z parametrem to dostaje 1000 błędów, a bezpośrednio nie widzę co zwraca print_r. 3. Może wpływ na wszystko ma dalsza część kodu, której nie podałem:
Czy ta dalsza część może coś zmieniać ? BTW Cytat Zabezpieczenie w postaci mysql_real_escape_string( $input ), podczas gdy większa część zapytania pochodzi bezpośrednio z $_GET wygląda tak: http://3.bp.blogspot.com/_6B8tPuW7TwQ/TQim...0/peclogate.jpg Dobre ;] |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 107 Pomógł: 30 Dołączył: 19.02.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Rada1: Jak sprawdzić, czy w polu "x" są pocz. spacje:
SELECT * FROM <tabela> WHERE substr(x, 1, 1) = " " Uruchom taką kwerendę (np. spod phpMyAdmin'a). Rada 2: Zmień $row2=$row[$_GET['field_name']]; na $row2 = 'x' . $row[$_GET['field_name']]; Wtedy ew. pocz. spacja w treści będzie widoczna. Alternatywa: zamień na $row2=trim($row[$_GET['field_name']]); to obetniesz ew. pocz. spacje. Rada 3: Zamiast "zwykłego" print_r($rob); zrób $xx = print_r($rob, true); Zmienną $xx zapisz do jakiegoś pliku. Potem podejrzyj ten plik. Rada 4: Zrób z tego fragmentu kodu oddzielny plik i uruchom jako "normalną" stronę (a nie spod Ajax'a). Wtedy będziesz mógł wstawić dowolne print_r. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 05:01 |