IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Milan Krokavec:19.7.2020 0:24

Ahojte
potreboval by som trocha pomôcť.
mám formulár, kde jedno pole sa nezadáva ručne, ale vyberá zo zoznamu.
Ten zoznam nie je pevný, ale položky sa ťahajú z tabuľky ule, stĺpec má názov hodnota
načítam ich do $cislaucov

cez foreach ich vypíše, teda sú v $cislaucov načítané.

$cislaulov = Db::queryAll('
SELECT * FROM ule
');

echo('<h2>Úle</h2><table border="1">');

foreach ($cislaulov as $ule)
{
echo('</td><td>' . htmlspecialchars($ule['hodnota'] )." ");
echo('</td></tr>');
}
echo('</table>');

No keď to dám do tohto:

<form method="post">
<table border="1" cellpadding="1" cellspacing="1">
<tbody>
<tr>
<td>D&aacute;tum</td>
<td>Stanovi&scaron;te</td>
<td>číslo úľa</td>
<td>Text</td>
</tr>
<tr>
<td><input name="datum" type="text" /></td>
<td><input name="stanoviste" type="text" /></td>
<td>
<select name="ul" id="ul" >
<?php foreach($cislaulov as $ul): ?>
<option value="<? = $ul['hodnota'] ?>"></option>
<?php endforeach ?>
</select>
</td>
<td><input name="textt" type="text" /></td>
</tr>
</tbody>
</table>

<input type="submit" value="Uložiť" />
</form>

tak tam to už nefunguje. Už si neviem dať rady. položky vo formulári dá do tabuľky, len nespraví tú jednu položku čo by malo natiahnuť z DB. Vďaka.

Chci docílit: pri vypĺňaní formulára potrebujem dosiahnuť, aby sa nedala zadať ľubovolný text, ale len zo zoznamu. A ten sa môže meniť, takže to nemôžem dať napevno, ale musím ťahať z databázy

 
Odpovědět
19.7.2020 0:24
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:19.7.2020 7:55

Firefox ma takovou sikovnou vec, rika se tomu Zobrazit html kod stranky.
Pokud ti funguje prvni cyklus, pak ten druhy zobrazi toto:

// prvni cyklus
echo('</td><td>' . htmlspecialchars($ule['hodnota'] )." "); // tady melo byt asi TR a nikde predtim nemas tag table
echo('</td></tr>');

html
</td><td> aaa </td></tr>
</td><td> bbb </td></tr>
</td><td> ccc </td></tr>

page view
aaa | bbb | ccc

---
// druhy cyklus
<select name="ul" id="ul" >
<?php foreach($cislaulov as $ul): ?>
<option value="<? = $ul['hodnota'] ?>"></option>
<?php endforeach ?>
</select>

html kod
<option value="aaa"></option>
// <option value="aaa">aaa</option> nejspis se pokousis docilit ale tohoto html kodu
<option value="bbb></option>
<option value="ccc></option>

page view
nic
nic
nic

1. Mi to prijde, ze neznas ani zaklady html, nevis, jaky je spravny html kod pro table nebo select.
https://www.jakpsatweb.cz/html/

2. Kdyz to vypisujes do stranky, mel bys tam mit htmlspecialchars jako v prvnim cyklu

3. Zkus oznacovat promene nejak rozumneji. A zkus to oznacovat stejne v obo pripadech. Ja bych treba pouzil

<?php foreach($uly_list as $item): ?> nebo
<?php foreach($uly_list as $row): ?>

4. A polozka v db tam nema id autoincrement? Protoze, ja bych pouzil to idecko. A udelal nejake jednoduche webove rozhrani, kde si to muze uzivatel editovat.

<?php
$cis_uly = array();
foreach($uly_list as $item):
  $cis_uly[$item['id']] = $item['value'] // $item['hodnota']
...
$sel_uly = '';
foreach($cis_uly as $item):
  $sel_uly .= '<option value="'.htmlspecialchars($item['id']).'">'.htmlspecialchars($item['value']).'</option>';
 ?>
 
Nahoru Odpovědět
19.7.2020 7:55
Avatar
Odpovídá na Peter Mlich
Milan Krokavec:20.7.2020 2:06

Beriem Tvoju kritiku a cením si rady, nie som programátor a ani nemám také ambície. Potrebujem spraviť jednoduché rozhranie na zápis dát do DB a prehrýzam sa ťažšie html a php....<select> mi fungoval keď som tam mal pevné hodnoty, aj zapisovalo do DB bez problémov. Ale nahradiť to dátami z DB je nad moje sily. Toto som mal len taký testovací príklad, preto je to tam tak divoko, skúšal som a menil.....
čo teda presne má byť medzi <select> a </select>, ?
Skúšal som to nejako zapísať, ale bez úspechu. Vďaka za pomoc

 
Nahoru Odpovědět
20.7.2020 2:06
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.7.2020 8:26

Ok, takze znova. Posli html kd, ktery ti to vypise. Nebo si v nem najdi chyby.. Www prohlizec pracuje s html kodem. Pokud je kod spatne, tak se nemusi zobrazit. Jako zakladni level pro overeni spravnosti html kodu stranky lze pouzit html validator. Ale zrovna tuhle chybu by ti nemusel zminit.

<option value="aaa"></option>
// <option value="aaa">aaa</option> nejspis se pokousis docilit ale tohoto html kodu

https://validator.w3.org/
Mas na vyber, vlozit url adresu stranky, nahrat html soubor nebo zkopirovat tam html kod do textarea. Pak kliknes na tlacitko Check a dole ti to vypise chyby a varovani. Ze tam nemas v options nic, to by mohlo byt mezi varovanimi.

 
Nahoru Odpovědět
20.7.2020 8:26
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.7.2020 8:33

Html kod by mel vypadat podobne jako na teto strance:
https://getbootstrap.com/…input-group/#…

<select class="custom-select" id="inputGroupSelect01">
  <option selected>Choose...</option>
  <option value="1">One</option>
  <option value="2">Two</option>
  <option value="3">Three</option>
</select>

Bez te class. Takze se podivej, co tvuj php kod generuje, posila www prohlizeci.

Ve firefoxu se zobrazuje zdrojovy kod takto:
Kliknes levym na stranku, kliknes pravym tl mysi na stranku. Zobrazi se menu a v nem je Zobrazit zdrojovy kod. (Ten muzes pres ctrl+a, ctrl+c, ctrl+v oznacit a zkopirovat do toho validatoru jako direct input).

Domnivam se, ze tvuj php kod generuje tento kod:

<select class="custom-select" id="inputGroupSelect01">
  <option selected></option>
  <option value="1"></option>
  <option value="2"></option>
  <option value="3"></option>
</select>

Najdi 7 rozdilu nebo aspon 4 :)
Cili, obsah optionu je prazdy, takze www prohlizec nic nezobrazi. A nebo se pletu a mozna podle html pravidel by se mel zobrazit. :) To nevim, takovyto zapis jsem nepouzil, bez hodnoty mezi tagy option.

Editováno 20.7.2020 8:34
 
Nahoru Odpovědět
20.7.2020 8:33
Avatar
Odpovídá na Peter Mlich
Milan Krokavec:22.7.2020 2:27

Začnem od konca....
Ak sa použije:

<select name="nieco" id="nieco">
   <option value="1"></option>
  <option value="2"></option>
  <option value="3"></option>
</select>

tak sa ukáže rozbaľovací zoznam, bude mať 3 riadky, ale budu prázdne. Keď zvolím 3-tí prázdny riadok, premenná bude obsahovať hodnotu 3.

Som rád, že moja snaha zistiť problém aj s Tvojou pomocou bola korunovaná úspechom. Syntax mi robí ešte problémy, ale pomaly sa posúvam. Takže teraz to robí čo som chcel a vyzerá to takto:

<!DOCTYPE html>
<html lang="cs-cz">

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>Včelín</title>
    </head>
    <body>
        <h1>Včelín</h1>
<?php
        require_once('Db.php');
        Db::connect('localhost', 'vcely', 'root', '');
        $cislaulov = Db::queryAll('
    SELECT  * FROM ule
');
?>

<form method="post">
            <table border="1" cellpadding="1" cellspacing="1">
                   <tbody>
                          <tr>
                                 <td>Datum</td>
                     <td>Stanoviste</td>
                     <td>Cislo ula</td>
                                 <td>Text</td>
                          </tr>
                          <tr>
                                 <td><input name="datum" type="text" /></td>
                     <td><input name="stanoviste" type="text" /></td>
                     <td>
                        <select name="ul" id="ul" >
                            <?php foreach($cislaulov as $ule):   ?>

                                <option value="<?php echo (htmlspecialchars($ule['hodnota'])) ?>"><?php echo (htmlspecialchars($ule['hodnota'])); ?> </option>'

                            <?php  endforeach ?>
                        </select>
                    </td>
                                 <td><input name="popis" type="text" /></td>
                          </tr>
                   </tbody>
            </table>

            <input type="submit" value="Uložiť" />
        </form>

<?php
function generujBlokvcelin() {

        if ($_POST)
        {
            $datum = date("Y-m-d H:i:s", strtotime($_POST['datum']));
            Db::query('
                INSERT INTO rs_vcelin (stanoviste, ul, datum, popis)
                VALUES (?, ?, ?,?)
            ', $_POST['stanoviste'], $_POST['ul'], $datum, $_POST['popis']);

            echo('<p>Dáta uložené.</p>');
        }
        $uzivatele = Db::queryAll('
    SELECT * FROM rs_vcelin
');

$result = mysql_query("SELECT * FROM ule" );
$pocet_ulov = mysql_num_rows($result);


echo('<h2>Aktuálny počet úľov je :'. (htmlspecialchars($pocet_ulov)) .' </h2>');
echo( '<table border="1">');
    echo('</td><td>Dátum');
    echo('</td><td>Stanovište');
    echo('</td><td>Úľ' );
    echo('</td><td>Popis operácie');
    echo('</td></tr>');
foreach ($uzivatele as $u)
{
    $datum = date("d.m.Y", strtotime($u['datum']));
    echo('</td><td>' . htmlspecialchars($datum));
    echo('</td><td>' . htmlspecialchars($u['stanoviste']));
    echo('</td><td>' . htmlspecialchars($u['ul']));
    echo('</td><td>' . htmlspecialchars($u['popis']));
    echo('</td></tr>');
}
echo('</table>');
}
?>
         </body>
</html>

Možno sú tam ešte nejaké prehrešky voči syntaxi, ale funguje to. Takže ešte raz veľká vďaka za nakopnutie. :-)

 
Nahoru Odpovědět
22.7.2020 2:27
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:22.7.2020 8:44

Prima.
Tak, v dalsim levelu bych oddelil php kod od html kodu.
A v dalsim levelu bych jeste mozna vytvoril funkci escapeHtml misto htmlspecialchars, ktera je zkratka nerozumne pojmenovana. Pozdeji treba budes resit escapeUrl, escapeJs, escapeSql a podobne. Pak mas sjednocene nazvy a snadneji se to pamatuje nez htmlspecialchars, url_encode, mysql_escape_re­al_chars, ...
A v dalsim levelu bych si udelal funkci, ktera vypisuje select i se selectet radkem a data z db preformatoval pro tu funkci.

<?php
// pisu to z hlavy, tak, snad to bude fungovat :)
function createSelect($name='', $item_list=array(), $selected_key_list=array())
{
$pad_sel = "\n  ";
$pad_opt = "\n    ";
$out = '';
$name = escapeHtml($name);
$out .= $pad_sel . "<select name='$name' id='$name'>"; // nebo "<select name=\"$name\" id=\"$name\">";
foreach($item_list as $key=>$value)
    {
    $selected = '';
    if (($founded_key = array_search($key, $selected_key_list)) !== FALSE) {
         {
         unset($selected_key_list[$founded_key]);
         $selected = ' selected';
         }
    $key   = escapeHtml($key);
    $value = escapeHtml($value);

    $out .= $pad_opt . "<option value='$key'$selected>$val</option>";
    }
$out .= $pad_sel . '</select>';
return $out;
}

$uly_list = array();
$uly_list[$ule['hodnota']] = $ule['hodnota']; // to vytvoris cyklem
// pak tam sice mas 2 cykly, ale tu funkci muzes pouzit na vykresleni vice selectu
// kdezto ve tvem pripade mas vzdy unikatni kod

No, a oddeleni php a html vypada treba takto

<?php
$page = array();
$page['sel_uly'] = createSelect('ul', $uly_list, array());
...
?>
                     <td><input name="stanoviste" type="text" /></td>
                     <td><?php echo $page['sel_uly'] ; ?></td>

On ten html kod je pak i prehlednejsi a lepe se hlida uzavreni tagu.

Editováno 22.7.2020 8:47
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
22.7.2020 8:44
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.