Diskuze: Položka formulára z databázy
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


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>';
?>
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
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.
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.
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.
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_real_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.
+20 Zkušeností
+2,50 Kč

Zobrazeno 7 zpráv z 7.