Autor Zpráva
peter_r
Profil
prosím o pomoc, takto mám vytvorenú ponuku na výber ponuky do formulára:

<select name="tvrdost" size="1"> 
            <option value="">-
            <option value="T2">T2
            <option value="T3">T3
            <option value="T4">T4
            <option value="T5">T5
            <option value="H2">H2
            <option value="H3">H3
            <option value="H4">H4
            <option value="H5">H5
            </select>

ale tých tvrdostí môže byť veľmi veľa, a nechce sa mi to vypisovať ručne, preto by som to vytvoril do tabuľky ale potom neviem ako to z tej tabuľky do ponuky vyťiahnuť

if ($_POST)
        {            
            Db::query('
                INSERT INTO latky (nazov, typ, cislo_obj, datum_zap)     
                VALUES (?, ?, ?, ?)
            ', $_POST['nazov'], $_POST['typ'], $_POST['cislo_obj'], $dt);
            echo('<p>Objednávka bola úspešne pridaná.</p>');
        }
        
        $ponuka = Db::queryAll('
            SELECT *
            FROM tabulka
        ');
        Tvrdosť:
            <select name="tvrdost" size="1"> 
            <option value="">-
            <option value="T2">T2
            <option value="T3">T3
            <option value="T4">T4
            <option value="T5">T5
            <option value="H2">H2
            <option value="H3">H3
            <option value="H4">H4
            <option value="H5">H5
            </select>

a neviem ako tam $ponuka dostať


tabuľka s tvrdosťami sa volá tabulka a má 3 položky (id, nazov, vyrobca)
Taps
Profil
peter_r:
zkus
        Tvrdosť:
            <select name="tvrdost" size="1"> 
            <option value="">-</option>
<?php
       $ponuka = Db::queryAll('
            SELECT *
            FROM tabulka
        ');
        foreach($ponuka as $polozka){
  ?>

            
            <option value="<?php echo $polozka['nazov']; ?>"><?php echo $polozka['nazov']; ?></option>

            <?php } ?>
            </select>
peter_r
Profil
super, ďakujem

ešte ale potrebujem, aby priradilo podľa výberu aj výrobcu a zapísalo to do tabuľky, niečo ako $vyber=$polozka['vyrobca'] a neviem ako na to a kde to dať
peter_r
Profil
nepomôže mi prosím niekto s tým? :-(
Kajman
Profil
Musíte to lépe vysvětlit, křišťálovou kouli nemáme.

Obecně byste měl mít v html atributu value jedinečné id tvrdosti a s tím v programu pracovat. Uživateli zobrazit popisný text (tedy asi ten nazov mezi <option>). Pokud pak někde v tabulce zobrazujete název nebo výrobce, tak byste ho měl jednoduše najít dle toho jedinečného id v oné číselníkové tabulce tvrdostí, ze kterého ten <select> generujete.
peter_r
Profil
ospravedlňujem sa, myslel som že som to vysvetlil dobre, tak to skúsim rozpísať ...

Mám tabuľku s názvom tabulka, kde sú 3 stlpce:

ID...nazov_tvrdost....vyrobca
1....t2.....................matador
2....t3.....................michelin
3....t4.....................continental

atď

Pri zapisovaní inej položky pri výbere tvrdosti ponúkne na výber tvrdosti z uvedenej tabuľky zo stĺpca názov_tvrdost (t2, t3 .....), toto už mám vyriešené vyššie, čiže zapíše to do tabuľky:

Db::query('
                INSERT INTO latky (nazov, typ, cislo_obj, datum_zap)     
                VALUES (?, ?, ?, ?)
            ', $_POST['nazov'], $_POST['typ'], $_POST['cislo_obj'], $dt);

kde do položky nazov zapise hodnotu zo

<select name="nazov" size="1"> 
            <option value="">-</option>
<?php
       $ponuka = Db::queryAll('
            SELECT *
            FROM tabulka
        ');
        foreach($ponuka as $polozka){
  ?>
             
            <option value="<?php echo $polozka['nazov_tvrdost']; ?>"><?php echo $polozka['nazov_tvrdost']; ?></option>
 
            <?php } ?>
            </select>

a potrebujem, aby mi do tabuľky latky ešte zapísalo výrobcu podľa zvolenej tvrdosti, čiže

Db::query('
                INSERT INTO latky (nazov, typ, cislo_obj, datum_zap, vyrobca)     
                VALUES (?, ?, ?, ?)
            ', $_POST['nazov'], $_POST['typ'], $_POST['cislo_obj'], $dt, .......?????......);

a toto neviem .......?????......
anonym_
Profil *
peter_r:
Vždyť to je přeci zbytečné. Výrobce a tvrdost je definovaná už tím ID v tabulce tabulka. Je hloupost ta data duplikovat ještě ve druhé tabulce latky, tam si ukládej pouze to ID z první tabulky.
peter_r
Profil
tie dve tabuľky nemajú nič spoločné, iba to, že pri zapisovaní do druhej tabuľky pre hodnotu nazov ponúka výber z tej prvej tabuľky
anonym_
Profil *
peter_r:
Mají společné to, že obě už nyní obsahují duplicitní data ve sloupci nazov/nazov_tvrdost. Ty k tomu chceš duplikovat ještě další sloupec.

Správné řešení je mít tabulku tabulka tak, jak ji máš ty (pravděpodobně, bez dalšího kontextu jen hádám), a v tabulce latky mít sloupce tabulka_id | typ | cislo_obj | datum. Typ a výrobce pak získáš na základě toho cizího klíče tabulka_id.
peter_r
Profil
už som z toho mimo aj ja, musím si to premyslieť
Kajman
Profil
Přečtěte si nějakou knížku o relačních databázích, při dodržování normálních forem vám takové řešení bude jasné.
en.wikipedia.org/wiki/Database_normalization
peter_r
Profil
aj keď tvrdíte, že je to zbytočné, chcel by som aj tak poprosiť o radu, ako to urobiť, napíšem nový príklad:

mám tabuľku druhy_latky

id_druh nazov_latky dodavatel_latky
1 Madryd Davis
2 Infinity Toptextil
3 Magic velvet Davis
4 Vienna Fargotex
5 Etna Fargotex
6 Granada Davis

druhá tabuľka je latky, kde zapisujem objednávky a pri vypisovaní do poľa nazov vyberám z ponuky z prvej tabuľky

Db::query('
   INSERT INTO latky (nazov, metre)     
   VALUES (?)
   ', $_POST['nazov'], $_POST['metre']);
   echo('<p>Objednávka bola úspešne pridaná.</p>');

<form method="post">
 Názov látky:<select name="nazov" size="1"> 
            <option value="">-
                <?php
                       $ponuka = Db::queryAll('
                            SELECT *
                            FROM druhy_latky
                        ');
                        foreach($ponuka as $polozka){
                  ?> 
            
            <option value="<?php echo $polozka['nazov_latky']; ?>"><?php echo $polozka['nazov_latky'];  ?></option>
             
            <?php }  ?>
        </select>
Metre:<input type="text" name="metre" />
<input type="submit" value="Pridať" />
</form> 

a teraz chcem aby do tabuľky latky do stĺpca dodavatel zapísalo dodávateľa z tabuľky druhy_latky podľa výberu

budem vám nesmierne vďačný
Serg
Profil
Máš pro to v té druhé tabulce vytvořený sloupec?

Můžeš buď (1) v php jedním SQL dotazem najít řádek vybrané látky, a dalším SQL dotazem provést INSERT.
(2) Nebo lépe: neukládat redundantní (stejný) textový data ve dvou tabulkách, a při SELECTu použít JOIN :)
Pro obě možnosti ale bude potřeba, abys ve value <option>u měl id_druh místo nazov_latky (jak už psal [#5] Kajman a [#7] anonym), protože id_druh je primární klíč, a tím pádem bude vyhledávání mnohem rychlejší než podle jména.
<select name="latka" size="1">
...
<option value="<?php echo $polozka['id_druh']; ?>"><?php echo $polozka['nazov_latky'];  ?></option>

(1)
<?php
if (isset($_POST['latka'])) {
  $latky = Db::queryAll("SELECT * FROM druhy_latky WHERE id_druh = ?", intval($_POST['latka']));
  if ( ! isset($latky[0])) die("Latka nenalezena.");
  
  $latka = $latky[0];
  
  Db::query("INSERT INTO latky (nazov, dodavatel, typ, cislo_obj, datum_zap) VALUES (?, ?, ?, ?, ?)",
    $latka['nazov_latky'], 
    $latka['dodavatel_latky'], 
    $_POST['typ'], 
    $_POST['cislo_obj'], 
    $dt
  );
  
  echo('<p>Objednávka bola úspešne pridaná.</p>');
}

(2) pokud se rozhodneš jít touto cestou, tak bude potřeba upravit tabulku latky, aby se místo názvu ukládalo id_druh
<?php
if (isset($_POST['latka'])) {
  
  Db::query("INSERT INTO latky (id_druh, typ, cislo_obj, datum_zap) VALUES (?, ?, ?, ?)",
    intval($_POST['latka']),
    $_POST['typ'], 
    $_POST['cislo_obj'], 
    $dt
  );
  
  echo('<p>Objednávka bola úspešne pridaná.</p>');
}

výběr by se pak realizoval pomocí SELECTu ze 2 tabulek spojených pomocí JOINu:
$objednavky = Db::queryAll("SELECT * FROM latky LEFT JOIN druhy_latky USING(id_druh)");

Edit: sry, trochu tam míchám id_druh a id_latky, ale předpokládám že to u tebe bude asi jedno a to samý, akroát jsi to v průběhu času přejmenoval, že?
Edit 2: přepsáno vše na id_druh, protože pro použití USING je potřeba, aby se sloupce v obou tabulkách jmenovaly stejně / alternativně by šlo použít ON kde to není nutný, akorát je to delší zápis

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