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í.

Diskuze: Špatný zápis do databáze

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:18.1.2015 19:19

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):18.1.2015 19:28

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Michal Kuba
Michal Kuba:18.1.2015 19:29

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
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:18.1.2015 19:30

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:18.1.2015 19:38

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
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
Tvůrce
Avatar
Odpovídá na Michal Štěpánek
Michal Kuba:18.1.2015 19:43

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
Odpovídá na Michal Kuba
Neaktivní uživatel:18.1.2015 19:47
<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
Neaktivní uživatelský účet
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :18.1.2015 19:55

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
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:18.1.2015 19:57

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
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:18.1.2015 19:58

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
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:18.1.2015 20:00

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
Odpovídá na Michal Kuba
Uživatel sítě :18.1.2015 20:04

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
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:18.1.2015 20:11

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
Odpovídá na Michal Kuba
Uživatel sítě :18.1.2015 20:19

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
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:18.1.2015 20:35
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
Odpovídá na Michal Kuba
Uživatel sítě :18.1.2015 20:40

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
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:18.1.2015 20:49

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
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:18.1.2015 21:33

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

 
Nahoru Odpovědět
18.1.2015 21:33
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:18.1.2015 21:44

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
Odpovídá na Michal Kuba
Neaktivní uživatel:18.1.2015 21:53

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
Neaktivní uživatelský účet
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:18.1.2015 22:00
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
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:18.1.2015 22:10

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
Odpovídá na Michal Kuba
Uživatel sítě :18.1.2015 22:57

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:19.1.2015 7:37

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

Nahoru Odpovědět
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
Odpovídá na Michal Kuba
Neaktivní uživatel:19.1.2015 15:03

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
19.1.2015 15:03
Neaktivní uživatelský účet
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Michal Štěpánek
Michal Kuba:19.1.2015 19:43

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
Tvůrce
Avatar
Odpovídá na Michal Štěpánek
Michal Kuba:19.1.2015 19:46

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
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:19.1.2015 19:47

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
19.1.2015 19:47
Avatar
Odpovídá na Michal Kuba
Neaktivní uživatel:19.1.2015 20:17

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
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:19.1.2015 21:24

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
Neaktivní uživatelský účet
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:19.1.2015 21:56

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
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:19.1.2015 22:01

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
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:19.1.2015 22:05

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
19.1.2015 22:05
Avatar
solta
Člen
Avatar
solta:20.1.2015 13:51

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.