koodikirjastosta (http://mureakuha.com/koodikirjasto/596) pohjan otin tuohon omaan viikkokalenteriin. Itse pikkasen muokannut tuota itselleni sopivaksi mutta nyt ongelma tullut eteen... En saa mitenkään kannassa olevaa tietoa päivittymään tuohon varsinaiseen viikkokalenteriin! Kaikkea mahdollista on tullut kokeiltua mutta kun ei niin ei onnistu.
LIekö ongelma tuossa tieto_arrayssa vai??? Jos visaammat ja gurut osaisi pikkasen opastaa tässä!!! KIITOS
Laitan koko koodin tähän:
$start = 800; // Kellonaika, josta aloitetaan $stop = 1600; // Kellonaika, johon lopetetan $http = $_SERVER['PHP_SELF']; $week_days = array("Ma","Ti","Ke","To","Pe"); $result = array(); $cycle = array(); Function search_between($val, $arr) { $rtn = false; foreach($arr as $array) { if($tieto_array['ALKU'] <= $val && $tieto_array['LOPPU'] > $val) // Jos aika on varattu, palautetaan varaus { $rtn = $array; break; } } return $rtn; } Function get_last_monday($day,$month,$year) { $timestamp = mktime(0,0,0,$month,$day,$year); While(date('w',$timestamp) != 1) // Jos päivä ei ole maanantai, poistetaan päivä timestampista { $timestamp -= 60*60*24; } return $timestamp; } // Muuttujat... $day = $_GET['day']; $month = $_GET['month']; $year = $_GET['year']; if(empty($_GET['day'])) $day = date('d'); if(empty($_GET['month'])) $month = date('m'); if(empty($_GET['year'])) $year = date('Y'); // Edellinen- ja seuraava viikko-nappeihin arvot $last_monday = get_last_monday($day,$month,$year); $forward['day'] = date("d", ($last_monday+(8*24*3600))); $forward['month'] = date("m", ($last_monday+(8*24*3600))); $forward['year'] = date("Y", ($last_monday+(8*24*3600))); $back['day'] = date("d", ($last_monday-(6*24*3600))); $back['month'] = date("m", ($last_monday-(6*24*3600))); $back['year'] = date("Y", ($last_monday-(6*24*3600))); $eka = date("d.m.Y H:i", $last_monday); $toka = date("d.m.Y H:i", $last_monday+(7*60*60*24)); // VOIPI OLLA ETTÄ ARRAY RAKENNETTU VÄÄRIN?? $sql = "SELECT koulutus_id, to_char(alku_aika, 'DD.MM.YYYY hh24:mi') as alku, to_char(loppu_aika, 'DD.MM.YYYY hh24:mi') as loppu FROM koulutus"; $results = query($conn,$sql); $i = 0; while (OCIFetchInto($results, &$results_out, OCI_ASSOC)){ $tieto_array[$i] = $results_out['KOULUTUS_ID']. " " .$results_out['ALKU']. " " .$results_out['LOPPU']; $i++; } OCIFreeStatement($results); $contents .= ' <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Viikkokalenteri</title> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <style type="text/css"> <!-- .cornercell { text-align: center; border: 1px solid black; height: 20px; background-color: #DCDCDC; } .daycell { text-align: center; width: 12%; height: 20px; border-bottom: 1px solid black; border-right: 1px solid black; border-top: 1px solid black; background-color: #DCDCDC; } .timecell { text-align: center; border-bottom: 1px solid black; border-right: 1px solid black; border-left: 1px solid black; background-color: #DCDCDC; width: 11%; height: 20px; } .concell { border-right: 1px solid black; border-bottom: 1px solid black; background-color: #F2F2F2; text-align: center; } .setcell { border-right: 1px solid black; border-bottom: 1px solid black; background-color: #EFEFEF; text-align: center; } --> </style> </head> <body> <table cellpadding="6" border="1" width="100%"> <tr> <td align="left"> <a href="'.$http.'?day='.$back['day'].'&month='.$back['month'].'&year='.$back['year'].'"> [edellinen viikko] </a> <a href="'.$http.'?day='.date('d').'&month='.date('m').'&year='.date('Y').'"> [tämä viikko] </a> <a href="'.$http.'?day='.$forward['day'].'&month='.$forward['month'].'&year='.$forward['year'].'"> [seuraava viikko] </a><br> </td> <td align="right"> <form method="get" action="'.$http.'" style="margin: 0px;"> Hae päivä: <input type="text" size="2" value="'.$day.'" maxlength="2" name="day"> <b>.</b> <input type="text" size="2" value="'.$month.'" maxlength="2" name="month"> <b>.</b> <input type="text" size="4" value="'.$year.'" maxlength="4" name="year"> <input type="submit" value=">>"> </form> </td> </tr> </table> <table cellspacing="0" cellpadding="1" width="100%"> <tr> <td class="cornercell"> Aika </td> '; for($f=0;$f<5;$f++) // päivät-ylärivi { $contents .= " <td class=\"daycell\"> ".$week_days[$f]." ".date("d.m.Y",$last_monday+($f*60*60*24))." </td>\n"; $set[$g] = 0; } $contents .= " </tr>\n"; for($i=$start; $i<$stop; $i=$i+50) // Aletaan luomaan tunteja ylhäältä alaspäin. { $contents .= " <tr>\n"; // aika vasemmassa palkissa. $first_num = substr($i, 0, -2); if(substr($i, -2) == 50) $last_num = '30'; else $last_num = '00'; if($last_num == 30) { $sec_last_num = '00'; $sec_first_num = $first_num+1; } else { $sec_last_num = '30'; $sec_first_num = $first_num; } $contents .= " <td class=\"timecell\">".$first_num.":".$last_num."-".$sec_first_num.":".$sec_last_num."</td>\n"; // viikonpäiviä läpi, 5 päivää... //TÄSTÄ ILMEISESTI ONGELMAT ALKAA TAI SITTEN TUOLTA YLEEMPÄNÄ MISSÄ TIEDOT KANNASTA HAETAAN TIETO_ARRAY:N for($g=0; $g<5; $g++) { $seek_time = $g*24*60*60+$last_monday+($first_num*60*60+$last_num*60); $muotoiltu = date("d.m.Y H:i", $seek_time); $s_result = search_between($muotoiltu, $tieto_array); if(!$s_result) // Jos tietoja ei löydetty, on solun sisältö tyhjä { // $koulutus_id = $muotoiltu; $tulostus = " "; $not_found = false; } else // Tietoja löydetty, laitetaan sisältö muuttujaam... { $not_found = true; $tulostus = stripslashes($results_out['KOULUTUS_ID']); // Jos $cycle muuttujassa ei ole $g-päivän kohdalla enää varausta, ja varaus kestää 1 tunnin tai yli, niin asetetaan se läpikäytäväksi... if($cycle[$g] == 0 && (($results_out['LOPPU'] - $results_out['ALKU'])/60/30) >= 1) { $cycle[$g] = ($results_out['LOPPU'] - $results_out['ALKU'])/60/30; // Lasketaan, montako tuntia varaus kestää. Tunnit = rowspan, laitetaan $cycle-muuttujaan $g-päivän kohdalle $begin = 1; // Kerrotaan, että täytyy aloittaa solu } } if($cycle[$g] == 0) // Jos ei sisältöä soluun, tulostetaan tyhjä solu { $contents .= " <td class=\"concell\">".$tulostus." </td>\n"; // Jatketaan vanhan solun piirtämistä tai luodaan uusi tyhjä solu } elseif($begin == 1) // Aloitetaan solu, ja kirjoitetaan siihen sisältö. { $contents .= " <td class=\"setcell\" ".$cycle[$g]."\">"; // Luodaan uusi solu, jolle annetaan rowspan (tunnit) if($not_found) $contents .= '<a href="'.$http.'?act=poista&id='.$s_result['id'].'&day='.$day.'&month='.$month.'&year='.$year.'">[D]</a> '; $contents .= $koulutus_id."</td>\n"; $begin = 0; } if($cycle[$g] > 0) // Jos tieto on jo tulostettu soluun, niin odotetaan vielä varauksen loppuun ennen solun lopettamista { $cycle[$g]--; } } $contents .= " </tr>\n"; } $contents .= ' </table><br> </body> </html>'; print $contents; OCILogoff($conn); echo "<p>"; ?>
Eipä tunnu kovin innostavalta etsiä tuosta koodista toiminnallista virhettä. Opettele PHP:n perus debuggaus, echo ja print_r() :P Eli siis tulostelet vain kaikki toiminnan kannalta kriittiset muuttujat ennen ja jälkeen kriittisten kohtien.
NO seuraavaan löytyisi ehdotus tai neuvo!
Kannasta haen tietot tieto_array:hin (id, alku ja loppu).
Sitten on paivamaara_aika (05.08.2005 10:00).
Millä tavalla voisin tarkistaa onko tuo paivamaara_aika, kannasta haetun alku ja loppu välissä? Ja jos löytyy niin tulostetaan id.
miten tuo onnistuu php:llä? (in_array, is_array), vai pitääkö rakentaa oma funktio?
Tuotatuota. Suosittelisin tarkistamaan ihan ensimmäisen funktion search_between toiminnan. Näyttäisi siltä, että sieltä ainakin pari bugia löytyy... Jätetään korjaaminen kuitenkin läksyiksi :)
Ny mennyt usko ja toivo jälellä hitunen rakkauuta :).
Function search_between($val, $arr) { $rtn = false; foreach($arr as $array) { if($tieto_array['ALKU'] <= $val && $tieto_array['LOPPU'] > $val) // Jos aika on varattu, palautetaan varaus { $rtn = $array; break; } } return $rtn; } ---- for($g=0; $g<5; $g++) { $seek_time = $g*24*60*60+$last_monday+($first_num*60*60+$last_num*60); $muotoiltu = date("d.m.Y H:i", $seek_time); $s_result = search_between($muotoiltu, $tieto_array); if(!$s_result) // Jos tietoja ei löydetty, on solun sisältö tyhjä { // $koulutus_id = $muotoiltu; $tulostus = " "; $not_found = false; } else // Tietoja löydetty, laitetaan sisältö muuttujaam... { $not_found = true; $tulostus = stripslashes ($s_result['KOULUTUS_ID']); // Jos $cycle muuttujassa ei ole $g-päivän kohdalla enää varausta, ja varaus kestää 1 tunnin tai yli, niin asetetaan se läpikäytäväksi... if($cycle[$g] == 0 && (($s_result['LOPPU'] - $s_result['ALKU'])/60/30) >= 1) { $cycle[$g] = ($s_result['LOPPU'] - $s_result['ALKU'])/60/30; // Lasketaan, montako tuntia varaus kestää. Tunnit = rowspan, laitetaan $cycle-muuttujaan $g-päivän kohdalle $begin = 1; // Kerrotaan, että täytyy aloittaa solu } } ...
Tuossa välissä se ongelma on, mutta tällä päällä sitä en saa selvitettyä, olen pyöritellyt vaikka ja kuinka mutta ei onnista. Alkaa jo olla niin sekaisin että tuosta ei ota enää lainkaan selvää!
Sulla on tuo funktio väärin. Katsoppas, kun eihän tuossa funktiossa ole olemassakaan muuttujaa $tieto_array. Alla korjattu versio. Suosittelen käymään läpi dokumentaatiota PHP:n funktioista.
Hmm.. totta, pitäisi saada aikaa myös hieman manuaaleja lueskella. Mutta yksi juttu vielä? Tuossa kun haen tiedot kannasta array:n, niin onko tuo oikea tapa? koska kun myöhemmin haluan vaikka ALKU aikoja kattoa tuosta arraystä niin se ei onnistu. Elikkä array:n tulee kolme tietoa useaan otteeseen (id, alku, loppu). millä tavalla tuo array olisi järkevin tehä?
$sql ="SELECT koulutus_id, to_char(alku_aika, 'DD.MM.YYYY hh24:mi') as alku, to_char(loppu_aika, 'DD.MM.YYYY hh24:mi') as loppu FROM koulutus"; $results = query($conn,$sql); echo $sql; $i = 0; while (OCIFetchInto($results, &$results_out, OCI_ASSOC)){ $tieto_array[$i] = $results_out['KOULUTUS_ID']. " " .$results_out['ALKU']. " " .$results_out['LOPPU']; $i++; } echo "<br>"; print_r ($tieto_array); echo "<p>"; //TOINEN ARRAY MITÄ KOKEILIN (ei toimin tämäkään) $sql ="SELECT koulutus_id, to_char(alku_aika, 'DD.MM.YYYY hh24:mi') as alku, to_char(loppu_aika, 'DD.MM.YYYY hh24:mi') as loppu FROM koulutus"; $results = query($conn,$sql); while (OCIFetchInto($results, &$results_out, OCI_ASSOC)){ $a[] = array ( 'alku' => array($results_out['ALKU']), 'loppu' => array ($results_out['LOPPU']), 'id' => array ($results_out['KOULUTUS_ID']) ); }
Aihe on jo aika vanha, joten et voi enää vastata siihen.