« 1 2 »
Autor Zpráva
nadsenec
Profil *
Ahoj,

potřeboval bych nakopnout správným směrem - chtěl bych si vytvořit nějaký jednoduchý skript, pomocí kterého by mohl uživatel editovat otevírací dobu svého obchodu. Poradíte, prosím, jakou cestou se vydat?

Díky!
Joker
Profil
nadsenec:
Na web se dá formulář a nasměruje se na serverový skript.
Skript převezme data a uloží je do nějakého úložiště (typicky databáze či soubor).
A zobrazení otevírací doby je z toho úložiště načte.
nadsenec
Profil *
Jasně, tomuhle rozumím. Šlo mi spíše o to, jestli není nejaká jednodušší cesta, protože do databáze nechci nikoho pouštět bez přihlášení, což proces značně komplikuje. :-)
Tomáš123
Profil
nadsenec:
Predpokladám, že si u teba užívatelia ukladajú informácie o otváracej dobe ich malého podniku. Môžeš každý údaj zabezpečiť identifikátorom a vo formulári požadovať názov podniku (ktorý tam pravdepodobne je uložený) a prihlasovací identifikátor. Je malá pravdepodobnosť, že sa niekomu podarí trafiť správnu kombináciu.
Joker
Profil
nadsenec:
Šlo mi spíše o to, jestli není nejaká jednodušší cesta, protože do databáze nechci nikoho pouštět bez přihlášení, což proces značně komplikuje. :-)

Do databáze bude přistupovat jen ten skript. Uživatelé žádné přihlášení nepotřebují.
nadsenec
Profil *
Tomáš123: Aha, tak by to šlo taky. Nebo ještě omezit na nějakou IP adresu. Díky.

Joker: Jasně, mohl bych udělat něco jako primitivní "přihlášení", že odeslat skript půjde až se zadá nějaké heslo. Něco podobného, co píše Tomáš123. Tak to myslíš?
mimochodec
Profil
nadsenec:
mohl bych udělat něco jako primitivní "přihlášení", že odeslat skript půjde až se zadá nějaké heslo.

Ono je vcelku jedno, co chceš po přihlášení editovat. Po přihlášení prostě bude existovat nějaká session a co za toho stavu umožníš, je jen na tobě. Nevím, co si představuješ pod pojmem "primitivní" přihlášení, resp. jak si představuješ rozdíl oproti "normálnímu" přihlášení, ale prostě tam potřebuješ nějaký formulář pro login a heslo, následně nějaké php, kde ten odeslaný formulář zpracuješ a login a heslo proti něčemu ověříš.
Joker
Profil
nadsenec:
Jasně, mohl bych udělat něco jako primitivní "přihlášení", že odeslat skript půjde až se zadá nějaké heslo. Něco podobného, co píše Tomáš123. Tak to myslíš?
Ne.
Jen z toho, že se použije databáze, nevyplývá žádná nutnost umožnění přístupu někam, žádné přihlášení, heslo, nic.

To vyplývá leda z toho, kdo ty údaje může a nemůže měnit, ale to už nesouvisí s technologií pro jejich ukládání.
mimochodec
Profil
Joker:
Jen z toho, že se použije databáze, nevyplývá žádná nutnost umožnění přístupu někam, žádné přihlášení, heslo, nic.

Možná mi něco uniká, ale chtěl bych upozornit, že pokud nadsenec chce umožnit editaci někomu přes zaheslovaný přístup, databáze k tomu není potřeba. A jestli opravdu nepůjde o nic víc než těch pár čísel, pronikat do databází by mohlo být zkoumání kladiva na komára.
nadsenec
Profil *
mimochodec: "Primitivním" přihlášením myslím to, že budu po tom, co bude zapisovat chít "heslo", které budu mít přímo ve skriptu a budu jen porovnávat, maximálně to "ztížím" třeba to IP adresou. "Normálním" přihlášením myslím přihlášení skrz uživatele, který je v databázi, má hashované heslo, atd. Asi se blbě vyjadřuju.

Joker: Ano, ale právě to "kdo" bude ukládat je pro mně stěžejní. Chci mít (nějakou) jistotu, že mi tam nezapíše něco nějaký "záškodník" a já pak budu za blbce... :-)

mimochodec: „A jestli opravdu nepůjde o nic víc než těch pár čísel, pronikat do databází by mohlo být zkoumání kladiva na komára.“ Ano, ano, ano. :-) O to mi (kromě výše uvedeného) taky jde. Proto jsem prosil o nakopnutí nějakým, v ideálním případě správným, směrem. :-)

P.S. Nebudou to jen čísla, ale i text. Takže např.:

Po: 09:00 - 12:00, 13:00 - 16:00
Út: 08:00 - 12:00, pouze domluvené schůzky
...
atd.
mimochodec
Profil
nadsenec:
mimochodec: "Primitivním" přihlášením myslím to, že budu po tom, co bude zapisovat chít "heslo", které budu mít přímo ve skriptu a budu jen porovnávat, maximálně to "ztížím" třeba to IP adresou. "Normálním" přihlášením myslím přihlášení skrz uživatele, který je v databázi, má hashované heslo, atd. Asi se blbě vyjadřuju.

Ne, vyjádřil ses přesně. Takhle jsem to pochopil a proto taky píšu o tom, že řešení bez databáze není od věci.
No a konkrétně řešíš co? V php budeš mít form, po jeho vyplnění a odeslání se porovnají hodnoty. Když budou ok, vytvoří se session. Při existující session zpřístupníš (třeba jako další stránku) formulář, kde bude textarea, která bude načítat text z nějakého textového souboru. Jeho obsah budeš moct editovat a uložit. Nepřihlášenému se ten obsah includne a zobrazí jako běžná součást stránky. Kde konkrétně to vázne?
Alphard
Profil
nadsenec:
1. Jestli je otevírací doba vše, co se má nastavovat, uměl bych si představit, že přihlášení se session by nemuselo být potřeba. Formulář pro zadání informací by mohl být na trochu skryté stránce a při zadávání údajů by se vložilo i heslo. To by se pak porovnalo a buď by se provedl zápis, nebo ne, nic víc.

2. Implementačně si někde zjistěte, jak se pracuje s formuláři a superglobálními poli ( Základní kurz 12: Předání dat na server). Pro zápis dat by šlo použít kombinaci funkcí serialize + file_put_contents a pro načtení file_get_contents + unserialize, jestli umíte pracovat s poli, je to snadné.
nadsenec
Profil *
Díky všem. Zkusím to udělat nějak postupně. Nejprve "přihlášení", napadlo mně to udělat nějak takto:

//Přihlášení
if ( ($_SERVER['REQUEST_METHOD'] === 'POST') && (!empty($_POST['username'])) && (!empty($_POST['password'])) ) {

//Sanitace username
if (isset($_POST['username'])) {        
    $username = filter_var($_POST['username'],FILTER_SANITIZE_STRING);
    $username = trim($username);
} else { $jmeno = ''; }

//Sanitace password
if (isset($_POST['password'])) {        
    $password = filter_var($_POST['password'],FILTER_SANITIZE_STRING);
    $password = trim($password);
} else { $password = ''; }

//Definuj proměnné ke kontrole
$username_check = "test";
$password_check = "test";

if ( ($username == $username_check) && ($password == $password_check) ) {
    echo 'Přihlášen';
} else {
    echo 'Nepřihlášen';
}
    
} else {
?>

<form action="test.php" method="post">
    Jméno:  <input name="username" type="text"><br>
    Heslo: <input name="password" type="password"><br>
    <input name="submit" type="submit" value="Přihlásit">
</form>

<?php
} // konec Přihlášení
?>

Co vy na to?
mimochodec
Profil
nadsenec:
filter_var neznám a ověření $_SERVER['REQUEST_METHOD'] mi připadá nadbytečné, ale celkově asi ok. Teď v té větvi echo 'Přihlášen' zařiď nastavení session: http://www.w3schools.com/php/php_sessions.asp

Důležité je to session_start();, které musíš provést vždycky, když chceš se session pracovat a musíš to provést před prvním echem, resp. jakýmkoliv výstupem do prohlížeče.
Pak už budeš jen testovat, jestli ta session existuje. Ano-li, jsi přihlášen.
Tomáš123
Profil
nadsenec:
Riadky 8 a 14 sa nikdy nepoužijú kvôli podmienke na prvom riadku (a nikdy neprídeš na to, že premenná $jmeno je definovaná po česky a už nikde sa nespomína). Taktiež podmienky na riadkoch 5 a 11 sú vždy splnené, takže sú rovnako zbytočné.
nadsenec
Profil *
mimochodec: Díky, podívám se na to.

Tomáš123: No jo, jasně. Díky!

Přepíšu to, něco přidám a zase to sem hodím. Díky za všechny reakce, to je nejlepší způsob, jak se něco naučit.
nadsenec
Profil *
Teď jsem narazil na pro mne v tuto chvíli neřešitelný oříšek. Rozhodl jsem se pro zápis do DB, ale jak ho vlastně udělat? :-) Vytvořil jsem si tabulku o 5 sloupcích (ID, den, otevírací doba, pobocka, vytvoreno), do které chci zapisovat uživatelem vyplněná data z formuláře, potud dobrý, ale jak teď dále? UPDATE asi použít nemůžu (nebo nevím, jak bych to dělal), tak zřejmě musím použít INSERT, ale u toho si zase nejsem jistý, jak potom tahat z DB ta správná data (tedy ty, která jsou zrovna aktuální). Asi nějak porovnávat čas, ale jak? :-)
Keeehi
Profil
nadsenec:
Skombinuješ to. Zjistíš, zda tam už nějaká data jsou (SELECT) a pak podlet to provedeš buď INSERT nebo UPDATE.
mimochodec
Profil
Jinak řečeno budeš tam mít jen jeden řádek.
nadsenec
Profil *
No, já to chtěl řešit na straně MySQL - použít něco jako REPLACE nebo ON DUPLICATE KEY UPDATE, ale nějak se mi to nedaří...
nadsenec
Profil *
Tak jsem ten skript trochu přepsal. Nejdříve se "přihlásím" a pokud jsou splněny podmínky, zobrazuji formulář pro zápis...

//Přihlášení
if ( ($_SERVER['REQUEST_METHOD'] === 'POST') && (!empty($_POST['username'])) && (!empty($_POST['password'])) ) {

//Sanitace username
$username = filter_var($_POST['username'],FILTER_SANITIZE_STRING);
$username = trim($username);

//Sanitace password
$password = filter_var($_POST['password'],FILTER_SANITIZE_STRING);
$password = trim($password);

//Definuj proměnné ke kontrole
$username_check = "test";
$password_check = "test";

//Kontrola uživatelského jména a hesla
if ( ($username == $username_check) && ($password == $password_check) ) {
    echo '<p>Přihlášen uživatel '.$username.'</p>';
 ?>

<form action="test-zpracovani.php" method="post">
    Otevírací doba pro:<br>
    <input type="radio" name="pobocka" value="Město1" checked>Město1<br>
    <input type="radio" name="pobocka" value="Město2">Město2<br><br>
    Pondělí:  <input name="pondeli" type="text"><br>
    Úterý:  <input name="utery" type="text"><br>
    Středa:  <input name="streda" type="text"><br>
    Čtvrtek:  <input name="ctvrtek" type="text"><br>
    Pátek:  <input name="patek" type="text"><br>
    So + Ne: <input name="vikend" type="text"><br><br>
    Kontrola: <input name="kontrola" type="text" value="kontrola"><br> <!-- Nastavit display: none; -->
    <input name="submit" type="submit" value="Odeslat">
</form>

<?php
} else {
    echo '<p>Nesprávné uživatelské jméno nebo heslo!</p>';
    exit;
} //Konec Kontrola uživatelského jména a hesla
    
} else {
    
echo '<p>Vyplňte uživatelské jméno a heslo!</p>';

?>

<form action="test.php" method="post">
    Jméno:  <input name="username" type="text"><br>
    Heslo: <input name="password" type="password"><br><br>
    <input name="submit" type="submit" value="Přihlásit">
</form>

<?php
} // konec Přihlášení
?>

Vyplněný skript odesílám do DB - podle počtu výsledků zjišťuju, jestli použít INSERT nebo UPDATE...

//Podmínka kontrolující, jestli přišla nějaká data z formuláře
if ( ($_SERVER['REQUEST_METHOD'] === 'POST') && (($_POST['kontrola']) == "kontrola") ) {
    
//Sanitace pondeli a stanovení default hodnoty
if (!empty($_POST['pondeli'])) {        
    $pondeli = filter_var($_POST['pondeli'],FILTER_SANITIZE_STRING);
    $pondeli = trim($pondeli);
} else { 
    $pondeli = "Kontaktujte kancelář na tel. čísle...";    
}
 
//Sanitace utery a stanovení default hodnoty
if (!empty($_POST['utery'])) {        
    $utery = filter_var($_POST['utery'],FILTER_SANITIZE_STRING);
    $utery = trim($utery);
} else { 
    $utery = "Kontaktujte kancelář na tel. čísle...";    
}

//Sanitace streda a stanovení default hodnoty
if (!empty($_POST['streda'])) {        
    $streda = filter_var($_POST['streda'],FILTER_SANITIZE_STRING);
    $streda = trim($streda);
} else { 
    $streda = "Kontaktujte kancelář na tel. čísle...";    
}

//Sanitace ctvrtek a stanovení default hodnoty
if (!empty($_POST['ctvrtek'])) {        
    $ctvrtek = filter_var($_POST['ctvrtek'],FILTER_SANITIZE_STRING);
    $ctvrtek = trim($ctvrtek);
} else { 
    $ctvrtek = "Kontaktujte kancelář na tel. čísle...";    
}

//Sanitace patek a stanovení default hodnoty
if (!empty($_POST['patek'])) {        
    $patek = filter_var($_POST['patek'],FILTER_SANITIZE_STRING);
    $patek = trim($patek);
} else { 
    $patek = "Kontaktujte kancelář na tel. čísle...";    
}

//Sanitace vikend a stanovení default hodnoty
if (!empty($_POST['vikend'])) {        
    $vikend = filter_var($_POST['vikend'],FILTER_SANITIZE_STRING);
    $vikend = trim($vikend);
} else { 
    $vikend = "Zavřeno";    
}

//Sanitace pobocka - možná není třeba, je to radio button
$pobocka = filter_var($_POST['pobocka'],FILTER_SANITIZE_STRING);
echo $pobocka.'<br>';

$sql = "SELECT * FROM oteviraci_doba WHERE pobocka ='$pobocka'; ";
$result = mysqli_query($connection, $sql);
$rowcount = mysqli_num_rows($result);
echo $rowcount.'<br>';

//Kontrola, jestli se provede INSERT nebo UPDATE
if( mysqli_num_rows($result) > 0) {

    //Multi query do DB - UPDATE
    $sql = "UPDATE oteviraci_doba SET oteviraci_doba = '$pondeli' WHERE den = 'Po:' AND pobocka = '$pobocka' ;";
    $sql .= "UPDATE oteviraci_doba SET oteviraci_doba = '$utery' WHERE den = 'Út:' AND pobocka = '$pobocka' ;";
    $sql .= "UPDATE oteviraci_doba SET oteviraci_doba = '$streda' WHERE den = 'St:' AND pobocka = '$pobocka' ;";
    $sql .= "UPDATE oteviraci_doba SET oteviraci_doba = '$ctvrtek' WHERE den = 'Čt:' AND pobocka = '$pobocka' ;";
    $sql .= "UPDATE oteviraci_doba SET oteviraci_doba = '$patek' WHERE den = 'Pá:' AND pobocka = '$pobocka' ;";
    $sql .= "UPDATE oteviraci_doba SET oteviraci_doba = '$vikend' WHERE den = 'So + Ne:' AND pobocka = '$pobocka' ;";

    if (mysqli_multi_query($connection, $sql)) {
        echo "Hodnoty úspěšně zapsány.";
    } else {
        echo "Error: " . $sql . "<br>" . mysqli_error($conn);
    }    
    
} else {
    
    //Multi query do DB - INSERT
    $sql = "INSERT INTO oteviraci_doba (den, oteviraci_doba, pobocka) VALUES ('Po:', '$pondeli', '$pobocka');";
    $sql .= "INSERT INTO oteviraci_doba (den, oteviraci_doba, pobocka) VALUES ('Út:', '$utery', '$pobocka');";
    $sql .= "INSERT INTO oteviraci_doba (den, oteviraci_doba, pobocka) VALUES ('St:', '$streda', '$pobocka');";
    $sql .= "INSERT INTO oteviraci_doba (den, oteviraci_doba, pobocka) VALUES ('Čt:', '$ctvrtek', '$pobocka');";
    $sql .= "INSERT INTO oteviraci_doba (den, oteviraci_doba, pobocka) VALUES ('Pá:', '$patek', '$pobocka');";
    $sql .= "INSERT INTO oteviraci_doba (den, oteviraci_doba, pobocka) VALUES ('So + Ne:', '$vikend', '$pobocka');";

    if (mysqli_multi_query($connection, $sql)) {
        echo "Hodnoty úspěšně zapsány.";
    } else {
        echo "Error: " . $sql . "<br>" . mysqli_error($conn);
    }

} // Konec Kontrola, jestli se provede INSERT nebo UPDATE

mysqli_close($connection);
    
} else {
    header("location:."/test.php]http://".$_SERVER['SERVER_NAME']."/test.php", TRUE, 303);
    exit;
} // Konec Podmínka kontrolující, jestli přišla nějaká data z formuláře

Co na to říkáte? Díky.


Jo a tahle část kódu tam byla jen pro kontrolu, tu tam samozřejmě nedám...

$sql = "SELECT * FROM oteviraci_doba WHERE pobocka ='$pobocka'; ";
$result = mysqli_query($connection, $sql);
$rowcount = mysqli_num_rows($result);
echo $rowcount.'<br>';
mimochodec
Profil
Ouha. Na jednu stranu oceňuju, že se opravdu snažíš a leccos zvládáš, ale databázi máš navrženou dost špatně. Udělej si tabulku, kde bude:
ID, pobockanazev, d1, d2, d3, d4, d5, d6, d7

Inputy v tom formu pak nazvi nikoliv pondeli, ale <input name="d1" type="text"> a obdobně pro všechny dny.
Pak nebudeš muset toto if (!empty($_POST['pondeli'])) { psát šestkrát, napíšeš to jednou a dáš to do cyklu.

Těch updatů / insertů pak nebude šest, ale jeden.


for ($i = 1; $i <= 7; $i++) {
  if (!empty($_POST['d'.$i])) {        
      $d[$i] = filter_var($_POST['d'.$i],FILTER_SANITIZE_STRING);
      $d[$i] = trim($d[$i]);
  } else { 
      $d[$i] = "Kontaktujte kancelář na tel. čísle...";    
  }
}

$sql = "UPDATE oteviraci_doba SET "; 

for ($i = 1; $i <= 7; $i++) {
  $sql .= "d".$i."='".$d[$i]."', "; 
}

$sql .= "1=1 WHERE podminka"; 

Je to jen nástřel. Uprav si to podle sebe. To "1=1" nedělá nic, je to tam jen kvůli té nadbytečné čárce. Můžeš to samozřejmě řešit i jinak. Ten UPDATE dotaz se dá sestrojit i bez cyklu, bude to jen o chlup delší a bude to přehlednější. Záleží jen na tobě.
nadsenec
Profil *
mimochodec: Díky! Návrhem tabulky v DB jsem se, přiznám se, moc nezatěžoval, protože tam těch záznamů bude málo. Tvé řešení je určitě lepší.

Teď se ještě pokusím podívat na to vytvoření a udržení session po přihlášení.
Joker
Profil
mimochodec:
Ouha. Na jednu stranu oceňuju, že se opravdu snažíš a leccos zvládáš, ale databázi máš navrženou dost špatně. Udělej si tabulku, kde bude:
ID, pobockanazev, d1, d2, d3, d4, d5, d6, d7

Eh… Ten jeho původní návrh mi připadá lepší, než tohle.
Obecně pokud tabulka má indexované sloupce (d1, d2, …), v 99 % případů je to chybný návrh.
Myšlenka, že by existovalo víc dnů než 7, se může zdát absurdní, ale jen do chvíle, než bude někdo chtít např. jinou otevírací dobu v sudý a lichý týden.
nadsenec
Profil *
Já při návrhu tabulky vycházel z toho, co píše Joker (každý zápis na vlastním řádku). mimochodec asi zase naopak vycházel z toho,že chtěl zjednodušit zápis v PHP.

Já bych to ideálně chtěl udělat v MySQL pomocí ON DUPLICATE KEY UPDATE (nebo víte o něčem lepším?), ale to se mi moc nedařilo, jak už jsem psal, tak jsem to udělal přes multi query a dotaz do DB na počet řádků (INSERT/UPDATE)...
Joker
Profil
nadsenec:
Já bych návrh databáze volil ( | odděluje sloupce tabulky):
Informace o pobočce:
ID Pobočky | Název | Popis (?) | -Co dalšího je potřeba-

Otevírací doby- primitivní varianta:
ID Pobočky | Den | Doba (textově)
Nebo univerzálnější varianta:
ID Pobočky | Den | Od (čas) | Do (čas) | Poznámka

Den by byl výčtový typ a u toho posledního případu by se více dob ve stejný den (od-do, přestávka, od-do) udělalo jako více záznamů.

Varianta z [#22] mimochodec vypadá na pohled jednodušší (jen jedna tabulka a ten nejzákladnější výpis bude jednoduchý SELECT), ale zabíjí možnost dalšího vylepšování. Na argument, že to je jen jednoduchá aplikace lze odpovědět poučkou: Každý složitý fungující systém se vznikl vývojem z jednoduchého fungujícího systému.

A taky, podle mého názoru, když už se to učit, tak se to učit správně.
mimochodec
Profil
Joker:
Varianta z [#22] mimochodec vypadá na pohled jednodušší (jen jedna tabulka a ten nejzákladnější výpis bude jednoduchý SELECT), ale zabíjí možnost dalšího vylepšování.

Sice ti rozumím, ale nesouhlasím. Každé zadání je potřeba vybalancovat mezi efektivním a univerzálním. Udělat databázi podle tebe by bylo časově náročnější jen nepatrně, udělat k tomu administraci už by byl rozdíl znatelný.
To, co píšeš o lichém a sudém týdnu, by znamenalo zásah do struktury databáze, ano. A trochu i v php. Ale nevidím v tom žádný fatální problém. Bez zásahu programátora by se úprava na dvoutýdenní provoz neobešla ani v té tvé variantě.

Obecně pokud tabulka má indexované sloupce (d1, d2, …), v 99 % případů je to chybný návrh.
Nebavíme se o desítkách sloupců. Buď jde o princip, kdy se na strávený čas nehledí, nebo jde o praktické řešení a pak bych si dovolil toto zahrnout do toho jednoho procenta.

To jen aby nadsenec znal oba úhly pohledu.
Joker
Profil
mimochodec:
Udělat databázi podle tebe by bylo časově náročnější jen nepatrně, udělat k tomu administraci už by byl rozdíl znatelný.
Administrace bude vypadat úplně stejně, jediný rozdíl bude v SQL dotazech.
Dokonce možná to moje řešení bude jednodušší, protože místo nestandardního iterování přes sloupce záznamu používá běžné iterování přes záznamy.

Bez zásahu programátora by se úprava na dvoutýdenní provoz neobešla ani v té tvé variantě.
Možná obešlo. Tak jak jsem to popsal by největší problém byl ten Den typu ENUM pokud by se zároveň ta hodnota používala pro řazení, protože by se pak musely nové hodnoty přidávat někam doprostřed a to je vopruz.
Lepší řešení, na které by ale nebyl problém to převést ve chvíli, kdy by se potřeba měnit dny objevila, by bylo mít číselník dnů jako další tabulku dny: id | popis | poradi
Samozřejmě kdyby se možnost změn dnů připouštěla už na začátku, je lepší to tak udělat rovnou.

Výběrový dotaz by vypadal: SELECT dny.popis AS den, doba.od AS od, doba.do AS do FROM doba JOIN dny ON doba.den = dny.id ORDER BY dny.poradi, doba.od
Tj. žádné drama.

Potom přidání nové možnosti pro den je otázka dvou SQL dotazů do databáze (UPDATE dny SET poradi = poradi + 1 WHERE poradi > (kam to chci vložit - 1) a vložení nového záznamu).
Což je bezproblémové, je to jen přidání záznamu do nějaké tabulky, není problém na to udělat formulář a i ručně je to je minutová záležitost.

V tom vícesloupcovém řešení by přidání nové možnosti pro den znamenalo:
1. Zálohovat databázi
2. Vložit nový sloupec do databázové tabulky, tj. ALTER TABLE nad hlavní tabulkou s daty. Potenciálně riskantní operace, proto byla předtím ta záloha databáze.
3. Přepsat kód aplikace tak, aby počítal s novými sloupci (v ideálním případě jen někde změnit mapu databázových sloupců, v horším případě přepsat SQL dotazy, jejich zpracování a položky na formuláři)
4. Měnili jsme kód, takže přetestovat.

Tj. náročností jsme o několik řádů jinde.


Nebavíme se o desítkách sloupců.
Ale ano.
7 sloupců pro dny v týdnu, když se přidají sloupce pouze pro sudé a pouze pro liché týdny, je celkem 21 sloupců, což už jsou „desítky sloupců“.

Dál ta „vícesloupcová“ varianta má pro dobu jen jeden sloupec, zatímco ta moje umožňuje ukládat časy.

Jde o jeden ze základních problémů u návrhu databází, který by se laicky dal vyjádřit jako: „Informace je v databázi uložená, ale nelze ji z databáze získat, nelze se na ni dotázat“.

Např. pokud mám sloupec Doba a v něm hodnotu: „8 - 12, 12.45-17“, informace, jestli určitá pobočka má v určitý čas otevřeno, tam zjevně uložená je, ale prakticky není možné sestavit dotaz, který by ji získal.

Buď jde o princip, kdy se na strávený čas nehledí, nebo jde o praktické řešení a pak bych si dovolil toto zahrnout do toho jednoho procenta.
Tak podle mého názoru ta vícesloupcová varianta:
- Ušetří čas při prvním návrhu, protože se nad tím nemusí moc přemýšlet.
- Nebude výrazně snazší na naprogramování.
- Nebude zásadně rychlejší.
- Znamená daleko větší problémy při budoucích úpravách, do takové míry, že může být lepší celé to řešení zahodit a napsat nové.
Tomáš123
Profil
Joker:
Čo sa týka návrhu databázy, navrhol som iba jednu a v praxi to nemám vyskúšané. Mám ale návrh: Nebolo by najkompromisnejšie riešenie pridať do tabuľky interval opakovania? Užívateľ by si pri registrovaní firmy mohol napríklad odškrtnúť políčko, že otváracie hodiny nie sú vždy rovnaké a zadať tam interval opakovania. V tabuľke by sa bez konkrétnej hodnoty objavila tá predvolená, a to opakovanie raz za týždeň. Čo si o tom myslíš?
nadsenec
Profil *
Jak už jsem na začátku říkal - nějaký systém zadávání otevírací doby, ze kterého musím vycházet (protože přišel zadavateli nejjednodušší) tady už je a je ve formátu...

Po: 09:00 - 12:00, 13:00 - 16:00
Út: 08:00 - 12:00, pouze domluvené schůzky
St: 07:00 - 11:30, 13:00 - 15:00
Čt: Pouze domluvené schůzky
Pá: Pouze domluvené schůzky, 13:00 - 14:30
So + Ne: Zavřeno

Proto jsem otevírací dobu nechal v jednom sloupci. A protože ani poboček a různých uživatelů do DB zapisujícíh nebudou desítky, ale jednotky (do 10) nechal jsem vše v jedné tabulce. Jediné, co jsem si přál změnit bylo rozepzat víkend na sobotu a neděli, protože kdyby se někdy náhodou rozhodli mít otevřeno i o víkendu, musel bych to zase předělávat, ale ani toto mi prozatím neschválil.
« 1 2 »

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: