ページエディターをアップデート
久しぶりにページエディターをアップデートしました。
PHPのバージョンが7以降で使われることを想定した修正です。
ページエディター
http://oldhouse.php.xdomain.jp/service.html
1.エラー制御。
2.関数、isset emptyを利用。
としてあります。
ご活用ください。
スケジューラー、休日表示
最後にスケジューラーの休日ファイルを用意。
これで週間スケジューラーが完成。
是非お試しください。
<?php ### 説明 ############################# #休日 #休日ライブラリ $hdnm = array( "2020-12-31" => "年末", "2020-12-30" => "年末", "2020-11-23" => "勤労感謝の日", "2020-11-03" => "文化の日", "2020-09-22" => "秋分の日", "2020-09-21" => "敬老の日", "2020-08-10" => "山の日", "2020-07-24" => "スポーツの日", "2020-07-23" => "海の日", "2020-05-06" => "振替休日", "2020-05-05" => "こどもの日", "2020-05-04" => "みどりの日", "2020-05-03" => "憲法記念日", "2020-04-29" => "昭和の日", "2020-03-20" => "春分の日", "2020-02-24" => "振替休日", "2020-02-23" => "天皇誕生日", "2020-02-11" => "建国記念の日", "2020-01-13" => "成人の日", "2020-01-03" => "正月", "2020-01-02" => "正月", "2020-01-01" => "元旦" ); ?>
スケジューラー、入力画面
入力画面を以下のようにします。
ファイル名は、edit.php とします。
<?php /*修正 データインプット */ include("../login_pdo.php"); #ジャンプ先 $jump = "./index.php"; $ttt = "Weekly Schedule Input"; $ddd = $_GET['ddd']; $user = $_GET['user']; $role = $_GET['role']; #日時 $now = date("Y-m-d H:i:s"); /////入力されたら/////////////////////////////////////////// if(isset($_POST['RUN'])){ #入力簡易化 extract($_POST); ////削除判定 //if($del == "YES" or strlen($com_c) < 3){$delrun = "GO"; } //削除する if($del == "YES" or (strlen($com_c) < 3 and $office_c == 0)){$delrun = "GO"; } //削除する else{$delrun = ""; } //削除しない ///▼保存、新規(削除ではない) if($delrun == ""){ ////文字処理///////////////// $_POST[com_c] = trim($_POST[com_c]); #置換 $_POST[com_c] = ereg_replace("<", "<", $_POST[com_c]); $_POST[com_c] = ereg_replace(">", ">", $_POST[com_c]); $_POST[com_c] = ereg_replace("\n", "<br>", $_POST[com_c]); #エスケープ //$_POST[com_c] = mysql_real_escape_string($_POST[com_c]); ////文字処理///////////////// if($_POST[office_c] ==""){$_POST[office_c] = 0;} $i = 0; ### SQL データチェック //SQLの準備 $sql = "SELECT no_c,user_c,date_c,com_c,office_c FROM `weekly` WHERE date_c='$ddd_c' and user_c='$user_c'"; //SQL実行 $stmt = $dbh->query($sql); //SQL結果の取り出し while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){ extract($row); //$com_c = ereg_replace("<br>", "\n", $com_c); $i++; } #処理1、保存------------------------------ if ($i >= 1){ $sql = "UPDATE `weekly` SET com_c = :com, office_c = :office, timestamp_c = :now WHERE no_c=:no"; $pre = $dbh->prepare($sql); $pre->bindValue(':no',$no_c, PDO::PARAM_STR); $pre->bindValue(':com',$_POST[com_c], PDO::PARAM_STR); $pre->bindValue(':office',$_POST[office_c], PDO::PARAM_STR); $pre->bindValue(':now',$now, PDO::PARAM_STR); //SQL実行 $result = $pre->execute(); #エラーの場合 if ($result == false) { {die("$msg = 保存データ処理が失敗しました。".mysql_error());} } else{ $msg ="保存データ処理を実行しました。"; } } #処理2、新規追加-------------------------- elseif ($i == 0){ $sql = "INSERT INTO `weekly`(`user_c`,`date_c`,`com_c`,`office_c`,`timestamp_c`) VALUE(:user,:ddd,:com,:office,:now)"; $pre = $dbh->prepare($sql); $pre->bindValue(':user',$user_c, PDO::PARAM_STR); $pre->bindValue(':ddd',$ddd_c, PDO::PARAM_STR); $pre->bindValue(':com',$_POST[com_c], PDO::PARAM_STR); $pre->bindValue(':office',$_POST[office_c], PDO::PARAM_STR); $pre->bindValue(':now',$now, PDO::PARAM_STR); //SQL実行 $result = $pre->execute(); #エラーの場合 if ($result == false) { {die("$msg = 新規データ処理が失敗しました。".mysql_error());} } else{ $msg ="新規データ処理を実行しました。"; } } } ///▼削除 elseif($delrun == "GO"){ $sql = "DELETE FROM `weekly` WHERE no_c=:no"; $pre = $dbh->prepare($sql); $pre->bindValue(':no',$no_c, PDO::PARAM_STR); //SQL実行 $result = $pre->execute(); #エラーの場合 if ($result == false) { {die("$msg = 削除データ処理が失敗しました。".mysql_error());} } else{ $msg ="削除データ処理を実行しました。"; } } #ジャンプ header("Location: {$jump}?user={$user_c}&ddd={$ddd_c}&role={$role}&msg={$msg}"); } /////入力されたら/////////////////////////////////////////// ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf8"> <link rel="stylesheet" href="style.css"> <link href="https://fonts.googleapis.com/css?family=Cherry+Swash|M+PLUS+1p&display=swap" rel="stylesheet"> <title><?php echo $ttt; ?></title> </head> <body> <h1><?php echo $ttt; ?></h1> <br><br> <div id="cont"> <form name="form" method="POST" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>"> <?php $i = 0; ### SQL ddd user は、スケジュールページから取得 //SQLの準備 $sql = "SELECT no_c,user_c,date_c,com_c,office_c FROM `weekly` WHERE date_c='$ddd' and user_c='$user'"; //SQL実行 $stmt = $dbh->query($sql); //SQL結果の取り出し while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){ extract($row); $com_c = ereg_replace("<br>", "\n", $com_c); $i++; $mode = "編集"; $modev = "SAVE"; } if($i ==0){$mode = "新規"; $modev = "INS"; } ?> モード<br> <input type=text size=8 name=mode value='<?php echo $mode; ?>' readonly> <br><br> 日付<br> <input type="text" size="12" name="ddd_c" value="<?php echo $ddd; ?>" readonly> <br><br> 内容:<br> <textarea rows=23 cols=50 name='com_c'><?php echo $com_c; ?></textarea> <br> <input type=hidden size=8 name='no_c' value='<?php echo $no_c; ?>'> <input type=hidden size=12 name='user_c' value='<?php echo $user; ?>'> <input type=hidden size=12 name='role' value='<?php echo $role; ?>'> <input type=hidden size=12 name='what' value='<?php echo $modev; ?>'> <br> <?php if($user <= 6): ?> 出勤数 <select name="office_c"> <option value="0" <?php echo ($office_c == '0') ? 'selected' : ''; ?>>0</option> <option value="1" <?php echo ($office_c == '1') ? 'selected' : ''; ?>>1</option> <option value="2" <?php echo ($office_c == '2') ? 'selected' : ''; ?>>2</option> <option value="3" <?php echo ($office_c == '3') ? 'selected' : ''; ?>>3</option> <option value="4" <?php echo ($office_c == '4') ? 'selected' : ''; ?>>4</option> <option value="5" <?php echo ($office_c == '5') ? 'selected' : ''; ?>>5</option> </select> 名 <br> <?php endif; ?> <br> <input type="checkbox" name="del" value="YES"> <font color=red size=-1>削除する</font><br> <br> <input type=submit name="RUN" value=" 実行する "> </form> </div> <br> <?php echo $foot; ?><br> </body> </html>
スケジューラー、メイン画面
スケジューラーのメイン画面です。
1週間を表示します。
登録は、名前、部署、会議室など利用に合わせて設定します。
<?php /*履歴 トップ画面 */ include("./login_pdo.php"); include("./holiday.php"); #休日データ #スクリプト名 $script = "index.php"; $ttt = "Weekly Schedule"; #編集ファイル $edt = "./edit.php"; #入力簡易化 extract($_GET); //名前・部署 $dept = array('名前1','名前2','名前3','名前4','名前5','名前6','会議室1','会議室2'); //入力文字。ペンアイコン<img src=img/pen1.png width=14 height=14 border=0>なども可 $pen = "./"; $memo = "入力するには画面右上からLOG IN。{$pen} をクリックします。"; if($user == ""){$user = $_GET['user']; } if($role == ""){$role = $_GET['role']; } //今日の日付 $kyo = date('Y/m/d'); $kyd = date('m/d'); //今週の日付を保持するための配列 $out_date = array(); //調整値 $week_start = array('0','-1','-2','-3','-4','-5','-6'); //曜日 $week_jp = array('日','月','火','水','木','金','土'); //初期値 if($role == ""){$role = 0;} //翌週 $plus = $role + 1; $minus = $role - 1; //ロール日数 $rold = $role*7; //date('w')で曜日のインデックスを取得する。 //例:今日が木曜日の場合、4を返す。 $week_index = $week_start[date('w')] + $rold; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf8"> <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script> <script src="jquery.typetype.js"></script> <script> //setTimeout関数でfadeOut()の実行を遅延させる setTimeout(function() { $('.msg').fadeOut(); }, 5000); </script> <link rel="stylesheet" href="style.css"> <link href="https://fonts.googleapis.com/css?family=Cherry+Swash|Kaushan+Script|M+PLUS+1p&display=swap" rel="stylesheet"> <title><?php echo $ttt; ?></title> </head> <body> <?php /* echo "Today = $kyo<br>\n"; echo "Adjust = $week_index\n<br>------<br>\n"; echo "Role = $role / minus $minus : plus $plus<br>\n"; echo "Rold = $rold<br>\n"; */ echo "<h1>{$ttt}</h1>"; echo "<div id=login>"; echo "<form name='form' method='GET' action={$_SERVER['SCRIPT_NAME']}>\n"; //ログイン if($user == ""){ echo "ログイン: "; echo "<SELECT name=user>\n"; echo "<OPTION value=$user>$user</OPTION>\n"; for ($i=0; $i<=7; $i++) { echo "<OPTION value={$i}>{$dept[$i]}</OPTION>\n"; } echo "</SELECT> <input type=submit value='LOG IN'> "; echo "<input type=hidden name=role value='{$role}'>"; } else{ echo "<font color=red>{$dept[$user]} で、ログイン中</font> "; echo "<input type=submit value='LOG OUT'>"; echo "<input type=hidden name=user value=''>"; echo "<input type=hidden name=role value='{$role}'>"; } echo "</form>\n"; echo "</div>"; if($_GET['msg'] != ""){ echo "<div class=msg></div>"; } ?> <!-- ★ジャンプバー --> <table width="100%" align="center" border="0" cellpadding="0" cellspacing="1"> <tr bgcolor="#000000"><td> <table width="98%" align="center" border="0"> <tr align="center"> <form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="GET"><td> <select name="role"> <option value="-2">2週前 <option value="-3">3週前 <option value="-4">4週前 </select><input type=submit value="ジャンプ"> <input type="hidden" name="mode" value="view"> <input type="hidden" name="user" value="<?php echo $user; ?>"> </td></form> <form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="GET"><td> <input type="hidden" name="role" value="<?php echo $minus; ?>"> <input type="submit" value=" < 前 週 "> <input type="hidden" name="user" value="<?php echo $user; ?>"> </td></form> <form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="GET"><td> <input type="hidden" name="role" value="0"> <input type="submit" value=" 今 週 に も ど る "> <input type="hidden" name="user" value="<?php echo $user; ?>"> </td></form> <form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="GET"><td> <input type="hidden" name="role" value="<?php echo $plus; ?>"> <input type="submit" value=" 翌 週 > "> <input type="hidden" name="mode" value="view"> <input type="hidden" name="user" value="<?php echo $user; ?>"> </td></form> <form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="GET"><td> <select name="role"> <option value="2">2週後 <option value="3">3週後 <option value="4">4週後 <option value="5">5週後 <option value="6">6週後 <option value="7">7週後 <option value="8">8週後 <option value="9">9週後 <option value="10">10週後 <option value="11">11週後 <option value="12">12週後 <option value="13">13週後 <option value="14">14週後 <option value="15">15週後 </select><input type=submit value="ジャンプ"> <input type="hidden" name="user" value="<?php echo $user; ?>"> </td></form> </tr></table> </td></tr></table> <br> <?php //Week表示 日→土 echo "<table width=100% border=1 cellspacing=0 cellpadding=4 class=base>"; echo "<tr align=center bgcolor=#FFFFCC><td width=16% height=46>日付</td>"; for ($i=0; $i<7; $i++) { //今日が木曜日だとしたら、$week_indexが-4となるため、今日の日付から-4が日曜日。 //そこから1週間分ループしながら表示する。 $disp_date = strtotime(date('Y-m-d') . '+' . $week_index . 'days'); $out_date = date('m/d', $disp_date); //表示用に日付 $ful_date = date('Y-m-d', $disp_date); //表示用に日付 $hol = $hdnm["$ful_date"]; //休日 //今日の場合、背景に色つけ if($out_date == "$kyd"){$bcol = "bgcolor=#FFCC66"; } elseif($i == "0"){$bcol = "bgcolor=#ff6699";} elseif($i == "6"){$bcol = "bgcolor=#99ccff";} else{$bcol = ""; } //休日は赤表示 if($hol !=""){$bcol = "bgcolor=#ff6699"; $hol = "<br><span class=hate>{$hol}</span>"; } echo "<td width=12% {$bcol} class=date>{$out_date}<span class=yobi>({$week_jp[$i]})</span>{$hol}</td>\n"; //echo $week_index.": "; //echo $out_date."<br>\n"; $days[] = $ful_date; //日~土までの日付を配列に入れる。 $week_index++; } echo "</tr>\n\n"; //////////////////////////////////////////////////// ### SQL //SQLの準備 $sql = "SELECT user_c,date_c,com_c,office_c FROM `weekly` WHERE date_c between '$days[0]' and '$days[6]' ORDER BY user_c,date_c"; //SQL実行 $stmt = $dbh->query($sql); //SQL結果の取り出し while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){ extract($row); if($date_c == "$days[0]"){$evt1 = "$com_c"; $evt[$user_c][0] = "$com_c"; $ofc[$user_c][0]= $office_c; } if($date_c == "$days[1]"){$evt2 = "$com_c"; $evt[$user_c][1] = "$com_c"; $ofc[$user_c][1]= $office_c; } if($date_c == "$days[2]"){$evt3 = "$com_c"; $evt[$user_c][2] = "$com_c"; $ofc[$user_c][2]= $office_c; } if($date_c == "$days[3]"){$evt4 = "$com_c"; $evt[$user_c][3] = "$com_c"; $ofc[$user_c][3]= $office_c; } if($date_c == "$days[4]"){$evt5 = "$com_c"; $evt[$user_c][4] = "$com_c"; $ofc[$user_c][4]= $office_c; } if($date_c == "$days[5]"){$evt6 = "$com_c"; $evt[$user_c][5] = "$com_c"; $ofc[$user_c][5]= $office_c; } if($date_c == "$days[6]"){$evt7 = "$com_c"; $evt[$user_c][6] = "$com_c"; $ofc[$user_c][6]= $office_c; } //echo "$user_c $date_c / $com_c<br>"; } //////////////////////////////////////////////////// ///ループ開始 for ($u=0; $u<=7; $u++) { //ユーザーカラー&入力リンク if($user != "" and $u == "$user"){ $ucol = "<font color=red><strong>"; $ip0 = "<a href={$edt}?user={$u}&ddd={$days[0]}&role={$role}>{$pen}</a>"; $ip1 = "<a href={$edt}?user={$u}&ddd={$days[1]}&role={$role}>{$pen}</a>"; $ip2 = "<a href={$edt}?user={$u}&ddd={$days[2]}&role={$role}>{$pen}</a>"; $ip3 = "<a href={$edt}?user={$u}&ddd={$days[3]}&role={$role}>{$pen}</a>"; $ip4 = "<a href={$edt}?user={$u}&ddd={$days[4]}&role={$role}>{$pen}</a>"; $ip5 = "<a href={$edt}?user={$u}&ddd={$days[5]}&role={$role}>{$pen}</a>"; $ip6 = "<a href={$edt}?user={$u}&ddd={$days[6]}&role={$role}>{$pen}</a>"; } else{$ucol = ""; $ip0 = ""; $ip1 = ""; $ip2 = ""; $ip3 = ""; $ip4 = ""; $ip5 = ""; $ip6 = ""; } echo "<tr valign=top><td height=65>{$ucol}{$dept[$u]}</td>"; if($ofc[$u][0] == ""){$ofc[$u][0] = 0; } if($ofc[$u][1] == ""){$ofc[$u][1] = 0; } if($ofc[$u][2] == ""){$ofc[$u][2] = 0; } if($ofc[$u][3] == ""){$ofc[$u][3] = 0; } if($ofc[$u][4] == ""){$ofc[$u][4] = 0; } if($ofc[$u][5] == ""){$ofc[$u][5] = 0; } if($ofc[$u][6] == ""){$ofc[$u][6] = 0; } //会議室・小会議室は、出席=空 if($u >= 7){ $ofc[$u][0] = ""; $ofc[$u][1] = ""; $ofc[$u][2] = ""; $ofc[$u][3] = ""; $ofc[$u][4] = ""; $ofc[$u][5] = ""; $ofc[$u][6] = ""; } //出席スタイル $sty = "<div class=dkei>"; //ゼロを表示しない場合のサンプル //if($ofc[$u][5] > 0){$n5 = $ofc[$u][5];} else{$n5 = ""; } echo " <td>{$ip0} {$sty}{$ofc[$u][0]}</div>{$evt[$u][0]}<br></td> <td>{$ip1} {$sty}{$ofc[$u][1]}</div>{$evt[$u][1]}<br></td> <td>{$ip2} {$sty}{$ofc[$u][2]}</div>{$evt[$u][2]}<br></td> <td>{$ip3} {$sty}{$ofc[$u][3]}</div>{$evt[$u][3]}<br></td> <td>{$ip4} {$sty}{$ofc[$u][4]}</div>{$evt[$u][4]}<br></td> <td>{$ip5} {$sty}{$ofc[$u][5]}</div>{$evt[$u][5]}<br></td> <td>{$ip6} {$sty}{$ofc[$u][6]}</div>{$evt[$u][6]}<br></td>"; } ///ループ終了 echo "</tr>"; //出勤数計算 $ok0 = $ofc[0][0] + $ofc[1][0] + $ofc[2][0] + $ofc[4][0] + $ofc[5][0] + $ofc[6][0]; $ok1 = $ofc[0][1] + $ofc[1][1] + $ofc[2][1] + $ofc[4][1] + $ofc[5][1] + $ofc[6][1]; $ok2 = $ofc[0][2] + $ofc[1][2] + $ofc[2][2] + $ofc[4][2] + $ofc[5][2] + $ofc[6][2]; $ok3 = $ofc[0][3] + $ofc[1][3] + $ofc[2][3] + $ofc[4][3] + $ofc[5][3] + $ofc[6][3]; $ok4 = $ofc[0][4] + $ofc[1][4] + $ofc[2][4] + $ofc[4][4] + $ofc[5][4] + $ofc[6][4]; $ok5 = $ofc[0][5] + $ofc[1][5] + $ofc[2][5] + $ofc[4][5] + $ofc[5][5] + $ofc[6][5]; $ok6 = $ofc[0][6] + $ofc[1][6] + $ofc[2][6] + $ofc[4][6] + $ofc[5][6] + $ofc[6][6]; echo "<tr height=65><td>出勤数<br></td>"; echo "<td align=center class=kei>$ok0</td>"; echo "<td align=center class=kei>$ok1</td>"; echo "<td align=center class=kei>$ok2</td>"; echo "<td align=center class=kei>$ok3</td>"; echo "<td align=center class=kei>$ok4</td>"; echo "<td align=center class=kei>$ok5</td>"; echo "<td align=center class=kei>$ok6</td>"; echo "</tr></table>"; echo "$okei"; echo "<div class=memo>{$memo}</div>"; echo $foot; ?> <br> <script> $('.msg').typetype('<?php echo $_GET['msg']; ?>') </script> </body> </html>
ログイン用ファイル
データベースを作ったら、ログイン用ファイルを用意します。
ファイル名は、login_pdo.php とします。
ユーザー名、パスワード、ホスト名、データベース名はそれぞれの環境に合わせます。
<?php /* ログイン用 */ $usid = "username"; //ユーザー名 $pass = "password"; //パスワード $host = "ホスト名"; //ホスト名 $dbnm = "データベース名"; //データベース名 //通常処理 try{ //PDOオブジェクトの作成 $dbh = new PDO('mysql:host=$host;dbname=$dbnm;charset=utf8', $usid, $pass); //echo "接続成功"; #テスト時のみ表示 } //エラー処理 catch(PDOException $e) { echo "接続エラー". $e->getMessage() . "\n"; exit(); } $foot = '<hr color="#6B8E23" height="1"><center> <font color="#6B8E23" size=2>- フッター - </font></center>'; ?>
スケジューラーのテーブル作成
まずはスケジューラーのテーブルを作成します。
名前は、weeklyとしています。
MySQLで以下のようにして実行します。
CREATE TABLE `weekly` ( `no_c` int(11) NOT NULL, `user_c` varchar(4) DEFAULT NULL, `date_c` date DEFAULT NULL, `com_c` text, `timestamp_c` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;