Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

Zdravím!
Mám na stránce formulář, jehož struktura je následovná:

<select class="kategorie" name="kategorie">
            <option>1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            .
            .
        </select><br>
        <select class="2 box" name="upresneni">
        <option value="a">a</option>
        <option value="b">b</option>
        <option value="c">c</option>
        .
        .
       </select>
      <select class="3 box" name="upresneni">
        <option value="d">d</option>
        <option value="e">e</option>
        <option value="f">f</option>
        .
        .
    </select>

přičemž se na začátku objeví pouze první select a po zvolení dané kategorie se zobrazí seznam podkategorií - to vše řeší JS a tím se zabývat nechci.

Nahoře kódu mám PHP, které má řešit odesílání do databáze a ukládání do kolonek předem vytvořených.
Skript vypadá následovně:

if ($_POST){
            Db::query('
           INSERT INTO inzeraty (datum_vlozeni, titulek, text, kategorie, upresneni, mesto)
           VALUES (CURRENT_TIMESTAMP(),?, ?, ?, ?, ?)
             ', $_POST['titulek'], $_POST['text'], $_POST['kategorie'], $_POST['upresneni'], $_POST['mesto'] );

             $_POST['autor'] = $_SESSION['jmeno'];
                        header('Location: podat_inzerat.php');
                        exit();


}

Jenže, při uložení podkategorie vyskočí pokaždé stejný nápis => Kategorie kterou vyberu se uloží správně, ovšem podkategorie se vždy uloží "a".

Mám v těchto kódech nějakou chybu nebo ji mám hledat uplně jinde?

 
Odpovědět 18.1.2015 19:19
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):

Protože máš dva selecty se stejným name a vybere se ten první, ve kterým je hned první hodnota "a".

Nejsem si tím jistý, ale zkus tomu druhýmu selectu dát jiný name.

 
Nahoru Odpovědět 18.1.2015 19:28
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Michal Kuba
Michal Kuba:

Ještě pro upřesnění, co jsem zjistil:

Do databáze do "upresneni" se uloží hodnota vždy z posledního selectu v pořadí v kódu. Jednoduše řečeno, ten select který je na poslední, tak z něj se vezme první hodnota value.

Ve výše zmíněném případě by to bylo

<option value="d">d</option>
 
Nahoru Odpovědět 18.1.2015 19:29
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:

Ono to ale vybírá paradoxně ten poslední. Ale jde o to, že já je potřebuju mít pojmenovaný stejně, aby PHP vědělo, z čeho ten název brát.. I kdybych měl těch podkategorií s name "upresneni" sto, tak to vezme první hodnotu z toho stého "upresneni"

 
Nahoru Odpovědět 18.1.2015 19:30
Avatar
Odpovídá na Michal Kuba
Michal Štěpánek:

Nemůžeš po programu chtít, aby za tebe přemejšlel. Nelze mít na stránce dva selecty se stejným názvem a chtít po programu, aby si "nějak vybral"... Program si vybere ten poslední, protože "čte" shora dolů a tím posledním selectem (se stejným názvem) v podstatě "přemaže" ty předchozí. Musíš si je pojmenovat různě.
Když budeš mít v programu:

a = 3
a = 5
a = 20

tak hodnota a bude nakonec samozřejmě 20.

Nahoru Odpovědět  +1 18.1.2015 19:38
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Michal Kuba:

No jo, tak já za to klidně přidám čísla, ale jak mám to dát vědět PHP, kterej z těch názvů tam má vložit?

Jinak jsem už samozřejmě pochopil svoji chybu a po této zkušenosti ji již nezopakuji.

 
Nahoru Odpovědět 18.1.2015 19:43
Avatar
BlugW
Redaktor
Avatar
Odpovídá na Michal Kuba
BlugW:
<select name="auta">
...
</select>
<select name="motorky">
...
</select>

DB::query('INSERT INTO tabulka(auto, motorka) VALUES(?,?), $_POST['auta'], $_POST['motorky']');

Hodnota v POSTu je "name" takže nemůže být stejná u 2 a více položek.

Editováno 18.1.2015 19:50
Nahoru Odpovědět 18.1.2015 19:47
Pořiď si mac na www.appletrh.cz. Novinky a zajímavosti ze světa Apple na https://www.applemagazin.eu
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Michal Kuba
Marek Z.:

Beru to tak správně když si myslím, že selecty s podkategoriemi máš ukryté tím způsobem, že jim dáš atribut hidden či je schováš nějakou třídou v css. Poté po zvolení příslušné kategorie se zobrazí daná podkategorie tím, že jí dáš jinou třídu či atribut hidden odstraníš.

To znamená, že ty selecty tam stále skryté jsou a jak psal Michal Štěpánek, automaticky se vybere ten poslední když má stejný name, nehledě na to, který option si kde zvolil..

Závěr: Musíš změnit name u selectů podkategorií.

Edit: Pokud zvolíš option v poslední podkategorii, bude vybrán logicky on.. :)

Editováno 18.1.2015 19:56
Nahoru Odpovědět 18.1.2015 19:55
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na BlugW
Michal Kuba:

Ale já tam nechci uložit obě dvě hodnoty. Jde o to, že mám podkategorií (selectů) asi 8 a v každém z nich třeba pět položek. A ty podkategorie (selecty) se nezobrazí, pokud jeden z nich nezvolím v selectu kategorie. Je to pochopitelný :/ ?

 
Nahoru Odpovědět 18.1.2015 19:57
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:

Ano, všechny podkategorie jsou skryté a podle toho, co vyberu v hlavních kategoriích, tak to se objeví (řešeno přes JS).
Jak mám ale ošetřit spíše tu PHP část, aby věděla, co má právě vzít? Musím ručně vypisovat všech osm podkategorií? to snad ne, ne?

 
Nahoru Odpovědět 18.1.2015 19:58
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:

A ano, ať v poslední podkategorii zvolím cokoliv, tak je do databáze uložená správná value.

 
Nahoru Odpovědět 18.1.2015 20:00
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Michal Kuba
Marek Z.:

Tak to vyřeš třeba tím, že skryté selecty nebudou mít vyplněné name a pokud se zobrazí tak jim JS vyplníš hodnotu pro atribut name, třeba..

Nebo je prostě možnost, že dáš každé kategorii jiný name.

Editováno 18.1.2015 20:05
Nahoru Odpovědět 18.1.2015 20:04
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:

Já popravdě nejsem v JS tak zkušený, to co mi obstarává na stránce JS jsem s pomocí zdejší komunity vyřešil ve vláknu v kategorii tuším že HTML. Pokud dám každé podkategorii jiný name, jak ale ošetřím to PHP? Asi je blbost zadání jednotlivé podkategorie řešit nějakou podmínkou, že?

 
Nahoru Odpovědět 18.1.2015 20:11
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Michal Kuba
Marek Z.:

Stačí hledat a učit se novým věcem hlavně.

Nevěnuji se JS, ale tuším že stačí použít do tvého kódu setAttribute("na­me", "upresneni");.

A pokud se vykoná skrytí, tak setAttribute("na­me", "");.

Editováno 18.1.2015 20:20
Nahoru Odpovědět 18.1.2015 20:19
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:
var test = function () {
       $(".kategorie").change(function(){
        var value = $(".kategorie option:selected").attr("value");
        $(".box").hide();
       $(".box." + value).show();
        });
};
setAttribute("name", "upresneni");

Zapracovávám to do JS dobře? Opravdu tohle není moje silná stránka :/

EDIT:Všechno co je nad setAttribute zajišťuje to skrývání podkategorií.

Editováno 18.1.2015 20:36
 
Nahoru Odpovědět 18.1.2015 20:35
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Michal Kuba
Marek Z.:

Musíš to přiřadit logicky k tomu elementu, který právě odkrýváš jinak se to přiřadím ke všem.

http://www.w3schools.com/…ttribute.asp

Nahoru Odpovědět 18.1.2015 20:40
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:

Přesně vím, jak to myslíš a jsem rád za tohle navedení. Nevím jestli to je tím, že už je večer, ale opravdu nevím, jak to zakomponovat do skriptu, přitom mi přijde, že to mám na jazyku..

 
Nahoru Odpovědět 18.1.2015 20:49
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:

Zkusím to někam nacpat, ale vidím to bledě..

 
Nahoru Odpovědět 18.1.2015 21:33
Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

Zadám-li na konec scriptu toto:

function myFunction() {
    document.getElementsByTagName(".box")[1].setAttribute("name", "upresneni");
}

tak to nečekaně nefunguje.. je mi to blbý chtít řešení, ale obávám se, že bez delšího studia JS (a ten čas na to nemám) to nezvládnu..

 
Nahoru Odpovědět 18.1.2015 21:44
Avatar
BlugW
Redaktor
Avatar
Odpovídá na Michal Kuba
BlugW:

V JS se moc nevyznám, ale nebere náhodou getElementByTagName jméno tagu?
což je např. input, button, a, p, atd..

.box je classa.

Editováno 18.1.2015 21:54
Nahoru Odpovědět 18.1.2015 21:53
Pořiď si mac na www.appletrh.cz. Novinky a zajímavosti ze světa Apple na https://www.applemagazin.eu
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na BlugW
Michal Kuba:
var test = function () {
       $(".kategorie").change(function(){
        var value = $(".kategorie option:selected").attr("value");
        $(".box").hide();
       $(".box." + value).show();
        });
};
$(document).ready(test);
function myFunction() {
    document.getElementsByClassName(".box")[1].setAttribute("name", "upresneni");
}

Tak teď mi do databáze nepřijde vůbec nic. Podle mě se právě PHP sekne na tom, že hledá to upresneni a nemůže ho najít :/

 
Nahoru Odpovědět 18.1.2015 22:00
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:

Tomu příkladu na w3 docela i rozumím, prostě při kliknutí se zavolá funkce, která změní class, ale nedokážu to už transformovat do mýho příkladu.. :(

 
Nahoru Odpovědět 18.1.2015 22:10
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Michal Kuba
Marek Z.:

Já bohužel také, prostě hledat či čekat až se někdo ukáže kdo bude vědět. Tuším, že Michal Žůrek (misaz) by o tom něco mohl vědět.. ;)

Nahoru Odpovědět 18.1.2015 22:57
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Michal Kuba
Michal Štěpánek:

A nebylo by jednodušší mít jen jeden select s name="upresneni" a ten plnit podle výběru kategorie?

Nahoru Odpovědět  +1 19.1.2015 7:37
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Fredep
Redaktor
Avatar
Odpovídá na Michal Kuba
Fredep:

A co, kdyby měl každý ten select jiný name, například upresneni2 a upresneni3 (edit: s podtržítky). Poté bys mohl v PHP udělat něco takového...

<?php
if ( isset($_POST["kategorie"]) AND isset($_POST["upresneni_" . $_POST["kategorie"]]) )
    $upresneni = $_POST["upresneni_" . $_POST["kategorie"]];
else
    $upresneni = null;
Editováno 19.1.2015 15:04
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 19.1.2015 15:03
Týmová práce je důležitá proto, aby bylo možno obvinit z neúspěchu někoho jiného.
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Michal Kuba:

No jo, jenže když to mám všechno v jednom a každou tu položku mám oclassovanou podle původního selectu, tak mi ta nabídka nejde rozevřít.. Zkusím si pohrát asi s JS a možná i něčím přímo v tom selectu..

 
Nahoru Odpovědět 19.1.2015 19:43
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Michal Kuba:

Takhle to zhruba vypadá teď:

<select name="upresneni">
        <option class="1 box" value="1">1</option>
        <option class="2 box" value="2">2</option>
        <option class="3 box"value="3">3</option>
        <option class="4 box" value="4">4</option>
        <option class="5 box" value="5">5</option>

nad tím je JS:

var test = function () {
       $(".kategorie").change(function(){
        var value = $(".kategorie option:selected").attr("value");
        $(".box").hide();
       $(".box." + value).show();
        });
};

a dělá to právě to, že pod selectem kategorie se zobrazí druhý select s podkategorií (to by mi tak nevadilo), jenže select upresneni nijak nejde otevřít a zobrazuje se pouze první hodnota..

 
Nahoru Odpovědět 19.1.2015 19:46
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Fredep
Michal Kuba:

Tohle řešení taky nemusí být špatné, ale trochu jsem se do toho zamotal při přepisování a myslím, že by mi to nefungovalo..

 
Nahoru Odpovědět  -1 19.1.2015 19:47
Avatar
Fredep
Redaktor
Avatar
Odpovídá na Michal Kuba
Fredep:

To mé řešení bylo k tvému prvnímu příspěvku úplně nahoře, kde jsi psal, že to řeší JS. Prakticky PHP vybere, ze kterého selectu má data čerpat. Kód jsem ale nezkoušel, fungovat by mohl ;)

Nahoru Odpovědět 19.1.2015 20:17
Týmová práce je důležitá proto, aby bylo možno obvinit z neúspěchu někoho jiného.
Avatar
BlugW
Redaktor
Avatar
Odpovídá na Fredep
BlugW:

Tohle jsem mu radil viz:

<select name="auta">
...
</select>
<select name="motorky">
...
</select>

DB::query('INSERT INTO tabulka(auto, motorka) VALUES(?,?), $_POST['auta'], $_POST['motorky']');

Hodnota v POSTu je "name" takže nemůže být stejná u 2 a více položek.

:D Ještě když se řešilo že má XY položek se stejným "name"

Editováno 19.1.2015 21:25
Nahoru Odpovědět 19.1.2015 21:24
Pořiď si mac na www.appletrh.cz. Novinky a zajímavosti ze světa Apple na https://www.applemagazin.eu
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Fredep
Michal Kuba:

Chápu to dobře, že si tam zavedu tu proměnnou $upresneni a tu tam vložím místo $_POST('upresneni') ? Teď mi to nejde ukládat do databáze, ale snad se to pohne z místa..

Ten tvůj blok kódu isset dám uplně na začátek celýho if($_POST)**{­...}**** , že ano? a potom podle té deklarované proměnné to vložím do databáze?

 
Nahoru Odpovědět 19.1.2015 21:56
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Fredep
Michal Kuba:

Mám mít pojmenované všechny podkategorie upresneni_ ? Nebo za každý podtržítko doplnit ještě něco, čím to odliším? potom ale v tom PHP bloku to bude hledat name pouze upresneni_ a ten to nenajde, protože já budu mít uprsneni1 , uprsneni2 atd... , ne?

 
Nahoru Odpovědět 19.1.2015 22:01
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Fredep
Michal Kuba:

Teď nevím jak se mi to povedlo, ale už mi to funguje :) Každou tu podkategorii jsem pojmenoval upresneni_(a příslušnou podkategorii) a použil uvedený PHP blok a již to do DB zapisuje, jak má :) Děkuji

 
Nahoru Odpovědět  +1 19.1.2015 22:05
Avatar
solta
Člen
Avatar
solta:

Uf docela dlouhé vlákno přidám ještě svou trošku do mlýna jen pro úplnost
Je možné mít stejně pojmenované elementy formuláře ale musí to byt pole a nad na zacatek prazdnou hodnotu aby se to lépe řešilo na straně php

<form method="post">
    <select name="upresneni[]">
        <option value="">Vyber</option>
        <option value="a">a</option>
        <option value="b">b</option>
        <option value="c">c</option>
    </select>
    <select name="upresneni[]">
        <option value="">Vyber</option>
        <option value="d">d</option>
        <option value="e">e</option>
        <option value="f">f</option>
    </select>
//php
    foreach ($_POST['upresneni'] as $val ){
        if($val)
            $upresneni = $val;
    }
</form>

nebo pokus si ty selecty správně poskládáš na stránce může php vypadat takto:

$_POST['upresneni'][$_POST['kategorie']-1]
 
Nahoru Odpovědět 20.1.2015 13:51
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 34 zpráv z 34.