Autor Zpráva
gumit
Profil
Dobrý den,

mám takový problém, mám stránku kde přidávám akce. Datum akcí zadávám pomocí Selectu. Ale prosím mi poraďte jak mám to datum zpátky načíst z DB do selectu pro případnou úpravu dané akce, na to nějak neumím přijít. =(

Datum je v tabulce datum je v DATE, a jeho hodnota v řádku třeba je 2011-08-02.

Děkuji za Vaše odpověďi.
Kry5
Profil
Když vypisuješ všechny věci v tom date tak pokaždý zkontroluj jestli se ty dvě data (to z db a to, které přidáváš do selectu) nerovnají a pokud ano, tak tomu selectu přidej:
selected="selected"


Takhle jsi to myslel?
gumit
Profil
Nemyslel ukládám datum pomocí <select> jestli se už chápem, jsem to špatně zapsal, jse omlouvám...
mám tři selecty:

<select>datum</select>mesic<select></select><select>rok</select>
Kry5
Profil
Zkus to takhle:
(v proměnné $date je uložen čas z databáze)
$edate = explode("-",$date);

a pak pokračuješ jak jsem psal výše a u roku použiješ
$edate[0]

atd.
ugo
Profil *
ja když sem línej něco procházet nebo nevim co nebo je toho prostě hodně, tak to udělám tak, že tam jeden option zduplikuju, neboli že jako první dám ten z databáze, jestli máš psaný selecty ručně, tak je to asi nejpřehlednější řešení, jinak ke každýmu musíš dávat podmínku, ideální řešení a postup již navrhl Kry5
gumit
Profil
	$precti = mysql_query("SELECT * FROM akce WHERE id='$id_edituj'"); 
   	if ($vypisdata = mysql_fetch_array($precti))
	  {
 $id = $vypisdata["id"];
 $nazev = $vypisdata["nazev"];
 $clanek = $vypisdata["text"];
 $date = $vypisdata["datum"];
 $edate = explode("-",$date);
  }


takže nějak takhle to mám chápat? A do daných selectu dám do value napiši echo $edate[0] $edate[1] $edate[2] nebo jak vůbec nevím jak to myslíš =(...

A selecty mam rešeny takhle ať máte přehled o čem je řeč =)

	<select name="mesic" size="1">
	<?php
	$mesice = Array(1=> "ledna", "února", "března", "dubna", "května", "června", "července", "srpna", "září", "října", "listopadu", "prosince");
	for($i=1;$i<=12;$i++) {
		echo '<option value="' . $i . '"';
		if($mesic==$i) echo " selected";
		echo ">" . $mesice[$i] . "</option>\n";
	}
	?>
	</select>
ugo
Profil *
tak by to mělo fungovat no, teda jestli tam máš někde definici co je měsíc, jestli ne tak si dopln -
$nazev = $vypisdata["nazev"];
$clanek = $vypisdata["text"];
$date = $vypisdata["datum"];
$edate = explode("-",$date);
$rok=(int)$edate[0];
$mesic=(int)$edate[1];
$den=(int)$edate[2];
Kry5
Profil
Tak u těch měsíců dej:
$month = ltrim($edate[1], '0');


a pak v tom cyklu při každém průběhu uděláš (místo tý podmínky co tam máš teď):
if($month == $i) {
echo 'selected="selected"';
}


Edit: U roků ltrim dávat nebudeš tam jenom:
$year = $edate[1];
ugo
Profil *
převod na int je rychlejší v tomhle případě .... téměř o celý 0.2ms na 1000 opakováních takže o 0.0002 ms :-D:-D (to jen tak OT že mě to zajímalo)
Kry5
Profil
A ještě k tomu o 2 znaky kratší :-)...to je ušetřenýho času a paměti!
ugo
Profil *
když sme u tý optimalizace, bylo by dobrý mysql_fetch_array vynechat a používat
$id=mysql_result($precti,'0',''id);

dál nevím zda je třeba vybírat všechna pole z tabulky, taky by to stálo za zváženou a proměnou edate přejmenovat na date aby nevznikala nová žvejkačka v paměti, případně jí po přiřazení smazat

unset($date);


dál je v definici pole zbytečně "1=>" moc místa v souboru kterej musí php server načíst ;)
názvy selectů by v tomhle případě mohly bejt kratší (r,m,d) to by ocenili uživatelé s pomalým připojením
kolikrát a kde s epoužívají proměnné jako $nazev, $clanek - nedal by se výpis udělat přímo bez nich jako meziproměných a ušetřit tak jádru přičítáni referencí do zvalu (v tomhle případě naštěstí nedochází ke kopii)

ještě bych na něco přišel, ale musím pádit na autobus :D optimalizace 4ever (samozřejmě u roku opravdu převod na int být nemusí, ale myslím že se stejně provede)
gumit
Profil
u těch roků? nemělo by to být takhle? :D
$year = $edate[0];


Takže rekapitulace :

$date = $vypisdata["datum"];
$edate = explode("-",$date);
$rok= $edate[0];
$mesic = ltrim($edate[1], '0');
$den = ltrim($edate[2], '0');


a u podmínek tohle:

if($den == $i) {
echo 'selected="selected"';}

if($mesic == $i) {
echo 'selected="selected"';}

if($rok == $i) {
echo 'selected="selected"';}


Myslím správně? Sem po té práci nějak málo chápavej... A jestli tím ušetřím téměř o celý 0.2ms na 1000 opakováních takže o 0.0002 ms tak sem teda nadšen =DD
Kry5
Profil
gumit:
Bláznů jako tady ugo si radši nevšímej :-). Teda pokud zrovna nevyvíjíš aplikaci, kde je předpokládaná návštěvnost asi 1 mil. lidé/den pak doporučuji uposlechnout všechny jeho rady.

názvy selectů by v tomhle případě mohly bejt kratší (r,m,d) to by ocenili uživatelé s pomalým připojením
:-D
Kry5
Profil
gumit:
Ty milisekundy bys ušetřil pokud by jsi použil řešení od
ugo
s tim (int).

Jinak by to mělo bejt správně.
gumit
Profil
Tak a mám další problém hoší milý =) Jak zjišťuji datum který je dnes.. Dělám to takhle:

// dnesni datum
$den = (int)Date("j");
$mesic = (int)Date("n");
$rok = (int)Date("Y");


asi se mi to hádá s tím že to chci editovat. Jak dám upravit načte se dané datum té akce.. Ale jestli mám zaple to co mi zjišťuje dnešní datum :-/ už to nejde... Nevíte jak to mám popřípadě upravit aby to šlo? Jinak Děkuji za předchozí radu funguje to =).. Ještě s tímhle a je to paráda =)
Kry5
Profil
gumit:
Moc ti nerozumim, ale nebude chyba v tom, že máš pokaždé stejné názvy proměnných? Tj. tím aktuálním datem přepíšeš to z databáze nebo opačně?
gumit
Profil
No jasně ale jak je přejmenuji ... Tak jak zobrazím v těch selectech i upravený a když neupravuji a jen přidavám dnešní datum? Sem si toho taky všiml že se mi schází stejný promněný ale teď nevím jak to ošetřit tak aby se to nehádalo.. Teda doufám myslím to co ty =)
Kry5
Profil
Přiznám se, že ti vůbec nerozumim, ale já bych to řešil tak že bych třeba ty proměnný u dnešního data přejmenoval XD
//a jako actual
$aden = (int)Date("j");
$amesic = (int)Date("n");
$arok = (int)Date("Y");


A pak samozřejmě to přepsat i tam kde s nima pracuješ (pozor ne tam kde pracuješ s těma s datama z databáze) :-)
gumit
Profil
No ztratili jsme se oba =) asi jak vidím =)

Zkusím znova vysvětlit =)

Teď jsme vyřešili problém z načítání z DB do selectu, tím že sme po upravili daný kód nám vznikl další problém a ten o zjištování aktualního datumu. Jestli je pojmenuji jak si to napsal ty, tak bych musel upravit tuhle podmínku
if($den == $i) echo 'selected="selected"';
která dělala to že vybrala podle aktualního datumu a ještě pak po naší úpravě dávala datum z DB, data v selectu... Ale otázka je jak je spojit aby jeli obě současně? =)
Kry5
Profil
gumit:
Co má mít tedy atribut "selected: "selected""? Položky, které odpovídají aktuálnímu datumu nebo tomu načtenému z db?
gumit
Profil
měly by mít aktuální datum, jestli teda uvažuji správně… Ale po kliknutí na EDIT aby se změnilo na datum z té dané akce, kterou edituji. Nevím, jestli nechci od toho moc :-( ...
Kry5
Profil
Ne, jen se musíme pochopit :-).

Moc nechápu k čemu ti to bude mít v jednom souboru. Nechtěls to náhodou tak, že pokud přidáváš novou akci tak tam bude aktuální datum, ale pokud edituješ nějakou existující tak se tam dá datum, které bylo zadáno předtim?

Potom by to asi bylo v dvou souborech. Jinak v jednom souboru by se to řešilo tak, že bys mu dával GET v adrese a podle toho se rozhodl (podmínkou) jestli tam má být aktuální datum nebo to načtené z db.
gumit
Profil
No myšleno tak, že když tvoříš novou akci... Máš v nabídce aktuální datum. Vytvoříš akci na dané datum, buď aktuální nebo jiné, ale po čase zjistíš že se datum přesouvá tak ho potřebuješ změnit i napsat o změně. Proto to potřebuji, teď plánuji jestli to udělám s aktuálním datumem, nebo tam necham základní datum a bude si vybírat daná osoba jaké ona chce.. Tou tvou podmínkou asi vím přibližně co myslíš. ;-)
Kry5
Profil
Počkej ale tak v čem je problém? Pokud vytváříš novou akci (formulář na stránce A) tak tam jako výchozí hodíš aktuální datum. Pokud ho upravuješ (formulář na stránce B) tak tam hodíš výchozí to z db, ale jsou to dva různé formuláře -> dva různé skripty.

Pokud potřebuješ mít v jednom souboru vypsaný jak datum z db tak datum aktuální tak si to akorát uložíš do různých proměnných (např. $aktualnidatum a $datumzdb) a ty pak vypíšeš

Jestli chceš mít jeden soubor s jednim formulářem a v něm jako výchozí mít datum z db nebo aktuální datum podle parametru v url adrese (kterej udáš při odkazování na stránku) tak třeba takto:
if($_GET["selected"] == "actual") {
$den = (int)Date("j");
$mesic = (int)Date("n");
$rok = (int)Date("Y");
}
elseif($_GET["selected"] == "db") {
$date = $vypisdata["datum"];
$edate = explode("-",$date);
$rok= $edate[0];
$mesic = ltrim($edate[1], '0');
$den = ltrim($edate[2], '0');
}

Ale nechápu k čemu by ti tohle bylo, protože to jsou 2 odlišný stránky a to bych dal radši do dvou souborů už jenom kvůli přehlednosti.
gumit
Profil
Asi máš pravdu =) Budu to tak muset udělat ;-) Díky moc za všechny rady. =) A moc si mi pomohl ;-) Zase někdy =)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0