Form select a echo – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Form select a echo – PHP – Fórum – Programujte.comForm select a echo – PHP – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Vašek
~ Anonymní uživatel
174 příspěvků
22. 7. 2015   #1
-
0
-

   

<html>
<head>
<title>Okresy</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Vyberte okres:
<form action="./Okres2.php" method="POST">
<select name="Okres" /> 
<?PHP
$Cislo_obce=11200;
echo $Cislo_obce;
?>
</select> 
<input type="submit" value="potvrdit výběr" /></form>
</body>
</html> 

Zdravím, potřebuji pomoc, už druhý den na to čumím a chybu nevidím. Proč se mi nezobrazuje echo? Když ale odstraním "select", tak se vše zobrazí. Kde mám chybu?

 

Nahlásit jako SPAM
IP: 31.30.89.–
z_moravec
~ Redaktor
+3
Posthunter
22. 7. 2015   #2
-
+1
-
Zajímavé

#1 Vašek
Ono se zobrazuje, ale prohlížeč ho neukáže. V selectu nemá text co dělat, pokud to chceš mít jako položku výběru, tak to obal <option>.

Nahlásit jako SPAM
IP: 46.39.183.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Vašek
~ Anonymní uživatel
174 příspěvků
22. 7. 2015   #3
-
0
-

#2 z_moravec
Tak pak budu mít jiný problém, protože nezobrazím v selectu  jména obcí, které jsou v okrese?

Nahlásit jako SPAM
IP: 31.30.89.–
z_moravec
~ Redaktor
+3
Posthunter
22. 7. 2015   #4
-
0
-

#3 Vašek
Z toho kódu se toho moc poznat nedá, ale třeba ti pomůže toto:

<select name="Okres" /> 
<?PHP
echo '<option value="' . $Cislo_obce . '">' . $Jmeno_obce . '</option>';
?>
</select> 

Příp. zkus trochu líp popsat, co je cílem.

Nahlásit jako SPAM
IP: 46.39.183.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Kit+15
Guru
22. 7. 2015   #5
-
0
-

#1 Vašek
Za slovem "Okres" máš jedno lomítko navíc. 

<select name="ovoce">
<option value="jablko">Jablíčko</option>
<option value="hruska" selected="selected">Hruštička</option>
</select>
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:8145:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Vašek
~ Anonymní uživatel
174 příspěvků
22. 7. 2015   #6
-
0
-

#4 z_moravec
Cílem je z čísla okresu, získat obce, které mají počáteční  tři číslice shodné a protože mi to nešlo se substr, pomohl jsem si násobením, sčítáním a nakonec between ve where. kód je následující : 

<html>
<head>
<title>Okresy</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Vyberte okres:
<?php 
echo "<form action=\"\" method=\"POST\">";
echo "<select name=\"Kraj\" />";
include "pripojeni.inc";
//$Cislo_obce=$_POST["Kraj"];
//$Cislo_obce=($Cislo_obce*100); 
$Cislo_obce=11200;
$min_obce=$Cislo_obce;
$max_obce=$Cislo_obce+99;
$vysledek_okres = mysql_query("SELECT * FROM `Okresy` where ID_okresu BETWEEN $min_obce AND $max_obce"); 
$pocet_obci_v_okrese = mysql_numrows($vysledek_okres);
for($o=0; $o<$pocet_obci_v_okrese; $o++):
$ID_okresu=mysql_result($vysledek_okres, $j, "ID_okresu");
$Nazev_okresu=mysql_result($vysledek_okres, $j, "Nazev_okresu");
echo "<option value =\"$ID_okresu\">$Nazev_okresu</option>";
endfor; 
echo "</select>"; 
echo "<input type=\"submit\" value=\"potvrdit výběr\" /></form>";   ?>

jelikož mi to zobrazí ale jen jedno město v okrese, zato ale sedmkrát, tak jsem si chtěl zobrazit co je číslem obce, jestli vůbec správně sčítám. Pak jsem se ale zasekl na select :(

#2 z_moravec
celý kód :  

<html>
<head>
<title>Okresy</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Vyberte okres:
<?php 
echo "<form action=\"\" method=\"POST\">";
echo "<select name=\"Kraj\" />";
include "pripojeni.inc";
//$Cislo_obce=$_POST["Kraj"];
//$Cislo_obce=($Cislo_obce*100); 
$Cislo_obce=112;
$min_obce=$Cislo_obce;
$max_obce=$Cislo_obce+99;
$result_of_okres = mysql_query("SELECT * FROM `Okresy` where ID_okresu BETWEEN $min_obce AND $max_obce"); 
$pocet_okresu = mysql_numrows($result_of_okres);
echo "<br />".$pocet_okresu;
for($o=0; $o<$pocet_okresu; $o++):
$ID_okresu=mysql_result($result_of_okres, $j, "ID_okresu");
$Nazev_okresu=mysql_result($result_of_okres, $j, "Nazev_okresu");
echo "<option value =\"$ID_okresu\">$Nazev_okresu</option>";
endfor; 
echo "</select>"; 
echo "<input type=\"submit\" value=\"potvrdit výběr\" /></form>";   ?>

ale zobrazuje

Nahlásit jako SPAM
IP: 31.30.89.–
Řešení
Vašek
~ Anonymní uživatel
174 příspěvků
22. 7. 2015   #7
-
0
-
Vyřešeno Nejlepší odpověď

#6 Vašek
Už to vidím $o a pak ve výčtu $j jsem slepej, jdu se podívat ne bednu. Díky za tu informaci o selectu to se bude hodit. Díky všem za pomoc Dobrou.

Nahlásit jako SPAM
IP: 31.30.89.–
Kit+15
Guru
22. 7. 2015   #8
-
+1
-
Zajímavé

#6 Vašek
Oprav si tam 

$min_obce = $Cislo_obce + 0;
$max_obce = $Cislo_obce + 99;

To "+ 0" je taková velmi jednoduchá ochrana před SQL injection.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:8145:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
22. 7. 2015   #9
-
+2
-
Zajímavé

#7 Vašek
Nedalo mi to a přepsal jsem to do modernějšího PDO. Funguje mi to.

<?php
$dsn = "mysql:host=localhost;dbname=nazevDB";
$user = "user";
$pass = "password";
$atributyPDO = Array(
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
);
$db = new PDO($dsn, $user, $pass, $atributyPDO);

$cisloKraje = $_POST["Kraj"] * 100;
$minObce = $cisloKraje + 0;
$maxObce = $cisloKraje + 99;
$select = $db->prepare("SELECT * FROM Okres WHERE id BETWEEN ? AND ?");
$select->execute(array($minObce, $maxObce));
$okresy = $select->fetchAll(\PDO::FETCH_OBJ);
$pocetOkresu = sizeOf($okresy);
$optionOkresy = implode(PHP_EOL, array_map(
    function($okres) {
        return "<option value =\"$okres->id\">" .
            htmlspecialchars($okres->nazev) .
            "</option>";
    }, $okresy));

echo <<<HTML
<html>
<head>
<title>Okresy</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Vyberte okres:
<form method="POST">
<select name="Kraj">
<br />$pocetOkresu
</select>
$optionOkresy
<input type="submit" value="potvrdit výběr" />
</form>
</body>
</html>
HTML;
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:8145:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Vašek
~ Anonymní uživatel
174 příspěvků
22. 7. 2015   #10
-
0
-

#9 Kit

Díky Kite, přiznám se, že se mi Tvé řešení líbí, ale to echo <<<HTML ukončené HTML; to je správně?ty tři < mi nic neříkaj, kde najdu nějaký info?

Nahlásit jako SPAM
IP: 31.30.89.–
Kit+15
Guru
22. 7. 2015   #11
-
0
-

#10 Vašek
Jmenuje se to Heredoc, najdeš to v dokumentaci PHP. Významnou výhodou je, že nemusíš escapovat uvozovky a že můžeš používat naplněné proměnné. Místo stringu "HTML" si můžeš dát třeba obvyklý "EOL", ale většinou si tam dávám nějaké označení typu výstupu - třeba "SQL". Jinak se to chová jako normální string.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:8145:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
23. 7. 2015   #12
-
0
-

Mi se treba nelibi. Ale to je vedlejsi :) Prerusovat program vypisem pres echo je nejvetsi zlo, skoro jako raketaci v pikacu.

Nove php umi krasne vypsat obsah promennych do html pres var_dump($promenna).

Pokud ladis html kod, je dobre si prohlizet html kod a ne vyslednou stranku. Webovy prohlizec ma funkci Zobrazit zdrojovy kod stranky. Kazdy bohuzel zasity jinde v menu. FF to ma ted pod Nastroje - Vyvoj webu - zobrazit zdrojovy kod stranky (CTRL+U).

<select> 123 </select> - ti samozrejme 123 neukaze nebo ukaze jinde, protoze tam 123 nepatri, patri tam option nebo optgroup

Kitovo
<select name="Kraj"> <br />$pocetOkresu </select> - br tam take nema, co delat
 

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:c49a:f3...–
Kit+15
Guru
23. 7. 2015   #13
-
0
-

#12 peter
To mi uteklo, když jsem válčil se zdejším formulářem. Chyb je tam víc - ten kousek má vypadat takto: 

<body>
Vyberte okres:
<br />$pocetOkresu
<form method="POST">
<select name="Kraj">
$optionOkresy
</select>
<input type="submit" value="potvrdit výběr" />
</form>
</body>

Osobně už HTML do PHP nedávám vůbec - také kvůli validitě, kterou PHP nekontroluje.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:8145:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Vašek
~ Anonymní uživatel
174 příspěvků
23. 7. 2015   #14
-
0
-

#13 Kit
Ještě jednou díky všem, už jsem ten Kitův kód rozchodil i když jsem s ním válčil, ale ještě jeden dotaz. Tam jak násobím číslo kraje a pak k němu přičítám 0 a 99 abych získal rozsah čísel pod kterými mám názvy okresů a následně ve stejným duchu i u obcí v okresech, bych chtěl spíš využít funkce Substr, protože číslo každého okresu se skládá z třímístnýho čísla kraje a dvojčíslí čísla okresu a číslo obce z předchozí konstrukce pětimístnýho čísla okresu, který je doplněn o číslo obce. Jenže si stím nevím rady .

$select = $db->prepare("SELECT * FROM Okresy WHERE SUBSTR(ID_okresu,0,3)=$cisloKraje"); 
$select->execute();

Takhle to ale nefunguje. naťukněte mi jak na to. Díky

Nahlásit jako SPAM
IP: 80.95.125.–
Kit+15
Guru
23. 7. 2015   #15
-
0
-

#14 Vašek
Problém je v tom, že ta databáze porušuje 1NF, tedy první normální formu. Je potřeba primární klíč rozdělit na 3 komponenty: Kraj, okres a obec. Pak bude ještě porušovat 2NF a to spravíme tak, že to rozbijeme na 3 tabulky: Kraj, okres, obec. Taková databáze pak vyhoví i 3NF:

  • kraj: id, nazev
  • okres: id, kraj_id, nazev
  • obec: id, okres_id, nazev

Primárním klíčem bude vždy id.

Záleží ovšem na potřebách aplikace, zda bude právě tato struktura vhodná.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Vašek
~ Anonymní uživatel
174 příspěvků
23. 7. 2015   #16
-
0
-

#15 Kit
To je právě to experimentování, v databázi mám pět tabulek kraje, okresy, obce a dvě okresy v krajích (obsahuje jen ID_kraje, ID_okresu) a obce v okresech (ID:okresu a ID obce),ale pohrával jsem si s myšlenkou, že by se jednalo o jednu tabulku, kde by byly obce a názvy krajů (protože okres je vždy zároveň jménem jedné obce v okrese) a z ní by se pak vše extrahovalo. Možná to jde proti zatížení databáze, nebo proti něčemu jinému, ale učím se jen ze zkušeností.

Nahlásit jako SPAM
IP: 80.95.125.–
Kit+15
Guru
23. 7. 2015   #17
-
+1
-
Zajímavé

#16 Vašek
Pokud chceš experimentovat, tak si nejprve přečti, co znamená 1NF, 2NF a 3NF. Je jich sice víc, ale ty další už nejsou tak významné, jako první tři. Jsou v tom návody, jak uspořádat data v databázi tak, aby se s nimi dobře pracovalo. Zvládnutí 1NF považuji za podmínku nezbytně nutnou, protože hledání v DB podle části klíče je jednou z nejdražších operací.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
edy680
Duch
23. 7. 2015   #18
-
0
-

OK, nechám si poradit. Díval jsem se na to tak, že buď budu mít tři tabulky v jedné 14 řádků, v druhé 77 a ve třetí 6261 plus dvě "spojovací" se vzájemnými násobky řádků, a nebo budu mít jednu tabulku, ve které bude 6275 řádků a z ID dostanu vše potřebné, pak mi vycházelo  elegantnější řešení to druhé. Navíc ty tabulky kraj, okresy a obce budu v databázi potřebovat jen jednou za rok.

Nahlásit jako SPAM
IP: 80.95.125.–
Kit+15
Guru
23. 7. 2015   #19
-
0
-

#18 edy68
Ty spojovací tabulky by byly zbytečné, protože každý okres patří jen do jednoho kraje a každá obec jen do jednoho okresu. Není to relace M:N, ale 1:N, která se řeší zavedením cizího klíče, viz v mém rozpisu kraj_id a okres_id.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
24. 7. 2015   #20
-
0
-

Co se ti nezda na kitove reseni?

kraj: id, nazev
okres: id, kraj_id, nazev
obec: id, okres_id, nazev

SELECT a.nazev, b.nazev, c.nazev
FROM obec a
  LEFT JOIN okres b ON b.id_okres=a.id_okres
  LEFT JOIN kraj c ON c.id_kraj=b.id_kraj

To mi prijde jako nejlepsi. Pak samozrejme muzes experimentovat s tim, ze das okresy a kraje do jedne tabulky a budes mezi nimi rozlisovat podle dalsiho sloupce typ. Nebo to das vsechno do jedne tabulky. Ale to je podle mne reseni na pikacu.
tbl: id_spol, typ, id_kraj, id_okres, nazev
typ = 0 kraj, =1 okres, =2 obec

SELECT a.nazev, b.nazev, c.nazev
FROM tbl a
  LEFT JOIN tbl b ON (b.id_okres=a.id_spol AND b.typ=1)
  LEFT JOIN tbl c ON (c.id_kraj=b.id_spol AND c.typ=0)
WHERE a.typ=2
Nahlásit jako SPAM
IP: 2001:718:2601:1f7:4453:4f...–
peter
~ Anonymní uživatel
4016 příspěvků
24. 7. 2015   #21
-
0
-

Ty zavorky bych mozna otocil, mohlo by to byt o nejakou setinu rychlejsi na vyhledani

(b.id_okres=a.id_spol AND b.typ=1)
(c.id_kraj=b.id_spol AND c.typ=0)

(b.typ=1 AND b.id_okres=a.id_spol)
(b.typ=0 AND c.id_kraj=b.id_spol)

Pripadne pouzil dvojklic pres oba sloupce.

INDEX kraj (typ,id_kraj),
INDEX okres (typ,id_okres)

 

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:4453:4f...–
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ů

 

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