Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: IF + WHERE
Forum PHP.pl > Forum > Bazy danych > MySQL
Endzio
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. ?>
Pride
  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. ?>
batman
@Pride
A o bbcode nie słyszał?
Pride
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
Endzio
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?
Kicok
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
Endzio
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ł.
Kicok
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
Endzio
  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
Kicok
Jaka wersja MySQL ?
Endzio
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
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.