Autor Zpráva
balaban
Profil *
Já vim, strašně stupidní název, ale fakt nevim, jak to pojmenovat.

Prostě jde o to, že mám tři názvy český, anglický, německý, které tahám z databáze, ale nevim ,který z nich v databázi bude vyplněn.

A pak mám normálně html výpis těch názvů, kdy jeden je hlavní a další budou třeba v tabulce s upozorněním, že se jedná třeba o anglický název. N2jak takhle:

<span>hlavní název vyražený z db</span>

<table>
<tr><td>Anglický název:</td><td>anglický název vyražený z db</td></tr>
<tr><td>Německý názrev:</td><td>německý název vyražený z db</td></tr>
</table>


No a mělo by to fungovat tak ,že český, když bude, tak bude vždy hlavní, když nebude k dispozici, tak se na jeho místo přesune anglický a zároveň zmizí z tabulky a když nebude anglický, tak se na jeho místo do span přesune německý a v tabulce nebude žádnej název.

zkoušel jsem to nějak pomocí polí, ale nepodařilo se a nevim jak na to.
Dík za radu.
okolojdouci
Profil *
Nepíšeš, jestli umíš ty údaje z databáze dostat. Vytáhneš tři řetězce, pak použiješ http://cz.php.net/manual/en/control-structures.if.php
balaban
Profil *
no samozřejmě, že je umím z databáze dostat, ale chtěl bych vytvořit nějakou funkci, která by to zkontrolovala a zkombinovala třeba, to jsem se snažil vymyslet. Dávat větvení if($row['czech']) a za to celej html kód a totéž s dalšími názvy se mi moc nechtělo.
okolojdouci
Profil *
if (!empty($nemecky)) { $nazev = $nemecky;};
if (!empty($anglicky)) { $nazev = $anglicky;};
if (!empty($cesky)) { $nazev = $cesky;};

echo "Název: ".$nazev;  // opraven překlep
if (!empty($cesky)) { echo "<tr><td>Anglický název:</td><td>"$cesky."</td></tr>";};
if (!empty($anglicky)) { echo "<tr><td>Anglický název:</td><td>"$anglicky."</td></tr>";};
if (!empty($nemecky)) { echo "<tr><td>Anglický název:</td><td>"$nemecky."</td></tr>";};
balaban
Profil *
okolojdouci:
No jo, ale tam nemáš to span pro hlavní název a nahrazování, prostě ten hlavní název bude trošku mimo ty ostatní.
Tori
Profil
balaban:
Můžete už v dotazu zajistit, aby se vrátil jen jeden z alternativních názvů + zjistit, jestli je český nebo ne. Předpokládá to, že nezadané sloupce mají hodnotu NULL.
SELECT cesky AS 'jeCesky', IFNULL(cesky, IFNULL(anglicky, nemecky)) AS 'nazev' FROM ...
echo $row['nazev'] . (! $row['jeCesky'] ? ' (Český název není dostupný.)' : '');


Až teď jsem si pořádně přečetla, že vlastně stejně potřebujete číst z db všechny názvy. Ale třeba se vám to hodí jindy.
okolojdouci
Profil *
balaban:
No jo, ale tam nemáš to span pro hlavní název a nahrazování, prostě ten hlavní název bude trošku mimo ty ostatní.

No a co? Mám ti napsat komplet kód stránky, který neznám?
Důležité je jen pořadí. Kdybys ten span měl pod těmi třemi řádky, šlo by to dokonce udělat čistěji.
DarkMeni
Profil
DB_connect();
$id = (!empty($_GET["id"]) && is_numeric($_GET["id"])) ? $_GET["id"] : die();
$nazvy = mysql_query("SELECT cesky,anglicky,nemecky FROM nazvy WHERE id=".$id);
// Upraveno podle rady pcmanika.
$row = mysql_fetch_array($nazvy);
$cesky = $row["cesky"];
$anglicky = $row["anglicky"];
$nemecky = $row["nemecky"];
if(!empty($cesky)){
  $hlavni_nazev = $cesky;
  $result = 0;
}elseif(!empty($anglicky)){
  $hlavni nazev = $anglicky;
  $result = 1
}elseif(!empty($nemecky)){
  $hlavni_nazev = $nemecky;
  $result = 2;
}else{
  $hlavni_nazev = "Název objektu nebyl definován ani jedním z jazyků";
  $result = 3;
}
echo "<span>".$hlavni_nazev."</span>";
if($result<1){
  echo "<tr><td>Anglický název:</td><td>".$anglicky."</td></tr>";
}
if($result<2){
  echo "<tr><td>Německý název:</td><td>".$nemecky."</td></tr>";
}
if($result>2){
  echo "<tr><td>Název:</td><td>Nepojmenován</td></tr>";
}
echo "</table>";

Takle by možná mohlo vypadat to co chceš, možná je to rozvětvený až přehnaně moc ale na kratší kód jsem nepřišel.
pcmanik
Profil
DarkMeni:
Tak nieco k tomu tvojmu kodu si nemozem odpustit:
1. Pri id ti bohate staci intval(). Naviac by bolo dobre overit ci tam nieco je a az potom volat ten dotaz.
2. Stplec id mas v DB pravdepodobne typu int a nie typu string, cize ' pri tom id mas zbytocne.
DarkMeni
Profil
V SQL syntaxi ještě nejsem až tak doma takže díky za rady.
Ale mysql_real_escape_string() se bude hodit když bude vybírat podle stringu.
pcmanik
Profil
DarkMeni:
Ale po tom poslednom edite to mas zle, za tym id sql dotaze, ti este chyba .""
A este by som okrem toho overovanie tam pridal nejaky text, v zmysle ze nebolo nic zadane pre vyhladavanie. Inak by to bolo trocha cudne, keby ostala prazdna stranka :D
okolojdouci
Profil *
pcmanik:
za tym id sql dotaze, ti este chyba .""

No tak to rozhodně nechýba.
Jen by mě zajímalo, v čem nevyhovuje to moje řešení.
DarkMeni
Profil
Tak balaban se ptal jen na to větvení, takže SQL dotaz už rači necham čistě na něm protože jak jsem psal, s SQL ještě nejsem dobrej =)

okolojdouci:
Jen by mě zajímalo, v čem nevyhovuje to moje řešení.
Tvoje řešení taky vyhovuje, akorát kdyby v češtině ten název nebyl tak se mu jako hlavní název neukáže nic a kdyby tam měl ještě dovolené zobrazení chyb s E_ALL tak by mu to napsalo něco ve smyslu "Notice: undefined index cesky in ..." a to by nebylo moc pěkné.
okolojdouci
Profil *
(Moderátor: děkuju. Ještě vidím, že na tom řádku má být "Název: ".$nazev;)
Moderátor Alphard: Aha, také mě to mohlo napadnout, opravil jsem.
DarkMeni
Profil
Když to opravíš a pošleš sem ještě jednou tak ta tvoje verze bude vlastně ještě lepší a rychlejší než ta moje :D
balaban
Profil *
okolojdouci:
Tvůj kód nevyhovuje v tom, že když nebude český název, ale anglický a německý, tak se německý dá do hlavního i do tabulky a to nechci.
Takhle to vlastně bude i při všech ostatních názvech, který se dostanou do hlavního, že budou zdvojeny - jednou hlavní a jednou v tabulce.

tam by se to asi dalo obejít takhle:

if (!empty($cesky) && $cesky!=$nazev) { echo "<tr><td>český název:</td><td>".$cesky."</td></tr>";}


DarkMeni:


u tebe zase vidim chybu v tom, že když bude název česky, tak najednou se mi nezobrazí německy ani anglicky v tabulce, pokud to chápu dobře, protože result bude 0 a podmínky pro jejich zobrazení $result<1 a $result<2 nebudou splněny.
balaban
Profil *
DarkMeni:
Ne, blbost, budou splněny
balaban
Profil *
Ale problém bude v tom ,že když pak nebudou v databázi anglický a německý název, ale jen český, tak to stejně vypíše html kód pro anglický i německý název, protože result kvůli českýmu bude 0, což bude splňovat $result<1 i $result<2.

Omlouvámse za tolik postů,ale nemůžu editovat.
Tori
Profil
Tak snad tohle by mohl být to co chcete. Funkci předáte řádek z DB.
function napisNazev($row)    {
    $legenda = array('anglicky'=>'Angl.verze', 'nemecky'=>'Nem.verze', 'cesky'=>'Cs.verze');
    $nazvy = array();
    // do toho pole můžete dopsat další jazykové verze (=názvy sloupců DB)
    foreach(array('cesky','nemecky','anglicky') as $lang)    {
        if (!empty($row[$lang]))
            $nazvy[$lang] = $row[$lang];
    }
    echo "<h3>".array_shift($nazvy)."</h3>";
    if (!empty($nazvy))    {
        echo "<table>";
        while (list($lang, $nazev) = each($nazvy))    {
            echo "<tr><td>$nazev</td><td>$legenda[$lang]</td></tr>";
            array_shift($nazvy);
        }
        echo "</table>";
    }
}


Změněno.
balaban
Profil *
Tori:
Jo, jo něco takovýho jsem se snažil vytvořit, akorát teď ještě nevim, jak udělat tohle, což je pro mě asi ten největší kámen úrazu.

<tr><td>Anglický název:</td><td>$nazev</td></tr>


Jde o to, že k tomu příslušnýmu názvu z databáze je potřeba ještě přidat pasující text Anglický název: nebo Německý název: atd.
Tori
Profil
Změnila jsem [#19], minimální rozdíly.
balaban
Profil *
Jo jo, díky moc, teď už to po menší úpravě vše sedí, díky všem za snahu a pomoc
Tori
Profil
balaban:
S drobnou úpravou se dá použít i okolojdouciho verze ze [#4] (ta moje mi připadá čím dál víc jako overkill).
if (!empty($cesky)) { $nazev = $cesky; $cesky = '';}
elseif (!empty($nemecky)) { $nazev = $nemecky; $nemecky = '';}
elseif (!empty($anglicky)) { $nazev = $anglicky; $anglicky = '';}

echo "Název: ".$nazev;
if (!empty($anglicky)) { echo "<tr><td>Anglický název:</td><td>".$anglicky."</td></tr>";}
if (!empty($nemecky)) { echo "<tr><td>Německý název:</td><td>".$nemecky."</td></tr>";}
balaban
Profil *
Tori:
Vim, ještě než jsi napsala tu svojí funkci, tak už jsem měl tu jeho verzi upravenou a fungovala, ale to tvoje mam všechno pěkně pohromadě v jedný funkci, ze který pak posílám zpátky pole, kde mam hlavni nazev a ten zbytek oddělenej a vypisáju to pak do HTML, kde hlavní název a vedlejší názvy jsou dost od sebe a kdybych tam chtěl něco přidávat, tak bych toho musel měnit hromadu a bylo by to nepřehledný, takhle to změnim jen v tý funkci.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0