Autor Zpráva
jtfcobra
Profil
Přepočet měsíc chyba ve čtení dat máte někdo radu optimalizaci?

Chyba:
Poslední den v měsící např:

zacatek 30.1.2020 1000 Kw konec mesice 30.2.2020 spotreba 1020
dalsi mesic
zacatek 30.2.2020 1030 Kw konec mesice 30.3.2020 spotreba 1040

Chyba je vzdy prelom mesíce

Jinak jedu na PHP5



function prepocetmesic($merak,$mesic,$predchozimesic,$rok,$rokpredchozi)
{
    global $db,$hostname_test,$username_test,$password_test;
    // Zacatek
    echo '---------------------------------------<br>';
    echo 'Vypocet spotreby pro mesic: ' .$mesic . ' a rok: ' .$rok . ' <br>';
    $data111=mysql_query("SELECT hodiny,datum FROM cem1melnik.spotreba where idmeraku = '$merak' and Year(datum) = '$rokpredchozi' and Month(datum) = '$predchozimesic' order by id DESC LIMIT 1",$db);
    while ($zaznam = mysql_fetch_array($data111))
    {
        $zacatek=$zaznam["hodiny"];
//        $zacatek=round($zaznam["hodiny"],2);
        $zacatekdatum=$zaznam["datum"];
    };
    echo 'Zacatek spotreby [h]:' .$zacatek . '<br>';
    // Konec 
    $data222=mysql_query("SELECT hodiny,datum,seriovecislo,byt FROM cem1melnik.spotreba where idmeraku = '$merak' and Year(datum) = '$rok' and Month(datum) = '$mesic' order by id DESC LIMIT 1",$db);
    while ($zaznam2 = mysql_fetch_array($data222))
    {
        $konec=$zaznam2["hodiny"];
    //    $konec=round($zaznam2["hodiny"],2);
        $konecdatum=$zaznam2["datum"];
        $seriovecislo=$zaznam2["seriovecislo"];
        $byt=$zaznam2["byt"];
    };
    echo 'Konec spotreby [h]:' .$konec . '<br>';
    // Vypocet celkove spotreby za mesic
    $spotreba=$konec-$zacatek;
    $spotreba=$spotreba;
    //$spotreba=round($spotreba,2);
    echo 'Celkova spotreba [h]:' .$spotreba . '<br>';
    
    $data444=mysql_query("SELECT idmeraku FROM cem1melnik.spotreba_mesicni where Year(datum) = '$rok' and Month(datum) = '$mesic' and idmeraku = '$merak'",$db);
    $num_rows = mysql_num_rows($data444);
    $zaznamNalezen = false;
    while ($zaznam3 = mysql_fetch_array($data444))
    {  
        if ($zaznam3["idmeraku"]==$merak) 
        { 
            $data888=mysql_query("UPDATE cem1melnik.spotreba_mesicni SET byt ='$byt' , zacatek ='$zacatek', zacatekdatum = '$zacatekdatum' , konec ='$konec', konecdatum = '$konecdatum' , spotreba = '$spotreba' , datum = '$konecdatum' WHERE Year(datum) = '$rok' and Month(datum) = '$mesic' and idmeraku = '$merak' ",$db); 
            echo '(O) Aktualizovan mesic: '.$mesic.'  rok: '.$rok.' merak: '.$merak.'</br>';
            $zaznamNalezen = true;
        } 
        echo ' Pocet aktualizovanych zaznamu: ' . $num_rows . '</br>';
    }
    
    if ($zaznamNalezen == false)
    {
        $data999=mysql_query("INSERT INTO cem1melnik.spotreba_mesicni ( byt , idmeraku , seriovecislo , zacatek , zacatekdatum , konec , konecdatum , spotreba , datum ) VALUES ( '$byt' , '$merak' , '$seriovecislo', '$zacatek', '$zacatekdatum', '$konec' , '$konecdatum' , '$spotreba' , '$konecdatum' ) ",$db); 
        echo '+ Pridan mesic: '.$mesic.'  rok: '.$rok.' merak: '.$merak.'</br>';
    
        if ($data999)
        {
          echo 'Vlozeno do DB<br>';
        }
        else
        {
          echo 'Chyba ulozeni do DB<br>';
        }
    }
    
}



Tabulka:
DROP TABLE IF EXISTS `cem1melnik`.`spotreba`;
CREATE TABLE  `cem1melnik`.`spotreba` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `seriovecislo` text,
  `datum` datetime DEFAULT NULL,
  `hodiny` float(20,3) DEFAULT NULL,
  `idmeraku` text,
  `merak` text,
  `byt` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8132480 DEFAULT CHARSET=utf8;





Tabulka 2:
DROP TABLE IF EXISTS `cem1melnik`.`spotreba_mesicni`;
CREATE TABLE  `cem1melnik`.`spotreba_mesicni` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `idmeraku` text NOT NULL,
  `seriovecislo` text NOT NULL,
  `zacatek` float(20,3) DEFAULT NULL,
  `zacatekdatum` date DEFAULT NULL,
  `konec` float(20,3) DEFAULT NULL,
  `konecdatum` date DEFAULT NULL,
  `spotreba` float(20,3) DEFAULT NULL,
  `datum` date NOT NULL,
  `byt` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1014 DEFAULT CHARSET=utf8;
Kcko
Profil
jtfcobra:
Smazat a nechat to napsat někým kdo ví co má dělat.
lionel messi
Profil
jtfcobra:

Nápadov by bolo... Asi by som sa vyhol globálnym premenným, určite by som správne escapoval a nevyužíval funkcie mysql_*, ale mysqli_*, lebo inak by som zostal zakonzervovaný v dobe PHP 5 (v PHP 7 boli tieto funkcie odstránené). A rozhodne by som to rozdelil do viacerých funkcií.

Možno ti Kckov príspevok príde až príliš krutý, v zásade má však pravdu. Zle sa v tom orientuje (zásadne nepíšem cudziemu programátorovi, pretože v tomto sa musí zle orientovať aj autor) a chýb, prípadne „nášľapných mín“ je tam dosť.

Čo si mám predstaviť pod pojmom „chyba ve čtení dat“? S takouto chybovou hláškou nikde vo funkcii nepracuješ, do db posielaš 5 dotazov... Toto je popis problému viac-menej na úrovni „máš to rozbité“, bohužiaľ.
jtfcobra
Profil
upravil jsem to omlouvám se
lionel messi
Profil
jtfcobra:
30.2.2020

Nič v zlom, ale toto tomu nasádza korunu. Správny počet dní v mesiaci zistíš napr. pomocou funkcie cal_days_in_month
Tomášeek
Profil
jtfcobra:
$zaznam3, $data888, ... - to byl asi ten moment, kdy jsem ten kód přestal brát vážně.

Možná by to chtělo blíže popsat, kde je problém. Tohle totiž ani nevím, jakým je jazykem: „Přepočet měsíc chyba ve čtení dat máte někdo optimalizaci“.
jtfcobra
Profil
Neco v tomto smyslu slo by udelat 2 dotazy do jedne tabulky?


$merak='E13';
mysql_query( "SELECT hodiny,datum FROM cem1melnik.spotreba where idmeraku = '$merak' and Year(datum) = '2020' and Month(datum) = '02' order by id DESC LIMIT 1 JOIN (SELECT hodiny,datum,seriovecislo,byt FROM cem1melnik.spotreba where idmeraku = '$merak' and Year(datum) = '2020' and Month(datum) = '03' order by id DESC LIMIT 1)", $db );

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