Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> IF + WHERE
Endzio
post 14.07.2008, 19:05:39
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

Ostrzeżenie: (0%)
-----


Witam.
Od kilku dni bezskutecznie próbuje stworzyć skrypt newsów ze wsparciem wielojęzyczności.
Powiedzmy, że język użytkownika to "pl", a język domyślny strony to "en".
Po wejściu na stronę użytkownik powinien zobaczyć newsy w jego wybranym języku, jeśli w bazie nie istnieje news w tym języku, to zapytanie powinno zwracać newsa w domyślnej wersji językowej (en).
Wynik jest otrzymywany przez pętle i wyświetlamy wszystkie newsy z bazy.
Każdy news posiada inne `id`, ten sam news z dwiema wersjami językowymi posiada ten sam `number`.

Troszkę to zagmatwane, ale inaczej nie wyobrażam sobie tego rozwiązania. blinksmiley.gif
Próbowałem z "IF", próbowałem z "CASE", ale nic z tego nie wyszło..

Tabela z newsami wygląda tak:



  1. CREATE TABLE `news`
  2. (
  3. `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  4. `number` INT(10) UNSIGNED NOT NULL,
  5. `title` VARCHAR(100) NOT NULL,
  6. `language` CHAR(2) NOT NULL,
  7. `date` INT(11) NOT NULL,
  8. `content` TEXT NOT NULL,
  9. PRIMARY KEY (id)
  10. );


Kod PHP, który pobiera newsy z obydwóch wersji językowych wygląda tak:
  1. <?php
  2. $query = sql_query('SELECT * FROM `news`
  3. WHERE `language` = if(`language` = "en", "en", "pl") AND `number` IN(1, 2)');
  4. while ($db = mysql_fetch_array($query))
  5. {
  6. echo '<div>
  7. <strong>'.$db['number'].' - '.$db['title'].'</strong>
  8.  - '.$db['date'].'<br /><br />'.$db['content'].'
  9. </div>';
  10. }
  11. ?>


Ten post edytował Endzio 14.07.2008, 19:13:12
Go to the top of the page
+Quote Post
Pride
post 14.07.2008, 21:17:17
Post #2





Grupa: Zarejestrowani
Postów: 139
Pomógł: 11
Dołączył: 31.01.2005
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


  1. <?php
  2.  
  3. //tu zaczyna się twoje strona po includach itp dajesz:
  4. if((empty($_SESSION['lang']) and $_GET['lang'] != 'pl') or $_GET['lang'] == 'en')
  5. {
  6. $_SESSION['lang'] = 'en';
  7. }
  8. elseif($_GET['lang'] == 'pl')
  9. {
  10. $_SESSION['lang'] = 'pl';
  11. }
  12. // Tu takiś tam kod strony 
  13.  
  14. echo '<a href="'.$_SERVER['PHP_SELF'].'?lang=pl">pl</a> | <a href="'.$_SERVER['PHP_SELF'].'?lang=en">en</a><br /><br />';
  15.  
  16. //Teraz w to zapytanie wstawiasz WHERE = $_SESSION['lang']
  17.  
  18. $result = mysql_query('SELECT * FROM `news` WHERE `language` = ''.$_SESSION['lang'].''');
  19. while($row = mysql_fetch_array($result))
  20. {
  21. echo '<div>
  22. <div>'.$row["title"].' | '.$row["content"].' | | '.$row["language"].'</div>
  23. </div>
  24. </div>';
  25. }
  26.  
  27. //Ogólnie to po co chcesz się bawić w tego if'a z językami? Lepiej dodawaj to do Dodawania newsów. JEżeli podajesz tylko 1 język to 2 jest kopią pierwszego.
  28. ?>


Ten post edytował Pride 14.07.2008, 21:48:27


--------------------
Kto pyta - nie błądzi, kto szuka - znajduje.
Go to the top of the page
+Quote Post
batman
post 14.07.2008, 21:24:43
Post #3





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




@Pride
A o bbcode nie słyszał?


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
Pride
post 14.07.2008, 21:50:10
Post #4





Grupa: Zarejestrowani
Postów: 139
Pomógł: 11
Dołączył: 31.01.2005
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


słyszał słyszał ale zamulił bo poprawiał kod w edytorze (dodanie tabów) i zamulił dodać [ php ] smile.gif Btw czy to mi się coś zje... skopało czy to taki nowy stajl, że posty są wyświetlane w takiej formie:
Posty w temacie
Endzio IF + WHERE Dzisiaj, 20:05
Pride Kod PHP1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1... 31 minut temu
batman @Pride A o bbcode nie słyszał? 23 minut temu

O.O


--------------------
Kto pyta - nie błądzi, kto szuka - znajduje.
Go to the top of the page
+Quote Post
Endzio
post 14.07.2008, 23:20:50
Post #5





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

Ostrzeżenie: (0%)
-----


Strona ma korzystać z nieograniczonej liczby języków, nie pobieranych z sesji, ale przydzielanych od razu (przez USER_AGENT) z możliwością późniejszej zmiany.
A efekt, który chcę (a nie potrafię) wykorzystać ma być zabezpieczeniem w przypadku braku newsa w języku danego użytkownika, wtedy lepiej, żeby się wyświetlił w domyślnym języku niż wcale.
Konieczne, a za razem jedynym rozwiązaniem jest przerzedzenie tego w zapytaniu MySQL, no ewentualnie z kodem PHP, który wyznacza, kolumny `number` pobierane z bazy, no właśnie tylko jak?

Ten post edytował Endzio 14.07.2008, 23:22:28
Go to the top of the page
+Quote Post
Kicok
post 15.07.2008, 12:33:13
Post #6





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


Nie trzeba IF-a:

  1. SELECT *
  2. FROM `newsy` WHERE `language` IN ( '$lang', 'en' )
  3. GROUP BY `number`
  4. ORDER BY `date` DESC, ( `language` = 'en' ) ASC

Zakładam, że data newsów o tym samym numerze, ale w innych językach, jest identyczna. Jeśli tak nie jest to sortuj po numerze, albo wywal w ogóle sortowanie i użyj tego jako podzapytania:
  1. SELECT *
  2. FROM ( SELECT *
  3. FROM `newsy` WHERE `language` IN ( '$lang', 'en' )
  4. GROUP BY `number`
  5. ORDER BY ( `language` = 'en' ) ASC ) `newsy`
  6. ORDER BY `date` DESC


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
Endzio
post 15.07.2008, 14:24:11
Post #7





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

Ostrzeżenie: (0%)
-----


Tak, daty dla tych samych newsów, ale w innych wersjach językowych miały mieć być identyczne.

Zawartość bazy:


Która po zapytaniu:
  1. SELECT *
  2. FROM `news` WHERE `language` IN ( "pl", "en" )
  3. GROUP BY `number`
  4. ORDER BY `date` DESC, ( `language` = "en" ) ASC


Wyświetla:
  1. PL 4
  2. EN 3
  3. EN 2
  4. EN 1


Zauważyłem, że zapytanie wyświetla zawsze newsa w takim języku, w jakim był dodany do bazy jako pierwszy.
Czy jest możliwość decydowania o tym w zapytaniu?
Próbując zmieniać kolejność w zapytaniu "pl" oraz "en" wynik zapytania SQL się nie zmieniał.

Ten post edytował Endzio 15.07.2008, 14:28:45
Go to the top of the page
+Quote Post
Kicok
post 15.07.2008, 15:31:37
Post #8





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


Widzę, że MySQL najpierw pogrupował wyniki a później dopiero próbował je sortować. Więc bez podzapytania sie nie obejdzie:
  1. SELECT *
  2. FROM ( SELECT * FROM `news` WHERE `language` IN ( 'pl', 'en' ) ORDER BY ( `language` = 'en' ) ASC ) `news`
  3. GROUP BY `number`
  4. ORDER BY `date` DESC


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
Endzio
post 15.07.2008, 15:38:57
Post #9





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

Ostrzeżenie: (0%)
-----


  1. SELECT *
  2. FROM ( SELECT * FROM `news` WHERE `language` IN ( 'pl', 'en' ) ORDER BY ( `language` = 'en' ) ASC ) `news`
  3. GROUP BY `number`
  4. ORDER BY `date` DESC

Ehh, wyrzuciło bład po wykonaniu tego zapytania:
  1. [root] ERROR 1064: Something IS wrong IN your syntax obok 'SELECT * FROM `news` WHERE `language` IN ( 'pl', 'en' ) ORD' w linii 2


//E
Mam MySQL w wersji 4.0.26

Ten post edytował Endzio 16.07.2008, 15:46:13
Go to the top of the page
+Quote Post
Kicok
post 15.07.2008, 18:17:11
Post #10





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


Jaka wersja MySQL ?


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
Endzio
post 16.07.2008, 16:56:36
Post #11





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

Ostrzeżenie: (0%)
-----


Zainstalowałem MySQL 5.0.45, przetestowałem kilkukrotnie zapytanie z różnymi kombinacjami i działa świetnie.
Jestem Twoim dłużnikiem, jeśli będę mógł kiedyś jakoś pomóc to wal śmiało.
Dzięki wielkie! Pozdrawiam smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 17:52