Logika s časy | SQL+PHP – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Logika s časy | SQL+PHP – PHP – Fórum – Programujte.comLogika s časy | SQL+PHP – PHP – Fórum – Programujte.com

 

Ralis0
Newbie
30. 3. 2019   #1
-
0
-

Dobrý den, 

prosím, mám problém s vytvořením logiky. Situace je taková:

mám tabulku Objednavky s atributy ID,cislo_objednavky,ridic,datum,cas

do této tabulky posílám data s jednoduchého formuláře pomocí PHP.

Potřeboval bych vytvořit logiku takovou, aby když zvolím datum, např. 1.4.2019 a přidělím mu čas, např. 8:00, tak se pak (po použití tohoto času) už v nabídce tento čas pro tohle konkrétní datum(den) nenabídne. Prostě aby nešly zvolit v jeden den dva stejné časy :-) ..viz.příloha

Klidně bych to řešil i přes nějakou pomocnou tabulku, ale nenapadá mě nějaký rozumný způsob, jak to ověřovat..

Děkuji moc.

Připojen obrázek.

Připojen obrázek.

Nahlásit jako SPAM
IP: 2a00:1028:919a:5eb6:f0f7:fca4:f16:1677...–
Kit+15
Guru
30. 3. 2019   #2
-
+1
-
Zajímavé

#1 Ralis
Dal bych přednost tomu, aby se zobrazoval i obsazený čas kvůli rovnoměrnosti časové osy. Samozřejmě obsazený čas vyznačit.

Pokud bys trval na původním záměru, tak můžeš použít operátor MINUS a od tabulky s provozní dobou odečíst tabulku s obsazenými časy.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Ralis0
Newbie
30. 3. 2019   #3
-
0
-

#2 Kit

Zdravim :) , určitě, to je skvělá připomínka, já právě nevím, jestli si udělat ještě pomocnou tabulku - nějaké počítadlo pouze pro ty časy a nebo to udělat nějak ,,elegantněji" ? 

Nahlásit jako SPAM
IP: 2a00:1028:919a:5eb6:f0f7:fca4:f16:1677...–
Kit+15
Guru
30. 3. 2019   #4
-
0
-

#3 Ralis
S tou pomocnou tabulkou to bude mnohem jednodušší. Pokud se v budoucnu změní provozní doba, jen upravíš tabulku. Tabulka může být denní, týdenní podle potřeby. Také ji můžeš mít jako virtuální - jen ve formě části SELECTu.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Ralis0
Newbie
30. 3. 2019   #5
-
0
-

#4 Kit
jasně, prakticky to mám teď .. fixně napsané v html

no jako klidně označit nějak, že ty časy byly už obsazeny... ale jak na to? :/

<div class="form-group">
                <label for="CAS_VYKLADKY">Čas vykládky:</label>
                <select required class="form-control" id="CAS_VYKLADKY" name="CAS_VYKLADKY">
                    <option value=""></option>
                    <option value="07:00:00">07:00:00</option>
                    <option value="08:00:00">08:00:00</option>
                    <option value="09:00:00">09:00:00</option>
                    <option value="10:00:00">10:00:00</option>
                    <option value="11:00:00">11:00:00</option>
                    <option value="12:00:00">12:00:00</option>
                    <option value="13:00:00">13:00:00</option>
                    <option value="14:00:00">14:00:00</option>
                    <option value="15:00:00">15:00:00</option>
                    <option value="16:00:00">16:00:00</option>
                </select>
            </div>
Nahlásit jako SPAM
IP: 2a00:1028:919a:5eb6:f0f7:fca4:f16:1677...–
Kit+15
Guru
30. 3. 2019   #6
-
0
-

#5 Ralis
Měl jsem na mysli SELECT v MySQL.

V HTML můžeš použít atribut disable. Můžeš ho aktualizovat přes AJAX.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Ralis0
Newbie
30. 3. 2019   #7
-
0
-

#6 Kit
aha super ! spíše já přemýšlím nad tou logikou jako takovou , jak případně udělat tu druhou tabulku - pomocnou.

Potřeboval bych jen ,,nakoupnout", třeba jen nějaký nákres :)

Děkuji moc

Nahlásit jako SPAM
IP: 2a00:1028:919a:5eb6:f0f7:fca4:f16:1677...–
MilanL+1
Grafoman
1. 4. 2019   #8
-
+1
-
Zajímavé

#7 Ralis
Cest k výsledku je vícero a každý by to asi řešil jinak.

U toho tvého HTML by nejspíš stačilo po zadání datumu poslat datum do scriptu na server, kterej ti zpátky pošle jen obsazené časy a ty pak pomocí JS (nejlépe AJAXu)  použiješ pro doplnění atributu disabled k daným časům.

No já bych šel přes pomocnou tabulku se seznamem časů. (případně i datum a čas - lze tam pak plánovat přestávky, výpadky, jiný časový režim apod , např den XY od 10 do 13 výpadek Elektřiny)

na tabulku jen s časy pak

select casy.cas, objednavka, ridic

from casy left join Objednavky

where casy.cas=objednavky.cas and datum=$Datum

order by casy.cas

z toho pak v php udelat cyklus na vygenerování option položek pro select, když v záznamu není řidič je to volný termín, když je řidič bud přeskočíš čas, nebo nastavíš attribut disabled a k času zárověn můžeš hodit i info na co je čas rezervován Obj+řidič

Ber to jen jako navedení, sepisoval jsme to celkem narychlo můžou tam být chyby.

Nahlásit jako SPAM
IP: 91.139.9.–
Ralis0
Newbie
1. 4. 2019   #9
-
0
-

#8 MilanL
Super, moc děkuji !! přesně tohle jsem potřeboval, dnes k večeru vyzkouším :-) díky moc

Nahlásit jako SPAM
IP: 78.45.207.–
Ralis0
Newbie
1. 4. 2019   #10
-
0
-

#8 MilanL
tak jsem nakonec udělal mimo číselník 

table Ciselnik 

ID_CAS 

termin

např.: ID_CAS: 2     termin: 8:00:00

propojeno s tabulkou Objednavky

ID | Objednavka | Ridic | Datum | Cas

kde čas je hodnota z tabulky Ciselnik ID_CAS

 tenhle kod mi vrací hodnoty právě obsazených časů pro určité datum, které vyberu .. potřeboval bych to nějak invertovat a prakticky hotovo

Připojen obrázek.

prosím, nějaký ,,poslední" nápad? :)

if (isset($_POST['potvrdit_datum'])) {
    $datum_objednavky = $_POST['datum_objednavky'];

    require_once("connector.php");
    echo "<br>";

    $sql = "SELECT * FROM Objednavky LEFT JOIN Ciselnik ON Objednavky.cas=Ciselnik.ID_CAS WHERE Objednavky.datum='$datum_objednavky' AND Ciselnik.termin NOT IN ()";

    $result = mysqli_query($conn, $sql);

    if (mysqli_num_rows($result) > 0) {
        // output data of each row
        while ($row = mysqli_fetch_assoc($result)) {

            echo "<option value='" . $row['cas'] . "'\>" . $row['termin'] . "</option>";

        }
        echo "</select><br><div class=\"alert alert-success\" role=\"alert\">Byly nalezeny záznamy pro datum: <strong> " . $datum_objednavky . "<strong></div>";
    } else { echo "</select>";
        echo "<br><div class=\"alert alert-danger\" role=\"alert\">Žádné záznamy pro datum <strong>".$datum_objednavky."</strong></div>";
Nahlásit jako SPAM
IP: 78.45.207.–
MilanL+1
Grafoman
2. 4. 2019   #11
-
0
-

#10 Ralis

v tom SELECTu je třeba prohodit ty tabulky From Ciselnik left join Objednávky

From - bere vše dle podmínek, left join bere to co je propojené.

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
2. 4. 2019   #12
-
0
-

#11 MilanL
a to "AND NOT IN()" bych vyhodil,

Nahlásit jako SPAM
IP: 91.139.9.–
Ralis0
Newbie
2. 4. 2019   #13
-
0
-

#11 MilanL

 ..tak jsem to propojil a dělá to úplně to stejné..

stále to vypisuje pouze obsazené časy, potřeboval bych vypisovat pouze ty neobsazené :)

nešlo by to třeba nějak ošetřit na výstupu AJAX s atributem ,,disabled", už to tady lidé navrhovali, ale vůbec nevím, jak na to .. přeci to nemůže být tak těžké :)

Děkuji

Připojen obrázek.

$sql = "SELECT * FROM Ciselnik LEFT JOIN Objednavky ON Ciselnik.ID_CAS=Objednavky.cas WHERE Objednavky.datum='$datum_objednavky'";
    $result = mysqli_query($conn, $sql);

    if (mysqli_num_rows($result) > 0) {
        // output data of each row
        while ($row = mysqli_fetch_assoc($result)) {

            echo "<option value='" . $row['cas'] . "'\>" . $row['termin'] . "</option>";

        }
Nahlásit jako SPAM
IP: 78.45.207.–
MilanL+1
Grafoman
2. 4. 2019   #14
-
+1
-
Zajímavé

hm to dělá ta podmínka, chtělo by to tu část Objednávky hodit do sub selectu

$sql = "SELECT Termin FROM Ciselnik MINUS SELECT Termin FROM Ciselnik, Objednavky WHERE  Ciselnik.ID_CAS=Objednavky.cas AND Objednavky.datum='$datum_objednavky'";

Nahlásit jako SPAM
IP: 91.139.9.–
Ralis0
Newbie
2. 4. 2019   #15
-
0
-

#14 MilanL

 tak jsem to tam upravil a nic :( nevydá to žádný záznam. Jestli @MilanL (je vidět, že máš dobré nápady..) , tak ti klidně poskytnu údaje na hosting ,kdybys měl chviličku, asi by to pro tebe byla brnkačka na pár minutek...moc by mi to pomohlo, už se s tím pářu třetí den a vymýšlím kraviny jak to obejít :D

$sql = "SELECT termin FROM Ciselnik MINUS SELECT termin FROM Ciselnik, Objednavky WHERE  Ciselnik.ID_CAS=Objednavky.cas AND Objednavky.datum='$datum_objednavky'";
Nahlásit jako SPAM
IP: 78.45.207.–
MilanL+1
Grafoman
2. 4. 2019   #16
-
0
-

#15 Ralis
tak konečně jsem se k tomu dostal a po chvíli trápení se syntaxí v myAdmin jsem se dobral k tomuhle 

SELECT *
FROM `casy`
LEFT JOIN (
SELECT *
FROM `Objednavky`
WHERE `Datum` = "2019-4-1"
)o ON `termin` = o.Cas


 id 	termin 	ID 	Cislo 	Ridic 	Datum 	Cas
1 	07:00:00 	2 	12645	Milan	2019-04-01 	07:00:00
2 	08:00:00 	NULL	NULL	NULL	NULL	NULL
3 	09:00:00 	NULL	NULL	NULL	NULL	NULL
4 	10:00:00 	NULL	NULL	NULL	NULL	NULL
5 	11:00:00 	NULL	NULL	NULL	NULL	NULL

v tabulce časy jsou jen ty termíny dal jsem tam pro test jen 7-11h, a v tabulse objednávek jsem měl 3 různé časy v různých dnech.

Ten sub SELECT v závorce je tam kvůli té datumové podmínce, aby se ta podmínka neprojevila v tom propojení s tabulkou časů, ale jen pro tu pravou stranu.

S tím už si poradíš ne?

Nahlásit jako SPAM
IP: 185.112.167.–
Ralis0
Newbie
2. 4. 2019   #17
-
0
-

#16 MilanL
Děkuji moc 

tak už jsem to dal dohromady :) 

$sql = "SELECT ID_CAS, termin FROM Ciselnik WHERE ID_CAS NOT IN (SELECT cas FROM Objednavky WHERE datum='$datum_objednavky')";

Děkuji moc za všechny rady!!!!

Nahlásit jako SPAM
IP: 78.45.207.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

Podobná vlákna

Programator php a sql — založil tomo

Sql dotaz v PHP — založil Brambor

MultiUpload PHP a SQL — založil sALIERI

Kombinace PHP a MS SQL — založil polonium

Propojení PHP a MS SQL — založil Cheeester

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý