mysql - pojedynczy rekord

0

Witam serdecznie, z góry chciałbym przeprosić za banalne pytanie, jednakże walczę z nim od kilku godzin i nadal tkwię w głębokiej...

Na przykładowej bazie danych chciałbym wyciągnąć konkretny text w zależności od języka używanego przez przeglądarkę.
Zrobiłem już wykrywanie języka oraz użycie j. Angielskiego jeśli danego języka w bazie nie ma - wygląda na to że działa.

Potrzebuję teraz umieścić w odpowiednich miejscach wyciągnięty z bazy konkretny zapis.

title

Nie chciałbym też w każde miejsce danego tekstu ładować całej regułki typu:

<?php
$sql = "SELECT * FROM `translations` WHERE language_code = '$lang' OR language_code = 'en' AND id = x ";
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);	
if ($resultCheck > 0) {
$tra = mysqli_fetch_assoc($result);
mysqli_free_result($result);
mysqli_close($conn);
}
?>

Gdyż w docelowej stronie jest masa różnych pól tekstowych i odnoszę wrażenie, że zrobiłoby to straszny bałagan.
Czy istnieje możliwość wypisania konkretnego wpisu używająć czegoś w stylu:

<div class"jakaś_klasa"> 
<?php echo $row['text']['**id_pola_tekstowego**']; ?>
</div>

Z góry bardzo dziękuję za odpowiedzi oraz wskazówki, totalnie nie wiem jak to ugryźć.
Pozdrawiam!

1

samo zapytanie którym pobierasz dane nie jest najlepsze, poniewaz dla takiego zapytania:

SELECT * FROM `translations` WHERE language_code = 'pl' OR language_code = 'en' AND id = 1 

zwróci wszystkie z kodem pl i tylko ten en o id=1, jak już to powinienaś alternatywę mieć w nawiasie.
http://sqlfiddle.com/#!9/db5a9c/1

Nie programuje w PHP ale jest kilka artykułów jak to rozwiązać, więc poczytaj:

https://www.toptal.com/php/build-multilingual-app-with-gettext

0
Panczo napisał(a):

samo zapytanie którym pobierasz dane nie jest najlepsze, poniewaz dla takiego zapytania:

SELECT * FROM `translations` WHERE language_code = 'pl' OR language_code = 'en' AND id = 1 

zwróci wszystkie z kodem pl i tylko ten en o id=1, jak już to powinienaś alternatywę mieć w nawiasie.
http://sqlfiddle.com/#!9/db5a9c/1

Nie programuje w PHP ale jest kilka artykułów jak to rozwiązać, więc poczytaj:

https://www.toptal.com/php/build-multilingual-app-with-gettext

Dziękuję bardzo za odpowiedź, ale samo zapytanie jest tylko przykładem dla przypadku gdzie dla każdego pola tekstowego musiałbym wpisywać SELECT * FROM (...),

<?php
$sql = "SELECT * FROM `translations` WHERE language_code = '$lang' OR language_code = 'en' ";
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);	

if ($resultCheck > 0) {

$tra = mysqli_fetch_assoc($result);
mysqli_free_result($result);
mysqli_close($conn);

}

?>

chciałbym rozwiązać to w ten sposób aby z pomocą powyższego kodu uzyskać całą kolumnę z danym językiem, a następnie w pola tekstowe "wypluwać" tylko elementy z wybranej kolumny z wybranym przeze mnie wierszem z konkretnym id. Coś na zasadzie:

 <?php echo $tra['text']+"id_pola_tekstowego"; ?>

Dziękuję również za nadesłane materiały, zaraz się z nimi zapoznam :)

1

Nie znam PHP, więc składniowo Ci tego nie napiszę, ale możesz zawsze wyciągnąć z bazy teksty tylko w docelowym języku, a później z wyniku zapytania w PHP zrobić mapę z ID jako kluczem i tekstem jako wartością, a potem pobierać odpowiednie wartości w odpowiednich miejscach.

1
"select language_code,text from `translations` where id=$id order by 2*(language_code='$lang')+1*(language_code='en') desc limit 1"

jak nie będzie ani podanego ani też angielskiego to zwróci pierwszy jaki jest

"select language_code,text from `translations` where id=$id and (language_code='$lang' or language_code='en') order by language_code='en' limit 1"

jak nie będzie ani podanego ani też angielskiego to nic nie zwróci
uwaga. nawiasy wokół or konieczne

0
_13th_Dragon napisał(a):
"select language_code,text from `translations` where id=$id order by 2*(language_code='$lang')+1*(language_code='en') desc limit 1"

jak nie będzie ani podanego ani też angielskiego to zwróci pierwszy jaki jest

"select language_code,text from `translations` where id=$id and (language_code='$lang' or language_code='en') order by language_code='en' limit 1"

jak nie będzie ani podanego ani też angielskiego to nic nie zwróci
uwaga. nawiasy wokół or konieczne

Bardzo dziękuję za odpowiedź, zgodnie z wpisanym ID baza wypluwa interesujący mnie fragment tekstu w odpowiednim języku.
Jedyne pytanie które mnie jeszcze męczy to czy w każdym pojedynczym miejscu z tekstem jestem zmuszony wklejać całą regułkę z select (...) przykładowo:


<h4 class="text_pierwszy">
<?php $id="1" ;
$sql = "select language_code,text from `translations` where id=$id order by 2*(language_code='$lang')+1*(language_code='en') desc limit 1 ";
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);	
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) { 
echo $row["text"]; } }
?>
</h4>


<p class="text_drugi">
<?php $id="2" ;
$sql = "select language_code,text from `translations` where id=$id order by 2*(language_code='$lang')+1*(language_code='en') desc limit 1 ";
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);	
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) { 
echo $row["text"]; } }
?>
</p>

czy mógłbym na jednorazowo określić select zgodny z id oraz językiem a następnie "wypluwać" pojedyncze wpisy? Używając czegoś na zasadzie:

<h4 class="tekst_pierwszy">
~<?php $id=1; echo $row["text"] ?>
</h4>
<p class="tekst_drugi">
~<?php $id=2; echo $row["text"] ?>
</p>

Wydaje mi się, że już teraz jestem w stanie doprowadzić tłumaczenie projektu do działania, ale jeśli jest możliwość chciałbym uniknąć rozbudowy kodu o całe regułki select itd dla każdego
pola tekstowego.

3

Możesz pobrać wszystkie potrzebne tłumaczenia i przypisać je do Associative Arrays i odwoływać się do tlumaczeń po id:

<?php

$mysqli = new mysqli("localhost", "user", "pass", "baza");

$query = "SELECT * FROM `Table1` WHERE language_code = 'pl'";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
    $tra[$row['id']] = $row['text'];
}

$result->free();

$mysqli->close();

?>

<html>
<body>
tutaj tekst z tłumaczenia o id 1:  <?php echo $tra[1]; ?><br/>
tutaj tekst z tłumaczenia o id 2:  <?php echo $tra[2]; ?><br/>
tutaj tekst z tłumaczenia o id 3:  <?php echo $tra[3]; ?><br/>
tutaj tekst z tłumaczenia o id 4:  <?php echo $tra[4]; ?><br/>
<body>
<html>

zakladając, że dane są jak w fiddle z mojego poprzedniego posta to otrzymasz wynik:

tutaj tekst z tłumaczenia o id 1: pl1
tutaj tekst z tłumaczenia o id 2: pl2
tutaj tekst z tłumaczenia o id 3: pl3
tutaj tekst z tłumaczenia o id 4:

Nie jestem programistą PHP, ani nie tworzę aplikacji webowych, ale mam wrażenie, że to co tutaj rprezentujesz to jak powrot do poczatku lat 90 poprzedniego wieku, wtedy uczyłem sie PHP i wydaje mi się, że wiele się zmienilo od tego czasu... Poczytaj jak rozdzielić PHP od HTML-a bo na pewno jest jakiś sposób niż wkładnie wstawek PHP do kodu HTML...

1
h1mst napisał(a):

czy mógłbym na jednorazowo określić select zgodny z id oraz językiem a następnie "wypluwać" pojedyncze wpisy? Używając czegoś na zasadzie:

$sql="select T.Id,(select x.text Text from `translate` x where x.id=T.id order by 2*(x.language_code='$language')+1*(x.language_code='en') desc limit 1) UseText from `translate` T group by T.Id";
1
Panczo napisał(a):

Możesz pobrać wszystkie potrzebne tłumaczenia i przypisać je do Associative Arrays i odwoływać się do tlumaczeń po id:

<?php

$mysqli = new mysqli("localhost", "user", "pass", "baza");

$query = "SELECT * FROM `Table1` WHERE language_code = 'pl'";
$result = $mysqli->query($query);
while($row = $result->fetch_assoc()) {
    $tra[$row['id']] = $row['text'];
}

$result->free();

$mysqli->close();

?>

<html>
<body>
tutaj tekst z tłumaczenia o id 1:  <?php echo $tra[1]; ?><br/>
tutaj tekst z tłumaczenia o id 2:  <?php echo $tra[2]; ?><br/>
tutaj tekst z tłumaczenia o id 3:  <?php echo $tra[3]; ?><br/>
tutaj tekst z tłumaczenia o id 4:  <?php echo $tra[4]; ?><br/>
<body>
<html>

zakladając, że dane są jak w fiddle z mojego poprzedniego posta to otrzymasz wynik:

tutaj tekst z tłumaczenia o id 1: pl1
tutaj tekst z tłumaczenia o id 2: pl2
tutaj tekst z tłumaczenia o id 3: pl3
tutaj tekst z tłumaczenia o id 4:

Nie jestem programistą PHP, ani nie tworzę aplikacji webowych, ale mam wrażenie, że to co tutaj rprezentujesz to jak powrot do poczatku lat 90 poprzedniego wieku, wtedy uczyłem sie PHP i wydaje mi się, że wiele się zmienilo od tego czasu... Poczytaj jak rozdzielić PHP od HTML-a bo na pewno jest jakiś sposób niż wkładnie wstawek PHP do kodu HTML...

Bardzo dziękuję, to jest dokładnie to o co mi chodziło.
Niestety sytuacja wymagała abym zanurzył się w temat którego w ogóle nie znam (php i bazy danych niezbyt wiele mają do grafiki, którą się zajmuję na codzień), no ale klient nasz pan :)
Poziom który reprezentuję to jedynie szukanie odpowiedzi w google + forach oraz ewentualne domysły 'na logikę'. Na szczęście jest to ostatni element którego brakowało w projekcie.

Jeszcze raz ogromne dzięki za uratowanie mi tyłka :)
Pozdrawiam serdecznie!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.