Autor Zpráva
Kryšpín
Profil *
Zdravím

mám následující problém: potřebuju vytvořit takový obrázek, ukazující graficky rozložení určitých časových úseků. Obrázek vytvořit dovedu ale nedaří se mi spočítat ty časové úseky. respektive ono to funguje, ale spočte se to správně až napodruhé. Bude to pravděpodobně nějaký problém mezi klávesnicí a židlí ale nějak nemůžu přijít na to jaký už třetí den.

jedna funkce mi rozseká string, kde jsou tři informace datum začátku, datum konce a ještě jedna o kterou tu nejde. funguje OK. druhá funkce mi zjistí počet dní mezi dvěmi daty. funguje také OK.

V té třetí části potřebuju spočítat souřadnice určitých grafických hodnot z výše uvedených údajů. Funkce ale nedovede příslušné hodnoty spočítat. Tedy, nedovede je spočítat napoprvé. Tentýž výraz na druhém a dalším řádku atd. už dá očekávaný výsledek. Zatím jsem nedokázal přijít na to proč...

Zkoušel jsem ty hodnoty přetypovat, jeslti není problém tam, (výsledek žádný) pak jsem zaměnil číslo s desetinnými hodnotami za celé číslo, ale rovněž to nemá žádný vliv. Kod je dále, zkuste si ho provést. Jde mi o to, proč první výsledek je "vysledek 1: NAN" a ty další už správné.

(v kodu nehledejte smysl, osekal jsem všechno, do není k tomuhle potřeba a nechal tam jen tu chybu, aby to bylo přehledné)

Děkuji za případné typy.

Díky Kryšpín

function generaceobrazku()  // v téhle se zobrazí chyba
{
// testovací hodnoty
$vstup= "2010-07-16*2010-07-17*1";    //datum_od*datum_do*procenta
$rozmezi = '2010-07-10*2010-07-25*1'; //datum_od*datum_do*procenta

  $datadat = hodnoty($vstup);

    echo 'zacatek: '. $zacatekvednech = trvani ($datadat[0].'*'.$konec.'*0');echo '<br>';
    echo 'konec: '. $konecvednech = trvani ($zacatek.'*'.$datadat[1].'*0');echo '<br>';
    settype($zacatekvednech, 'integer');
    settype($konecvednech, 'integer');
    $jedenden = 30; //$jedenden = 29.33333;
    echo 'vysledek 1: '. $vysledek=(470 - round($jedenden*$zacatekvednech));echo '<br>';
    echo 'vysledek 2: '. $vysledek=(470 - round($jedenden*$zacatekvednech));echo '<br>';
    echo 'vysledek 3: '. $vysledek=(470 - round($jedenden*$zacatekvednech));echo '<br>';                 
}


function hodnoty($retezec='')
{
  if ($retezec != '') { 
    $hodnoty = explode('*',$retezec);
    return $hodnoty;
  }
  else { 
    return false;
  }
}

function trvani ($retezec='')
{
  if ($retezec != '') { 
    $data = hodnoty($retezec);
    $interval = date_diff(date_create($data[0]) , date_create($data[1]));
    $trvani=$interval->format('%d'); 
    settype($trvani, "integer");
    return $trvani; 
  }
  else { 
    return false;
  } 
}

Moderátor Majkl578: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
xmark
Profil
Co si slibuješ od tohoto?

 echo 'zacatek: '. $zacatekvednech = trvani ($datadat[0].'*'.$konec.'*0');echo '<br>';


Myslím tím echo a zároveň přiřazení něčeho do proměnné.
xmark
Profil
No a teď se dívám, že totéž máš na tom řádku, o který ti jde. Takže problém je vyřešen plus detekován jinde. Při prvním průchodu se ti $vysledek spočítá, při druhém (nevím proč, ale to není podstatné) vypíše.

Můžeš použít
echo "text".$promenna;

nebo
echo "text".$promenna.funkce($parametr);

nebo
$promenna=14;


Ale míchat přiřazení a výpis je nesmysl.
Kryšpín
Profil *
Ve skutečném kodu tam to echo pochopitelně není. To je tam jen proto aby se v tomto příkladu zobrazil výsledek na obrazovce. Jinak to takto dělat lze, funguje mi to ve spoustě jiných případů a používám to vcelku běžně při ladění, ale to zde není podstatné.

ve skutečném kodu je něco jako

$vysledek=(470 - round($jedenden*$zacatekvednech));


a s tou proměnnou (ten výraz vpravo od rovnítka je ve skutečnosti složitější) se pracuje dále. Problém je, že ačkoliv by to takto mělo na první pohled fungovat, tak to nefunguje a nemůžu přijít na to proč. Do proměnné $vysledek se uloží ta chyba a následně skript neudělá co má.

Zatím to mám provizorně ošetřeno kontrukcí viz níže a to funguje.

$vysledek_na_prd=(470 - round($jedenden*$zacatekvednech));
$vysledek=(470 - round($jedenden*$zacatekvednech));  // s touhle proměnou se dále pracuje


Ale určitě uznáš, že to asi není nejsprávnější postup, navíc nevím jeslti to takto je OK a jestli to bude fungovat i někde jinde nežli na lokále.... Proč se to doprčic spočítá až na podruhé? Tam musí být někde nějaká chyba...


Moderátor nightfish: Doplněny [pre] a [/pre].
Kryšpín
Profil *
To Moderátor Majkl578: tu poznámku jsem si všiml až teď, když už jsem to odeslal. Omlouvám se, příště to tak udělám.
nightfish
Profil
Kryšpín:
Zkusil jsem spustit kód z [#1], a hlásí neexistující proměnné $zacatek a $konec.
Výstup je:
zacatek: 6
konec: 7
vysledek 1: 290
vysledek 2: 290
vysledek 3: 290


Je tento výstup správný?
Kryšpín
Profil *
Jejda, asi jsem smazal v tom příkladu moc řádků. V původním kodu bylo ještě asi tohle:

 $rozmezidat = hodnoty($rozmezi);
 
 $zacatek = $rozmezidat[0];
 $konec  = $rozmezidat[1];


vložil bych to na řádek 6, po těch dvou testovacích hodntách na začátku. Jinak výstup, který by dal tři stejné výsledky (čísla - integer) by byl správný.
Kryšpín
Profil *
Na ostrém serveru, ke kterému mám přístup právě teď mi tohle nefunguje vůbec (funkce date_diff() ale funguje až v poměrně posledních verzích PHP tak to možná bude tím) a jelikož je tam bloklá funkce phpinfo() tak si teď hned nezobrazím, co je tam za verzi. Na localhostu, kde mám verzi 5.3.1. která tuhle funkci už obsahuje mi to v zásadě běží.

ale zobrazí se tohle:

zacatek: 9
konec: 7
vysledek 1: NAN
vysledek 2: 200
vysledek 3: 200


Jak se podařilo Vám, že to funguje správně?
nightfish
Profil
Kryšpín:
Jak se podařilo Vám, že to funguje správně?
Vzal jsem kód z [#1], přidal doplnění z [#7] a ještě přidal volání funkce generaceobrazku().
PHP verze 5.3.2.
Pokud bychom vyloučili, že se jedná o rozdíl mezi 5.3.1 a 5.3.2, zbyde nám pouze možnost, že tvůj kód je ve skutečnosti odlišný/složitější a v té odlišné/složitější části je chyba.
Kryšpín
Profil *
Kod je určitě stejný, dokonce jsem po té, co jsem tu našel tu chybu [#7] postupoval tak, že jsem ho pro jistotu vložil do nového souboru a kod do něj zkopíroval z téhle stránky, abych to měl s jistotou identické s tím co tu prezentuju. Takže mě čeká zkusit přeinstalovat verzi PHP, to mám radost... dám pak vědět jak to dopadlo.
Kryšpín
Profil *
Neuvěřitelné. Zřejmě se jednalo o bug v PHP. Nainstaloval jsem si novou verzi Uniform Serveru a:--> V poslední verzi to funguje OK. Nevěřil jsem že by to mohla být tahle možnost. Doposud všechny moje chyby byly mezi klávesnicí a židlí... Díky za Váš čas.

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: