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.

Tvůrce

Zobrazeno 34 zpráv z 34.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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>
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"
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.
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.
<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.
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..
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ý :/ ?
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?
A ano, ať v poslední podkategorii zvolím cokoliv, tak je do databáze uložená správná value.
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.
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?
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("name", "upresneni");.
A pokud se vykoná skrytí, tak setAttribute("name", "");.
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í.
Musíš to přiřadit logicky k tomu elementu, který právě odkrýváš jinak se to přiřadím ke všem.
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..
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..
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.
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 :/
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..
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..
A nebylo by jednodušší mít jen jeden select s name="upresneni" a ten plnit podle výběru kategorie?
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;
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..
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..
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..
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
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.
Ještě když se
řešilo že má XY položek se stejným "name"
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?
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?
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
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]
Zobrazeno 34 zpráv z 34.