Autor Zpráva
Luky759
Profil *
Dobrý den,

narazil jsem na zajímavý problém. V DB mám uložené údaje o jednotlivých věcech (viz obrázek).
Potřeboval bych, aby když se v DB nachází řádek, např. Kočka, Brno, Červená, tak aby se v tabulce obarvilo pozadí dané buňky, která ji odpovídá. Ostatní zůstanou bílé.

Tabulka má pevné záhlaví (tzn. zvířat je pevně daný počet, ale každé má buď 3 nebo 2 vlastnosti - barvy)
Města jsou vypisovány s DB a mohou se přidávat.

Můžete mě nějak popostrčit, poradit jak na to? Děkuji.


Odkaz na obrázek
Joker
Profil
Luky759:
Databáze a prezentace jsou dvě rozdílné věci.

Jinak při výpisu dat z databáze dokážete zjistit, jestli jste na té konkrétní buňce, a případně rovnou nastavit styl.

Řešit to čistě na úrovni prezentace, tj. že dostanu čistě jen tabulku a údaje v ní a nemůžu si dogenerovat další informace, by bylo mnohem horší.
tiso
Profil
Luky759: záhlavie je pevné pre oba stĺpce záhlavia? Alebo máš len pevne dané len poradie zvierat? Čo presne tá tabuľka predstavuje, o čo sa snažíš?
Luky759
Profil *
tiso:
záhlaví je pevné pro oba řádky, tj. zvířata i jejich vlastnosti jsou daná. Jediný rozdíl je v tom, že některá zvířata mají pouze 2 vlastnosti a né 3.

Joker:
Vůbec nechápu co tím chcete říct. Potřebuji to udělat tak, jak jsem to popsal v úvodním příspěvku (doufám, že pochopitelně). Nechci po nikom hotové řešení, jen poradit, nakopnout jak na to.


Abych přispěl krapet do mlýna. Vzhledem k tomu, že znám záhlaví tabulky, napadlo mě společně s údaji o zvířatech, vlastnostech a městech ukládat do DB číslo sloupce ve kterém bude vybarvená buňka. Tabulku pak procházet for cyklem s počítadlem buněk. Jenom se ještě musí nějak odkontrolovat jestli jsem ve správném řádku.

Napadá někoho něco lepšího?
Joker
Profil
Luky759:
Jak píšu: Při generování té buňky z databáze přece víte, na které buňce zrovna jste.
Takže by stačilo něco ve stylu (samozřejmě zjednodušeně):
if (($zvire == "kočka") && ($mesto == "Brno") && ($barva == "červená")) echo 'class="zvyraznena"';

Jestli to potřebujete na už hotové vygenerované tabulce v HTML (a nejsou v ní žádné pomocné údaje kromě obsahu), tak to bude problém. Maximálně, jestli má pevnou strukturu, zvýraznit třeba buňku ve čtvrtém sloupci a třetím řádku.
Luky759
Profil *
Joker:
Jenže jak zjistím na které buňce zrovna jsem? Ta buňka přece žádný identifikátor nemá. Jako kdyby existovalo něco jako třeba <td id="<?php brno,kočka,červená?>"> a já jen kontroloval jestli se údaj s DB rovná s tím pro co je ta daná buňka určená tak není co řešit.
Joker
Profil
Luky759:
Jenže jak zjistím na které buňce zrovna jsem?
To snad při vypisování tabulky dokážete zjistit, jak jinak dostanete správné údaje do správných buněk?
_es
Profil
Luky759:
No a z tej „DB“ tú tabuľku do HTML generuješ ako?
tiso
Profil
Luky759: technická: nemyslíš „pouze 2 vlastnosti a né 3“, ale 2 alebo 3 hodnoty vlastnosti

Identifikátor riadku máš - je to mesto. Už ide len o to spraviť si identifikátor stĺpca. Napríklad takto:
<?php
...
$cols = array('Kočka-M..', 'Kočka-Ž...', 'Kočka-Červená, ...);
Potom vytiahneš všetky zvieratká z DB a zostavíš si dvojrozmerné pole s indexami <mesto> a <stlpec>
a následne vypíšeš riadky tabuľky
Luky759
Profil *
tiso:
identifikátor sloupce jsem si spravil, tak že ho ukládám jako číslo do DB. Takže vím řádek, vím i sloupec. Existuje nějaký způsob jak to pěkně rychle vypsat do té tabulky, než procházet for cyklus iteraci po iteraci a vyhodnocovat jestli se má nebo nemá buňka vybarvit. Těch sloupců je přes 20.
tiso
Profil
Luky759: dajú sa robiť rôzne šialenosti, ako to vypísať rýchlejšie. Ale zmysel to veľmi nemá, ak je tvojim problémom rýchlosť, tak máš niečo zle spravené. Ukáž čo si dal dokopy.
_es
Profil
Luky759:
jak to pěkně rychle vypsat do té tabulky
A teraz to „vypisuješ“ ako?
Luky759
Profil *
tiso:
nejde o rychlost skriptu, ale o rychlost napsání skriptu :-)

v plánu to mám tak - for cyklus prochází řádek buňku po buňce a já budu otrocky kontrolovat jestli buňka na které jsem není ta kterou potřebuji. V jednom řádku může být klidně všech 26 políček vybarvených nebo taky jenom jedno nebo žádné.


_es:
záhlaví tabulky je pevné - to je v html
města vypisuju z DB a jednotlivé buňky "vykresluje" for cyklus. Já teď jen nějak musím projít všema buňkama a zjistit, která bude vybarvená.
tiso
Profil
Luky759: dá sa to kontrolovať dobrým spôsobom a zlým spôsobom.


Ukáž čo si dal dokopy.
_es
Profil
Luky759:
jednotlivé buňky "vykresluje" for cyklus.
No a to je taký problém upraviť ten „for cyklus“, ako ti bolo radené Jokerom už v [#2] a [#5] a podľa potreby nastaviť bunke atribút class?
Luky759
Profil *
tiso:
$vysledek = mysqli_query($mysqli, "select nazev from mesto");
         if(mysqli_num_rows($vysledek) == 0) die ("Žádné město");
         
         while($radek = mysqli_fetch_array($vysledek)){
             $mesto = $radek["nazev"];
             echo "<tr><td>".$mesto."</td>";
             
          $vysledek_spojeni = mysqli_query($mysqli, "select cislo_sloupce from zaznamy where mesto = '".mysqli_real_escape_string($mysqli, $mesto)."' order by cislo_sloupce");
          if(mysqli_num_rows($vysledek_spojeni) == 0){
             for($i=1; $i<=26; $i++){
               echo "<td></td>";  
             }
          }
          else{
              
             while($row = mysqli_fetch_array($vysledek_spojeni)){
                 $sloupec = $row["cislo_sloupce"];
             for($i=1; $i<=26; $i++){
                                
               
             } 
            }
          }
          echo "</tr>";
         }

první for cyklus vypíše prázdné buňky pokud se v daném městě (řádku) nic nenachází.

s druhým for cyklem tápu.
tiso
Profil
<?php
...
        else{
            $last = 1;
             while($row = mysqli_fetch_array($vysledek_spojeni)){
                 $sloupec = $row["cislo_sloupce"];
                 if($last < $sloupec -1) {
                     echo str_repeat('<td></td>', $sloupec - 1 - $last);
                 }
                 echo '<td class="zvyraznena"></td>';
                 $last = $sloupec;
            }
        }
Joker
Profil
Luky759:
identifikátor sloupce jsem si spravil, tak že ho ukládám jako číslo do DB
To je přece nesmysl, sloupec se musí dát identifikovat z jiných existujících údajů.
Nicméně pořadí sloupce, pokud je možné je mezi sebou prohazovat, smysl dává.

nejde o rychlost skriptu, ale o rychlost napsání skriptu :-)
To je dost krátkozraký přístup. To s dalším vývojem celkem nevyhnutelně vede k bodu, kdy bude lepší celou aplikaci zahodit a začít znovu.
Luky759
Profil *
tiso:
díky za snahu - teď jsem to jen tak ze srandy zkusil a nefičí to (nevadí), nakonec jsem to vyřešil úplně triviálně
else{
             $i = 1;
             while($row = mysqli_fetch_array($vysledek_spojeni)){
                 $sloupec = $row["cislo_sloupce"];
             for($i; $i<=26; $i++){
                 
                if($i == $sloupec){
                    echo "<td>$sloupec</td>"; $i++; break;} 
                    else{
                        echo "<td></td>";}
                } 
              }
              
            if($i <= 26){
                for($i; $i<=26; $i++){
                echo "<td></td>";
               }
             }
          }

Joker:
myslím, že toto řešení mi aplikaci nezboří :-)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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