Autor Zpráva
lukasekrod
Profil
Zdravím, s MySQL a vlastně i PHP jsem začátečník, a už několik dní nemohu přijít na kloub jedné věci. Na webu je přihlašování, uživateli se po přihlášení zobrazí stránka která je viditelná jen pro přihlášené. Na ní by měla být funkce pro výpočet zbývajících pracovních dnů. Počátečním dnem je dnešní den, konečný den bych potřeboval vzít z databáze z řádku aktuálně přihlášeného uživatele. Při registraci tento datum zadá a do tabulky se do řádku datum tento datum vpíše (ve formátu Y-m-d). Zde jsou konkrétní kódy:
Toto je stránka která se zobrazí uživateli po přihlášení:
<?php
/*
* Pokud uživatel není přihlášený, místo obsahu se mu ukáže tato hláška.
*/
if(!isset($_SESSION['prihlasen']) and @$_SESSION['prihlasen']!=1){
    echo "<h4>Pro zobrazení více informací se přihlašte</h4>";
    exit;
}
?>

<h4>Tajný obsah</h4>
<p> 
<?php //The function returns the no. of business days between two dates and it skips the holidays
function getWorkingDays($startDate,$endDate,$holidays){
    //The total number of days between the two dates. We compute the no. of seconds and divide it to 60*60*24
    //We add one to inlude both dates in the interval.
    $days = (strtotime($endDate) - strtotime($startDate)) / 86400 + 1;

    $no_full_weeks = floor($days / 7);
    $no_remaining_days = fmod($days, 7);

    //It will return 1 if it's Monday,.. ,7 for Sunday
    $the_first_day_of_week = date("N",strtotime($startDate));
    $the_last_day_of_week = date("N",strtotime($endDate));

    //---->The two can be equal in leap years when february has 29 days, the equal sign is added here
    //In the first case the whole interval is within a week, in the second case the interval falls in two weeks.
    if ($the_first_day_of_week <= $the_last_day_of_week){
        if ($the_first_day_of_week <= 6 && 6 <= $the_last_day_of_week) $no_remaining_days--;
        if ($the_first_day_of_week <= 7 && 7 <= $the_last_day_of_week) $no_remaining_days--;
    }
    else{
        if ($the_first_day_of_week <= 6) {
        //In the case when the interval falls in two weeks, there will be a weekend for sure
            $no_remaining_days = $no_remaining_days - 2;
        }
    }

    //The no. of business days is: (number of weeks between the two dates) * (5 working days) + the remainder
//---->february in none leap years gave a remainder of 0 but still calculated weekends between first and last day, this is one way to fix it
   $workingDays = $no_full_weeks * 5;
    if ($no_remaining_days > 0 )
    {
      $workingDays += $no_remaining_days;
    }

    //We subtract the holidays
    foreach($holidays as $holiday){
        $time_stamp=strtotime($holiday);
        //If the holiday doesn't fall in weekend
        if (strtotime($startDate) <= $time_stamp && $time_stamp <= strtotime($endDate) && date("N",$time_stamp) != 6 && date("N",$time_stamp) != 7)
            $workingDays--;
    }

    return $workingDays;
}
 
$holidays=array("2008-12-25","2008-12-26","2009-01-01");
$datum=Date ("Y-m-d");  
require_once "db.php";
    $query = MySQL_Query("SELECT * FROM `uzivatele`") or die (mysql_error());
            while($Vysledek = mysql_fetch_array($query)){
            
            echo getWorkingDays($datum,$Vysledek['konecnydatum'],$holidays);    } ?>

    Nějaký text :)
</p>

V PHP části je funkce getWorkingDays, která slouží pro výpočet pracovních dnů mezi startovním datem a konečným datem. Pod ní je definice že startovní den je $datum=Date ("Y-m-d"); a taky jsou tam dané prázdniny (ještě ne ty české, ty pak dopíšu) - $holidays=array("2008-12-25","2008-12-26","2009-01-01");. Pak se připojím přes db.php k databázi.

Do echo getWorkingDays($datum,$Vysledek['web'],$holidays); bych za $Vysledek['web'] potřeboval importovat datum z databáze. Datum v databázi je napsán jako čistý text, třeba 2012-06-16 ve sloupci konecnydatum. Tento datum bych potřeboval naimportovat z databáze do echa té funkce getWorkingDays. Jenže zatím se mi to nikdy nepodařilo, ať jsem dělal co jsem dělal. Pokoušel jsem se to vyhledat na internetu i zde, ale taky bezúspěšně (možná jsem to nehledal pod správnými klíčovými slovy, ale nic jiného mě nenapadlo). Mohl by mi prosím někdo říct kde mám chybu a jak to opravit?

Předem díky za pomoc :)
Kajman
Profil
lukasekrod:
Mohl by mi prosím někdo říct kde mám chybu a jak to opravit?

Jestli chcete pomoci s opravou, tak musíte naopak říci sám, kde máte chybu nebo jak se projevuje.
lukasekrod
Profil
Omlouvám se, nenapadlo mě to. Když uživatel zadá při registraci datum 2012-06-16, tak se mu po přihlášení místo vypočítaného počtu pracovních dnů od dnešního dne do 16.6.2012 zobrazí toto: "15-11065-11065-11065 Nějaký text :)". To že je tam věta Nějaký text :), to je správně, ovšem to že je tam 15-11065-11065-11065, to už je chyba, protože by tam správně mělo být vypsáno 14. V první části chybně vypsaného počtu dnů je 15, to je pravděpodobně výsledek výpočtu, ale o den větší a číslice 11065 vůbec nemám tušení co tam dělají.
To, že je výsledek o den větší, to se vyřešit dá, jednoduše odečtu od echa -1.
echo getWorkingDays($datum,$Vysledek['konecnydatum'],$holidays)-1;
Ale netuším, kde se vzaly v echu funkce getWorkingDays čísla 11065, teď jsem si trochu s kódem pohrál a zjistil jsem ještě následující:
Když do echa té funkce echo getWorkingDays($datum,$Vysledek['koneckydatum'],$holidays); místo $Vysledek['koneckydatum'] vložím ručně datum "2012-06-16" -> takže celý výpočet bude vypadat takto:
$holidays=array("2008-12-25","2008-12-26","2009-01-01");
$datum=Date ("Y-m-d");  
require_once "db.php";
    $query = MySQL_Query("SELECT * FROM `uzivatele`") or die (mysql_error());
            while($Vysledek = mysql_fetch_array($query)){
            
            echo getWorkingDays($datum,"2012-06-16",$holidays)-1;    } ?>
 
    Nějaký text :)
a nechám tam ten vstup do databáze, správně se mi vypíše výsledek 14, ovšem 4x za sebou (takže 14141414). V databázi jsou 4 zaregistrovaní uživatelé, když se zaregistruje další uživatel, výsledek se správně vypíše 5x.

Chyba je to určitě nějaká základní, protože jak je vidět, datum se z databáze vezme a proběhne výpočet, jenže proběhne tolikrát kolik je v tabulce řádků. Ty desetitisíce co se vypíšou se vypíšou proto, že ostatní uživatelé datum nezadali, když u nich ovšem datum dopíšu, vypíše se výpočet pracovních dnů všech najednou (takže třeba 1218151614, s tím, že 12 je pro prvního uživatele, 18 počet dnů pro druhého atd)

Vzhledem k tomu, že se vypíšou výsledky všech uživatelů ačkoliv já chci vypsat výsledek jen pro toho přihlášeného uživatele si myslím, že chyba je v řádku se SELECT * FROM..., ale nevím jak z databáze vydolovat datum pouze z řádku aktuálně přihlášeného uživatele, ne všech.
Tak snad už jsem to popsal správně, ještě jednou se omlouvám :)

EDIT: Chyba je určitě v části SELECT, pokusil jsem se jí upravit takto (nakopíruji jen upravenou část kódu, zbytek je stejný):
$holidays=array("2008-12-25","2008-12-26","2009-01-01");
$datum=Date ("Y-m-d");
$id_uzivatele=$_POST['id'];  
require_once "db.php";
    $query = MySQL_Query("SELECT * FROM `uzivatele` WHERE `id`='$id_uzivatele'") or die (mysql_error());
            while($Vysledek = mysql_fetch_array($query)){
            
            echo getWorkingDays($datum,$Vysledek['koneckydatum'],$holidays)-1;    } ?>

    Nějaký text :)
Funkce pro výpočet zbývajících prac. dnů už ale po této úpravě nevypíše vůbec nic... Nevíte prosím, kde ve zjištění id uživatele je chyba?
Tori
Profil
echo getWorkingDays($datum,$Vysledek['koneckydatum'],$holidays)-1; } ?> - tohle jste se překlepl tady, nebo to máte tak i v kódu?
Kajman
Profil
lukasekrod:
Nevíte prosím, kde ve zjištění id uživatele je chyba?

A kam si ukládáte id příhlášeného? To posíláte stále přes POST nebo si to uložíte do SESSION? Když si vypíšete proměnnou $id_uzivatele nebo rovnou sestavený dotaz, tak tam je id, které očekáváte?
lukasekrod
Profil
Tori:
tohle jste se překlepl tady, nebo to máte tak i v kódu?
To jsem se pouze překlepl při psaní zde, v kódu to bylo správně.

Kajman:
A kam si ukládáte id příhlášeného?
Tak tam je ta chyba. ID uživatele se ukládá do SESSION, zkusil jsem zaměnit POST v definici proměnné id_uzivatele za SESSION a přes echo vypsat jen id a už to šlo, celé to jsem zkusil zakomponovat do funkce pro výpočet dní a ta už taky funguje. Čekal jsem že to bude nějaká takováhle blbá chybička, ale nemohl jsem na to přijít. Děkuji za "nakopnutí" a za pomoc :)

Zde je opravený kód, pokud by se někdy někomu hodil :) :
$holidays=array("2008-12-25","2008-12-26","2009-01-01");
$datum=Date ("Y-m-d");
$id_uzivatele=$_SESSION['UserId'];  
require_once "db.php";
    $query = MySQL_Query("SELECT * FROM `uzivatele` WHERE `id`='$id_uzivatele'") or die (mysql_error());
            while($Vysledek = mysql_fetch_array($query)){
            
            echo getWorkingDays($datum,$Vysledek['web'],$holidays)-1;    } ?>

    Nějaký text :)

Ještě jednou díky :)

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: