忍者ブログ
[125] [126] [127] [128] [129] [130] [131] [132] [133] [134] [135
カレンダー
05 2025/06 07
S M T W T F S
4 6
11 12 14
16 17 20
24 25 26 27
30
カテゴリー
最新コメント
最新トラックバック
バーコード
ブログ内検索
アクセス解析
今まではプログラムを修正する仕事でしたが、今度はプログラムを新しく作る仕事です。
勤務表にサインをされる方が新しく作るプログラムのデータベースを作成され、どんなプログラムにして欲しいかを説明されました。
私は、新しく作るプログラムの画面を作成しました。
まず、Excelで新しく作るプログラムの画面を作成し、勤務表にサインをされる方に見せ、それをもとに画面を作成しました。
新しく作るプログラムの画面のデザインは修正したプログラムに合わせました。
勤務表にサインをされる方がデータベースにいくつかデータを作成されたので、トップページには作成されたデータを表示させるようにしましたが、右側に詳細と編集、削除というボタンを付けましたが表示が上手く行かなかったのでインターネットで調べ、FORMタグにstyle = \"margin-bottom:0px\"を追加したら上手く行きました。
トップページでデータベースからデータを取り出して、データがある場合はwhileを使い、echoでhtmlのテーブルを表示させました。
データを追加する画面は修正したプログラムを参考にしました。
ここではデータベースから取り出した値を引数にして、更に別のプログラムのデータを取り出す関数を使いました。
データを追加する画面では最初の画面で選択した値をセッションに入れて次の画面にジャンプし、データを入力する時に検索ボタンをクリックしてデータベースからデータを検索する画面にジャンプするのですが、そのボタンが2つあり、ボタンの表示がまた上手く行かなかったので、またstyle = \"margin-bottom:0px\"を追加しましたが、上手く行かなかったので、1つのFORMタグにサブミットボタンを入力したデータを確認する画面にジャンプするサブミットボタンのほかに2つ入れようと思い、インターネットで調べてみたら上手く行きました。

(例)JavaScriptの箇所
function sampleAdd(){
document.getElementById('form').action = './sampleadd.php';
}

htmlの箇所
<td><?php echo $_SESSION["sample"]; ?><input type=submit value="検索" onclick="sampleAdd();"></td>


また、データベースからデータを検索してデータを選択した後でデータを追加する画面に戻るのですが、検索ボタンをクリックする前に入力したデータを保持しなければならないのでデータベースからデータを検索する画面で$_POST["入力画面のフォームの部品のname属性"]に値がセットされていればセッションに値を設定したら入力画面で入力した値が保持されるようになりました。
セレクトボックスではセッションの値と条件の値が一致すればOPTOIN要素にselectedを付けたタグをechoで表示させました。

(例)<td>
<select name="sample">
<option value=""></option>
<?php
for ($i = 1; $i <= 5; $i++){
if($i == $_SESSION["sample"]){
echo "<option value=\"" .$i. "\" selected>サンプル".$i. "</option>";
}else{
echo "<option value=\"" .$i. "\">サンプル".$i. "</option>";
}
}
?>
</select>
</td>

また、CSVも使えるようにしたプログラムと同様にデータベースからデータを取り出して、セレクトボックスにデータを追加して、セッションの値と条件の値が一致すればOPTOIN要素にselectedを付けたタグをechoで表示させた項目もありました。
(例)<td>
<select name="member">
<option value="-">-</option>
<?php
$res = $mysqli->query("SELECT `id`,`display_name` FROM `members` WHERE `section_id` = 6") or die(mysql_error());
while($row = mysqli_fetch_array($res, MYSQL_NUM))
{
if($row[0] == $_SESSION["member"]){
echo "<option value=\"".$row[0]."\" selected>".$row[1]."</option>";
}else{
echo "<option value=\"".$row[0]."\">".$row[1]."</option>";
}
}
?>
</select>
</td>

データを入力する時に、年月日を使うのですが、勤務表にサインをされる方からセレクトボックスを使うように言われました。
データを入力する項目は必須項目のものは無いので、空白の項目のデータを入力した時にエラーが発生したので、エラーが発生した項目の値(セレクトボックスで、何も選択されていない場合は"-")のセッションが"-"ならば、SQL文の項目にNULLを使い、そうでなければセッションを使いましたが、NULLとセッションの違いでSQL文を最初から最後まで分けて書かなければなりませんでした。(データベースからデータを取り出して、セレクトボックスにデータを追加して、セッションの値と条件の値が一致すればOPTOIN要素にselectedを付けたタグをechoで表示させた項目と同じ項目です)
トップページから詳細のページにジャンプする際のリンク先は
(例)echo "<td><form action=\"./stest2.php\" method=\"GET\" style = \"margin-bottom:0px\"><input type=\"submit\" value=\"詳細\" /><input type=\"hidden\" name=\"id\" value=\"" .$row[0]](トップページでデータベースから取り出したデータの値). "\"/></form></td>";
です。
詳細のページで$_GET["id"]の値を条件にデータベースからデータを取り出します。

トップページから編集のページにジャンプする際のリンク先は
(例)echo "<td><form action=\"./sedit.php\" method=\"GET\" style = \"margin-bottom:0px\"><input type=\"submit\" value=\"編集\" /><input type=\"hidden\" name=\"id\" value=\"" .$row[0]](トップページでデータベースから取り出したデータの値). "\"/></form></td>";
です。
編集のページで$_GET["id"]の値を条件にデータベースからデータを取り出します。
編集する時にもセッションを使うのですが、データを追加する時とは別の名前のセッションを使い、編集ボタンを押した直後(データを編集する時に検索ボタンをクリックしてデータベースからデータを検索する画面(データを追加する時とは別の画面)にジャンプしたかどうかを判断、データベースからデータを検索する画面でもデータを追加する時とは別の名前のセッションを使います)
編集ボタンを押した直後かどうかの判断は$_GET["id"]に値がセットされているかどうか判断
(前のトップページのhtmlの編集の箇所は
echo "<td><form action=\"./sedit.php\" method=\"GET\" style = \"margin-bottom:0px\"><input type=\"submit\" value=\"編集\" /><input type=\"hidden\" name=\"id\" value=\"" .$row[0](トップページでデータベースから取り出したデータの値). "\"/></form></td>";
)して、$_GET["id"]に値がセットされていれば、データベースの値をデータを表示させる変数にセットして、データを表示させる変数をセッションにセットして(年月日のデータの場合はデータベースのデータの方はDATEなのでsubstr関数で分ける。
(例)$syear = substr($row[7]](トップページでデータベースから取り出したデータの値), 0, 4);
$sm = substr($row[7]](トップページでデータベースから取り出したデータの値), 5, 2);
$sday = substr($row[7]](トップページでデータベースから取り出したデータの値), 8, 2);
$shour = substr($row[7]](トップページでデータベースから取り出したデータの値), 11, 2);
$smin = substr($row[7]](トップページでデータベースから取り出したデータの値), 14, 2);
データを入力した時に改行したデータ(textarea要素)を取り出す時にはstr_replace関数を使い、データベースのデータに空白があれば、</br>に置換して、データを表示させた時に改行されるようにします。
(例)$sample = str_replace("
", "", $row[17]トップページでデータベースから取り出したデータの値));

$_GET["id"]に値がセットされていなければ、セッションの値をデータを表示させる変数にセットします。(年月日のセッションの値はデータベースからデータを検索する画面でセットされます)
削除の処理はCSVも使えるようにしたプログラムと同様に$_GET["delete"]に値がセットされているかどうか判断して、データベースからデータを削除します。
詳細の画面ではトップページでデータベースから取り出したデータの詳細の画面にジャンプし、そのデータに更に複数のデータを追加したり、編集したり削除出来るようにして、データの詳細のページに追加した複数のデータを表示させるようにするのですが、年月日のデータを取り出す時は、YYYY-MM-DD形式で保存されているので、YYYY/MM/DD形式で表示させるためにstr_replace関数を使いました。
(例)$sample = str_replace("/", "-", $row[5]トップページでデータベースから取り出したデータの値))
データベースにデータを追加または編集する時もstr_replace関数を使います。
(例)str_replace("/", "-", $_SESSION["sample_date"])

勤務表にサインをされる方がまたデータを複数作成され、私がデータの詳細のほかに追加した複数のデータを表示させるようにしている途中で家に帰り、月曜日になって勤務表にサインをされる方がデータの詳細のほかに追加した複数のデータを表示の仕事を完成されました。
勤務表にサインをされる方は年月日の入力の時にJavaScriptでカレンダーで日付を入力出来るようにして欲しい、方法はインターネットで調べれば分かる、カレンダー以外の入力は受け付けないようにと言われたので私はインターネットで調べてJavaScriptでカレンダーで日付を入力出来るようにしようとしましたが、色が少しおかしかったので、ダウンロードしたプログラムを少し書き変えたら上手く行きました。
また、年月日を入力するinput要素にreadonly付け加えたらカレンダー以外の入力は受け付けないように出来ました。
詳細のページから追加のページにジャンプする際のリンク先は
(例)<a href=\"./sadd2.php?id=" .$_GET["id"]. "&model=".$machine_model](データベースから取り出したデータの値)."\">追加</a>です。
勤務表にサインをされる方がまた、データを複数入力するページでデータベースからデータを取り出して($_GET["model"]の値を条件にデータベースからデータを取り出します。)セレクトボックスにデータを追加をされていました。(セレクトボックスでは$_GET["model"]の値と$_GET["model"]の値を条件にデータベースからデータを取り出した値が一致すればOPTOIN要素にselectedを付けたタグをechoで表示させました。
)
データを追加するページで$_GET["id"]の値をセッションにセットし、
(例)$_SESSION["id"] = $_GET["id"];
$_GET["id"]の値はデータベースにデータを追加する時にも使い、データを追加したら詳細のページに戻ります。
その時に
(例)header("Location:stest2.php?id=" .$id);
$_SESSION["id"]の値が入っている変数は詳細のページでデータを取り出す時の条件で使います。

また、データの編集と削除は、削除はトップページのデータと同様に$_GET["delete"]に値がセットされているかどうか判断して、データベースからデータを削除します。
詳細のページから編集と削除のページにジャンプする際のリンク先は
(例)<td align = "center"><a href="sedit2.php?id=<?php echo $row[0](データベースから取り出したデータの値); ?>&model=<?php echo $machine_model; ?>&id2=<?php echo $_GET["id"]; ?>">編集</a> <a href="stest2.php?delete=<?php echo $row[0](データベースから取り出したデータの値); ?>&model=<?php echo $machine_model; ?>&id=<?php echo $_GET["id"]; ?>">削除</a></td>
です。
編集のページで$_GET["id"]の値を条件にデータベースからデータを取り出し、$_GET["id2"]の値をセッションにセットし、
(例)$_SESSION["id2"] = $_GET["id2"];
$_GET["model"]の値を条件にデータベースからデータを取り出し、セレクトボックスにデータを追加をし、(セレクトボックスでは$_GET["id"]の値を条件にデータベースからデータを取り出した値と$_GET["model"]の値を条件にデータベースからデータを取り出した値が一致すればOPTOIN要素にselectedを付けたタグをechoで表示させました。
編集するデータを変更したら、$_SESSION["id2"]の値を変数に入れ、詳細のページに戻ります。
(例)header("Location:stest2.php?id=" .$id2);
$_SESSION["id2"]の値が入っている変数は詳細のページでデータを取り出す時の条件で使います。
勤務表にサインをされる方は詳細のページでファイルを添付したいのでファイルを保管している場所のリンクを貼れるようにしました。
(例)<a href="<?php echo "file:". str_replace("\\", "/", $row[19]); ?>"><?php echo $row[19]]](トップページでデータベースから取り出したデータの値), ; ?></a>
また、データベースからデータを追加または編集するときにはファイルのパスの"\\"を"\\\\"に置き換えました。
(例)`path` = '".str_replace("\\", "\\\\", $_SESSION["path"])."'

勤務表にサインをされる方はトップページの下に、トップページにで表示されているデータをセレクトボックスで検索が出来ないかと言われ、CSVも使えるようにしたプログラム勤務表にサインをされる方がデータベースからデータを取り出して、セレクトボックスにデータを追加して、JavaScriptでセレクトボックスで選択された値だけが表示されるようにしていましたが
、ソースコードを見ると難しそうでしたが、ソースコードをじっくりと読むとセレクトボックスの値を変更するとJavaScriptの関数の動作が行われ、JavaScriptの関数の引数はTABLEタグのid属性とセレクトボックスで選択された値で、JavaScriptの箇所でセレクトボックスを変更した時に発生した関数を受け取り、最初に行の数を数え、それを配列の変数として、配列の数だけ処理を繰り返します。
繰り返す処理はセレクトボックスの値とTRタグのtitle属性の値(配列の値を引数にしてデータベースからデータを表示させる関数)が一致していたら行を表示させます。
しかし、この方法だと行の値なので表の1つの値でしか検索出来ないのです…。
私は、列の値とデータベースの値が一致してればデータを表示させるようにすればいいと思い、インターネットでJavaScriptで表の列の値を調べる方法を調べ、セレクトボックスで検索が出来るようにしました。
(例)JavaScriptの箇所
function tblfilter(nm,key){
if(!document.getElementsByTagName) return;
var trs = document.getElementById(nm).rows;
//タイトルは検索しない
for(var i=1; i var tr = trs[i];
var found=0;
//空白なら検索しない
if(key == '') found=1;
else {
var keys = tr.cells[0].innerText.split(',');
for(var j=0; j if(keys[j] == key){ found=1; break; }
}
}
tr.style.display = found?'':'none';
}
}

htmlの箇所
<select onchange="tblfilter('ex1',this.options[this.selectedIndex].value);">

セレクトボックスで何も選択されていない場合の値がallの場合は少し異なります。
(例)JavaScriptの箇所
function tblfilter2(nm,col,key){
if(!document.getElementsByTagName) return;
var trs = document.getElementById(nm).rows;
//タイトルは検索しない
for(var i=1; i var tr = trs[i];
var found=0;
//allなら検索しない
if(key == 'all') found=1;
else {
var keys = tr.cells[col].innerText.split(',');
for(var j=0; j if(keys[j] == key){ found=1; break; }
}
}
tr.style.display = found?'':'none';
}
}

htmlの箇所
<select onchange="tblfilter2('ex1',2,this.options[this.selectedIndex].value);">

年月日の箇所は年と月で検索出来るようにし、データベースからデータを取り出すSQL文でもSUBSTRを使いました。
(例)$res = $mysqli->query("SELECT DISTINCT SUBSTR(`occur_time`, 1, 7) FROM `sample` ORDER BY `occur_time`") or die(mysql_error());

(例)JavaScriptの箇所
function tblfilter3(nm,col,key){
if(!document.getElementsByTagName) return;
var trs = document.getElementById(nm).rows;
//タイトルは検索しない
for(var i=1; i var tr = trs[i];
var found=0;
//allなら検索しない
if(key == 'all') found=1;
else {
var keys = tr.cells[col].innerText.split(',');
for(var j=0; j if(keys[j].substr(0, 7) == key){ found=1; break; }
}
}
tr.style.display = found?'':'none';
}
}

htmlの箇所
<select onchange="tblfilter3('ex1',5,this.options[this.selectedIndex].value);">

この仕事は9/30迄でしたが、4/1に顔合わせをされた偉い方が余裕を持ちたいので9/20の周で終わらせるようにおっしゃり、勤務表にサインをされる方がExcelのレポートを作成する箇所を作られ、何とかこの仕事を終わらせる事が出来ました。

テーブル内の空白指定方法
http://soudan1.biglobe.ne.jp/qa479301.html

1つのForm内で複数のSubmitボタンを配置して遷移先を指定したい。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1425816159

[JavaScript] JKL.Calendar/ポップアップするカレンダー表示クラス
http://www.kawa.net/works/js/jkl/calender.html

JavaScriptでtableタグをスクレイピングして値を取り出す方法
http://d.hatena.ne.jp/replication/20100209/1265734486
PR
葉ぼたんの花が咲きました。
見上げたところです。
mysqli関数を使っていたので、家に帰って、前に家でPHPでmysqlを使うプログラムを勉強していたので、インターネットや本で調べてmysqliを使ってみたら上手く行きました。

<html>
<head>
<meta http-equiv="Content-type"
content="text/html; charxet=euc-jp">
<title>MYSQLi データの表示</title>
</head>
<body>
<?php
//------------------------------------------------------------
//□ サーバに接続
//------------------------------------------------------------
$my_Con = new mysqli("localhost", "user", "password", "database")
or die("データベースとの接続に失敗しました");

$my_Con->set_charset("UTF-8");

$stmt = $my_Con->prepare("INSERT INTO friends (no, name, birth, email) VALUES (?, ?, ?, ?);")
or exit("prepare errorn");
$stmt->bind_param("isss(プリペアドステートメントで使われる変数(?の箇所の型、iは整数、sは文字列))", $no, $name, $birth, $email);
$no = 8;
$name = "テスト";
$birth = "1970-10-21";
$email = "test@test.co.jp";
$stmt->execute() or exit("bind errorn");
echo $stmt->affected_rows ."行追加されました。
";


$no = 9;
$name = "テスト";
$birth = "1970-10-22";
$email = "test@test.co.jp";
$stmt->execute() or exit("bind errorn");
echo $stmt->affected_rows ."行追加されました。
";
//------------------------------------------------------------
//□ テーブルからデータを読む
//------------------------------------------------------------
$stmt = $my_Con->prepare("SELECT * FROM friends")
or exit("prepare errorn");
$stmt->execute() or exit("bind errorn");
$stmt->bind_result($result_id_no, $result_name, $result_birth, $result_email);

while ($stmt->fetch()) {
echo $result_id_no;
echo $result_name;
echo $result_birth;
echo $result_email;
echo "<br>";
}

?>
</body>
</html>

<html>
<head>
<meta http-equiv="Content-type"
content="text/html; charxet=euc-jp">
<title>MYSQLi データの表示</title>
</head>
<body>
<?php
//------------------------------------------------------------
//□ サーバに接続
//------------------------------------------------------------
$my_Con = new mysqli("localhost", "user", "password", "database")
or die("データベースとの接続に失敗しました");

$my_Con->set_charset("UTF-8");

$stmt = $my_Con->prepare("UPDATE friends SET name = ?, birth = ?, email = ? WHERE no = ?;")
or exit("prepare errorn");
$stmt->bind_param("sssi", $name, $birth, $email, $no);
$name = "テスト変更";
$birth = "1970-10-22";
$email = "henkou@test.co.jp";
$no = 8;
$stmt->execute() or exit("bind errorn");
echo $stmt->affected_rows ."行変更されました。
";


//------------------------------------------------------------
//□ テーブルからデータを読む
//------------------------------------------------------------
$stmt = $my_Con->prepare("SELECT * FROM friends")
or exit("prepare errorn");
$stmt->execute() or exit("bind errorn");
$stmt->bind_result($result_id_no, $result_name, $result_birth, $result_email);

while ($stmt->fetch()) {
echo $result_id_no;
echo $result_name;
echo $result_birth;
echo $result_email;
echo "<br>";
}

?>
</body>
</html>

<html>
<head>
<meta http-equiv="Content-type"
content="text/html; charxet=euc-jp">
<title>MYSQLi データの表示</title>
</head>
<body>
<?php
//------------------------------------------------------------
//□ サーバに接続
//------------------------------------------------------------
$my_Con = new mysqli("localhost", "user", "password", "database")
or die("データベースとの接続に失敗しました");

$my_Con->set_charset("UTF-8");

$stmt = $my_Con->prepare("DELETE FROM friends WHERE no = ?;")
or exit("prepare errorn");
$stmt->bind_param("i", $no);
$no = 9;
$stmt->execute() or exit("bind errorn");
echo $stmt->affected_rows ."行削除されました。
";


//------------------------------------------------------------
//□ テーブルからデータを読む
//------------------------------------------------------------
$stmt = $my_Con->prepare("SELECT * FROM friends")
or exit("prepare errorn");
$stmt->execute() or exit("bind errorn");
$stmt->bind_result($result_id_no, $result_name, $result_birth, $result_email);

while ($stmt->fetch()) {
echo $result_id_no;
echo $result_name;
echo $result_birth;
echo $result_email;
echo "<br>";
}

?>
</body>
</html>

7月からの仕事のプログラムではmysqliでデータベースからデータを取り出す時にmysqli_fetch_arrayという関数を使っていますが、

(例)$res = $mysqli->query(SQL文 or die((mysql_error());
$row = mysqli_fetch_array($res, MYSQL_NUM))


die()関数が気になり、本で調べたり、インターネットで調べるとPHPスクリプトを終了すると書かれていました。
mysql_error()関数も気になり、本で調べたり、インターネットで調べると直近のMYSQLの操作からエラーメッセージを取得と書かれていました。
MYSQL_NUMも気になり、本で調べたり、インターネットで調べると「数値添字のみが 取得されます。」と書かれていました。

(例)<?php
mysql_connect("localhost", "mysql_user", "mysql_password") or
die("Could not connect: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT id, name FROM mytable");

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
printf("ID: %s Name: %s", $row[0], $row[1]);
}

mysql_free_result($result);
?>



mysqliの使い方(1)
http://php.studynet.jp/basic/mysql%e3%81%8b%e3%82%89mysqli%e3%81%b8%e3%81%ae%e7%bd%ae%e3%81%8d%e6%8f%9b%e3%81%88%ef%bc%88%ef%bc%91%ef%bc%89

mysqliでプリペアドステートメント
http://php-meomo.seesaa.net/article/151350420.html

プリペアドステートメントおよびストアドプロシージャ
http://php.net/manual/ja/pdo.prepared-statements.php

MySQL 改良版拡張モジュール
http://php.net/manual/ja/book.mysqli.php

PHPスクリプトを終了する( exit()、die() )
http://www.php-ref.com/basic/01_exit.html

mysql_error
http://php.net/manual/ja/function.mysql-error.php

mysql_fetch_array
http://php.net/manual/ja/function.mysql-fetch-array.php

統合したポータルサイトのトップページのお知らせとスケジュールにリンクを貼れないかと聞かれたので、私は試しに<a>要素を使い、リンクを貼ってみたら上手く行ったので4/1に顔合わせをされた偉い方にリンクを貼ったら上手く行ったと言いましたが、4/1に顔合わせをされた偉い方はリンクだと分からないようにして欲しいと言われたので、私はリンクを貼っても一見、ほかの文字と見分けが付かないようにし、マウスをリンクの箇所に持って行った時だけアンダーバーが表示されるようにしました。
トップページの下のフレームのCSSの箇所(お知らせとスケジュールは表示される日付によって文字の色が変わるのでそれにあわせてCSSの箇所も追加しました)とお知らせとスケジュールのhtmlを表示させる文字列を配列に入れる箇所を変更したら上手く行きました。

トップページの下のフレームのCSSの箇所
.link a{text-decoration:none}
.link a{color:#000000;}
.link a{color:#000000;}
.link a:hover{text-decoration: underline;}

.link2 a{text-decoration:none}
.link2 a{color:#4A83EC;}
.link2 a{color:#4A83EC;}
.link2 a:hover{text-decoration: underline;}

お知らせとスケジュールのhtmlの箇所
html
配列に入れる表示させる文字列を<span class=\"link\"></span>
または<span class=\"link2\"></span>
で囲む
正面から撮りました。
上野恩賜公園と書かれています。
まずは勤務表にサインをされる方からPHPでCSVファイルを読み込むようにと言われたので、私はPHPでCSVファイルを読み込む方法が分からないと言うと、勤務表にサインをされる方はインターネットで調べるようにとおっしゃりました。
私はインターネットで調べ、PHPでCSVファイルを読み込んでみたら上手く行きました。
勤務表にサインをされる方が実際に使っているCSVファイルを見せられ、データがいくつか重複しているので、重複しないように読み込むように、重複しないデータを表示させて、左側にラジオボタンを付けて、選択したデータをもとに更にデータを絞り込んで、絞り込んだデータも重複させないようにと言われましたが、私はしばらくしてデータを重複させないようにという意味が分からなくなったので、勤務表にサインをされる方に聞くと、勤務表にサインをされる方はCSVファイルをExcelで開かれ、データが重複している列を選択され、ツールバーのデータ→フィルタ→フィルタオプションの設定→フィルタオプションの設定で重複するレコードは無視するをチェック→OKでデータの重複がなくなりました。
元に戻す場合はツールバーのデータ→フィルタ→フィルタオプションの設定→フィルタオプションの設定で重複するレコードは無視するはチェックしない→OKで元に戻ります。
私は意味が分かったので、PHPでどう処理するか考えました。
まず、CSVファイルのデータの量はいつも同じではないので、PHPで要素数の決まっていない配列が使えるかどうか調べました。
まず、九九を表示させるプログラムを作る事にしました。
普通の2次元配列と要素数の決まっていない2次元配列を定義して、普通の2次元配列に九九の値を代入して普通の2次元配列を表示させ、次に要素数の決まっていない2次元配列に九九の値を代入して要素数の決まっていないを表示させたら上手く行きました。
foreachで2次元配列が使えるかどうかも調べたら上手く行きました。

<html>
<head>
<meta http-equiv="Content-type"
content="text/html; charset=utf-8">
<title>九九を表示</title>
</head>
<body>
<?php
//普通の2次元配列
$test[9][9];
//要素数の決まっていない配列
$test2 = NULL;
for ($i= 1; $i <=9; $i++){
for ($j= 1; $j <=9; $j++){
$test[$i-1][$j-1] = $i * $j;
}
}

for ($i= 1; $i <=9; $i++){
for ($j= 1; $j <=9; $j++){
echo $test[$i-1][$j-1] . " ";
}
echo "<br>";
}

echo "<br>";

for ($i= 1; $i <=9; $i++){
for ($j= 1; $j <=9; $j++){
$test2[$i-1][] = $i * $j;
}
}

for ($i= 1; $i <=9; $i++){
for ($j= 1; $j <=9; $j++){
echo $test2[$i-1][$j-1] . " ";
}
echo "<br>";
}


echo "<br>";

//foreachで表示
foreach ($test2 as $key=>$value){
foreach ($value as $key2=>$value2){
echo $value2 . " ";
}
echo "<br>";
}

?>
</body>
</html>

CSVのデータを1行読み込み、データが重複しているか確認する変数($nflag)を0にして、データを1列ずつ読み込み、データを重複させない列になったら、データが重複しているかどうか調べるために、CSVの値が、重複していないデータ(ラジオボタンと一緒に表示させるデータ、要素数が決まっていない配列)に存在するか調べます。(要素数が決まっていない配列の数まで繰り返します)
存在したら$nflagを1にしてbreakでループを抜け出します。
CSVの値が重複していなければ($nflagが0ならば)CSVの値を要素数の決まっていない配列に追加し、またCSVのデータを1行読み込みます。
ラジオボタンと要素数の決まっていない配列を表示させ、ラジオボタンでデータを選択し、「次へ」ボタンをクリックし、1つ目のページでラジオボタンが選択されているか判断し、選択されていなければ、exitで処理を中断します。
選択されていれば選択した値をもとにしたデータを表示させるページ(2つ目のページ)にジャンプし、また同じ処理を行うのですが、今度は最初に1つ目のページで選択した値とCSVファイルの値が一致しているものを2次元配列に入れる為に2次元配列の1次元目の配列の添字が必要なので、添字($j)を0にします。
次に、CSVのデータを1行読み込む処理でデータを1列ずつ読み込み、1つ目のページと同じデータを重複させない列になったら1つ目のページで選択した値と一致していれば2次元配列にCSVの1行の全てのデータを入れ、$jの値を1つ増やし、またCSVのデータを1行読み込みます。
次に、セッションに2次元配列をセットし、2次元配列をもとにforeach文を使い、データが重複しているかどうか調べるために、データが重複しているか確認する変数($nflag)を0にして、データを1列ずつ読み込み、1つ目のページと同じように2次元配列でデータを重複させない列になったら、データが重複しているかどうか調べるために、2次元配列の値が、重複していないデータ(ラジオボタンと一緒に表示させるデータ、要素数が決まっていない配列)に存在するか調べます。(要素数が決まっていない配列の数まで繰り返します)
存在したら$nflagを1にしてbreakでループを抜け出します。
2次元配列の値が重複していなければ($nflagが0ならば)2次元配列の値を要素数の決まっていない配列に追加します。
ラジオボタンと要素数の決まっていない配列を表示させ、ラジオボタンでデータを選択し、「次へ」ボタンをクリックし、選択した値をもとにしたデータを表示させるページ(3つ目のページ)にジャンプし、2つ目のページで設定したセッションを取り出して2次元配列にセットし、2つ目のページと同じように2つ目のページで選択した値とセッションをセットした2次元配列の値が一致しているものを別の2次元配列に入れる為に別の2次元配列の1次元目の配列の添字が必要なので、添字($k)を0にします。
次に、セッションをセットした2次元配列のデータを読み込む処理で2つ目のページと同じデータを重複させない列になったら2つ目のページで選択した値と一致していれば別の2次元配列にセッションをセットした2次元配列の1次元目の配列の全てのデータを入れ、$kの値を1つ増やし、またセッションをセットした2次元配列のデータを1行読み込みます。
次に、チェックボックスと別の2次元配列を表示させます。
この作業を行っていると勤務表にサインをされる方が来られて、大分進んだようなので、選択した値をもとにCSVファイルを書き換えるように言われました。
今までの作業は私のPCで行っていたので、今までの作業のプログラムを7月からの仕事のプログラムと同じサーバーにアップロードしましたが、文字化けが発生してしまいました…。
インターネットで調べ、文字化けを解決する事が出来ました。
私はPHPでCSVファイルを出力出来るかどうか本で調べてみたら上手く行きました。

<html>
<head>
<meta http-equiv="Content-type"
content="text/html; charset=utf-8">
<title>CSV</title>
</head>
<body>
<?php
$csvFile = "test.csv";
$csvData = "";
for ($i = 0;$i < 5; $i++){
$csvData .= $i. ','
. "サンプル$i-1,"
. "サンプル$i-2,"
. "サンプル$i-3\n";
}
$fp = fopen($csvFile, 'wb');
flock($fp, LOCK_EX);
ftruncate($fp, 0);
fwrite($fp, mb_convert_encoding($csvData, "sjis-win", "utf-8"));
fclose($fp);
echo "csvファイルが作成されました。";

//作成されたcsvファイルを読み込む
$csv = "test.csv" ;
$buf = mb_convert_encoding(file_get_contents($csv), "utf-8", "sjis-win") ;
$fp = tmpfile();
fwrite($fp, $buf);
rewind($fp);
echo '<table border=1>';
while( ( $lines = fgetcsv( $fp ) ) !== FALSE ){
echo '<tr>';
for( $i = 0; $i < count( $lines ); $i ++ ){
echo '<td>' . $lines[$i] . '</td>';
}
echo '</tr>';
}
echo '</table>';
?>
</body>
</html>

今度はPHPで出力されたCSVファイルを変更出来るかどうか試してみたら上手く行きました。
また、7月からの仕事のプログラムではmysqli関数を使っていたので前にmysqli関数を勉強していました。
<html>
<head>
<meta http-equiv="Content-type"
content="text/html; charset=utf-8">
<title>CSV</title>
</head>
<body>
<?php
$csvFile = "test.csv";
$csvData = "";
for ($i = 0;$i < 5; $i++){
$csvData .= $i. ','
. "変更$i-1,"
. "変更$i-2,"
. "変更$i-3\n";
}
$fp = fopen($csvFile, 'wb');
flock($fp, LOCK_EX);
ftruncate($fp, 0);
fwrite($fp, mb_convert_encoding($csvData, "sjis-win", "utf-8"));
fclose($fp);
echo "csvファイルが変更されました。";

//変更されたcsvファイルを読み込む
$csv = "test.csv" ;
$buf = mb_convert_encoding(file_get_contents($csv), "utf-8", "sjis-win") ;
$fp = tmpfile();
fwrite($fp, $buf);
rewind($fp);
echo '<table border=1>';
while( ( $lines = fgetcsv( $fp ) ) !== FALSE ){
echo '<tr>';
for( $i = 0; $i < count( $lines ); $i ++ ){
echo '<td>' . $lines[$i] . '</td>';
}
echo '</tr>';
}
echo '</table>';
?>
</body>
</html>

ファイルを書き換えるページにジャンプしたら

今度はforecahを使い、選択した値を表示させ、選択した値をセッションに設定して、選択した値をもとにファイルを書き換える処理をするページにジャンプするようにしました。

(例)//値が選択された場合
$i = 1;
if (count($_POST["sample"]) > 0){
foreach($_POST["sample"] as $key=>$value){
echo "サンプル:" .$_POST["sample"][$key] . " サンプルA:" .$_POST["samplea"][$key] . " サンプルB:" .$_POST["sampleb"][$key] . "<br>";
$_SESSION["sample". $i] = $_POST["sample"][$key];
$_SESSION["samplea". $i] = $_POST["samplea"][$key];
$_SESSION["sampleb". $i] = $_POST["sampleb"][$key];
$i++;
}
}

header("Location:ファイルを書き換える処理.php");

ファイルを書き換える処理のページでファイルを書き換えようとしたらFatal error: Allowed memory size ofとかいうメッセージが表示されてファイルを上手く書き換える事が出来なかったのでインターネットで調べてini_set("memory_limit","32M");を追加したら上手く行きましたが、今度はパーミッションの設定でファイルを上手く書き換える事が出来なかったので、勤務表にサインをされる方にファイルのパーミッションの設定をしてもらったら上手く行きました。
まずは、ファイルを書き換えるデータを2次元配列に入れる為に2次元配列の1次元目の配列の添字が必要なので、添字($j)を0にします。
次に、CSVのデータを1行読み込んだらセッションに設定した値とCSV値が一致しているというフラグ($sflag)を0にし、データを1列ずつ読み込み、ファイルを書き換えるデータを入れる2次元配列にCSVファイルの値を入れ、CSVの比較したい列になったらセッションに設定した値とCSVの値を比較し、一致したら$sflagを1にして、CSVの書き換えたい列になったら、$sflagが1の場合はファイルを書き換えるデータを入れる2次元配列に書き換えたい値を入れ、$sflagが0の場合はファイルを書き換えるデータを入れる2次元配列にCSVファイルの値を入れ、$kの値を1つ増やし、またCSVのデータを1行読み込みます。
次に、ファイルを書き換えるデータを入れる2次元配列をもとに、ファイルを書き換えるデータをCSVで出力出来るようにし、CSVで出力出来る変数にセットしCSVで出力出来る変数をもとにCSVを出力します。
ファイルの書き換えが上手く行ったと勤務表にサインをされる方に言うと、今度は3つ目のページでファイルが書き換わった事が分かるようにして欲しいと言われたので、チェックボックスと別の2次元配列を表示させるしょりで、foreachを使っていたのをforに変更し、ファイルが書き換わった箇所の色を変え、が書き換わった箇所のhtmlをdisabledにしてチェックボックスをクリック出来ないようにして勤務表にサインをされる方に見せると、勤務表にサインをされる方はチェックボックスをクリック出来るようにして欲しいとおっしゃったので、私はファイルが書き換わった箇所のチェックボックスをクリック出来るようにして、ファイルが書き換わった箇所のチェックボックスをクリックしたらメッセージが表示されるようにして、勤務表にサインをされる方に見せると、勤務表にサインをされる方は、チェックボックスをオフにしてもメッセージが表示されるとおっしゃったので私はチェックボックスにチェックを付けた時だけだけチェックボックスをクリックしたらメッセージが表示されるようにしました。
統合したポータルサイトのトップページの上のフレームのプルダウンメニューを切り替えた時の下のフレームの左側のフレームをJavaScriptで実現したプルダウンを参考にしました。

3つ目のページ
JavaScriptの箇所
function checkMessage(checkID){
if(document.getElementById(checkID).checked){
alert('test');
}
}

htmlの箇所
echo "<td><input type=\"checkbox\" name=\"sample". "[". $i(2次元配列の1次元目の配列の添字) ."]" ."\" value=\"".mb_convert_encoding($value2, "UTF-8", "SJIS")."\" id=\"$i
(2次元配列の1次元目の配列の添字)\" onClick=\"checkMessage($i(2次元配列の1次元目の配列の添字))\" disabled/></td>". '<td>' .mb_convert_encoding($value3, "UTF-8", "SJIS"). '</td>';

その時には勤務表にサインをされる方は8/16迄夏休みだったのですが、勤務表にサインをされる方におっしゃられた事、7月からの仕事のプログラムに今まで作ったプログラムのリンクを貼り、CSVで使えるようにしましたが、CSVで追加したデータが7月からの仕事のプログラムに反映されなかったので、7月からの仕事のプログラムを見てみると
session_name(セッション名);
session_start();
session_name();
とあったので、インターネットで調べてみると、session_name()関数という、セッション名を取得、設定する関数が使われていたので、7月からの仕事のプログラムと同じようにセッションを設定したら上手く行きました。
7月からの仕事のプログラムではmysqli関数を使っていたので、前にmysqli関数の勉強をしていました。
7月からの仕事のプログラムではmysqli関数をトップページにデータベースのデータを表示させたり、セッションの値を引数にしてデータベースからデータを表示させる関数や、入力したデータをデータベースに追加する時や、伝票をExcelで表示させる時に使っていたりしていました。
私はそれらもCSVで使えるようにしました。
セッションの値を引数にしてデータベースからデータを表示させる関数を使っているページで入力したデータを削除したい場合はセッションをNULLにしていました。
セッションの値を引数にしてデータベースからデータを表示させる関数では入力データがデータベースのデータ(従来の方法)の引数は数字なので、is_numeric関数という変数が数字または数字文字列かをチェックする関数を使い、is_numecirがtrueの場合(入力データがデータベースのデータ(従来の方法))はデータベースからデータを表示させ、is_numecirがfalseの場合(入力データがCSV)は引数をそのまま表示させます。
勤務表にサインをされる方が入力したデータをデータベースに追加する時にCSVにも対応出来るように入力したデータを追加するテーブルに列を追加されました。
伝票をExcelで表示させる作業ではデータベースのデータを配列に入れて、配列の値を引数にしてデータベースからデータを表示させる関数を使いましたが、伝票をExcelで表示させるプログラムの1番上に
require_once("データベースからデータを表示させる関数.php(セッションの値を引数にしてデータベースからデータを表示させる関数を使っているプログラムで使用)");
と書いて、セッションの値を引数にしてデータベースからデータを表示させる関数とは少し違う処理をするのでをデータベースからデータを表示させる関数.phpに新たに関数(同じファイルなので違う名前の関数)を追加しようとしましたが、上手く行かなかったの(データベースからデータを表示させる関数.phpに似たようなほかの関数が入っていましたが、それらの関数では上手く行っていました)で、新たにデータベースからデータを表示させる関数2.phpを作成し、そこにデータを表示させる関数.phpと同じ名前の関数を書き、伝票をExcelで表示させるプログラムの1番上にrequire_once("データベースからデータを表示させる関数2.php");
と書いたら上手く行きました。
追加したデータの一部を編集するページでもデータベースのデータを配列に入れて、配列の値を引数にしてデータベースからデータを表示させる関数を使っており、このページでデータを削除する場合のリンク先は同じページで、
(例)データを削除する場合のリンク先
<a href="./データの一部を編集するページ.php?delete=<?php echo $id; ?>&id=<?php echo $dash_id; ?>">削除</a>

データを削除する場合のリンク先をクリックしたかどうかを判断するには$_GET["delete"]に値がセットされているかどうか判断して、CSVファイルを書き換え、データベースからデータを削除します。
また、入力したデータを追加する時に、mysqli->insert_idという直近のクエリで使用した自動生成の ID を返すものを使っていました。(SQL文ではIDを追加する箇所ではNULLが使われていました)
mysqli->insert_idは別のデータベースにもデータを追加する時に使います。
伝票をExcelで表示させる作業ではPHPExcelを使っていて、PHPExcelの修正作業は伝票に追加するデータを増やす作業なのですが、6/4に買ったPHPでExcelを使う本にもPHPExcelの事は載っていましたが、6/4に買ったPHPでExcelを使う本を読まなくても修正作業は上手く行きました。
その後、今まで作ったプログラムのデザインを7月からの仕事のプログラムに合わせる為にCSSファイルを使いました。

htmlの箇所
<LINK href="./css/style.css" rel="stylesheet" type="text/css">

CSVの入力データが変わるとまたFatal error: Allowed memory size ofとかいうメッセージが表示されたのでini_set("memory_limit","64M");にしたら上手く行きました。
追加したデータの一部を編集するページが開かれた時にCSVファイルが書き換わってしまい、いつもページが開くのが遅くなってしまうのでCSVでデータを追加した時だけCSVファイルを書き換えるようにしました。
しばらくして、CSVの入力データの列の数が変わってしまったのでそれに合わせて勤務表にサインをされる方がプログラムを修正して下さり、私もそれとは別に勤務表にサインをされる方からプログラムの修正を頼まれたのでプログラムの修正をしました。
CSVファイルを読み込んで表示させるプログラムで1つ目のページから3つ目のページにジャンプ、つまり、1つ目のページで選択した値をもとにしたデータを表示させるようにしました。
勤務表にサインをされる方は3つ目のページ(追加したデータの一部を編集するページにもあります)にデータベースからデータを取り出して、セレクトボックスにデータを追加して、JavaScriptでセレクトボックスで選択された値だけが表示されるようにしていました。


CSVの読み書き
http://kumicyou.sakura.ne.jp/php/csv.html

制御構造 - foreach
http://www.phppro.jp/phpmanual/php/control-structures.foreach.html

Webにまつわるエトセトラ
http://m-nak.jp/?tag=php

PHPで「Fatal error: Allowed memory size of 8388608 bytes exhausted」エラーが出た
http://colorsk.exblog.jp/13208026/

session_name
http://php.net/manual/ja/function.session-name.php

mysqli->insert_id - 直近のクエリで使用した自動生成の ID を返す
http://phpspot.net/php/man/php/mysqli.insert-id.html

PHPExcelのちょっとつかえる小技
http://blog.asial.co.jp/595

PHP/PHPExcel
http://yakinikunotare.boo.jp/orebase/index.php?PHP%2FPHPExcel#m8ab08d8

PHPExcel の使い方
http://blog.syuhari.jp/archives/1621
ドラマでは病院に運ばれた患者の顔が包帯でグルグル巻きにされていて、顔が分からず、「先生、元の世界に戻るぜよ」と言っていたので患者は坂本龍馬だと思っていましたが、原作では顔をボコボコにされていましたが、包帯を巻いておらず、主人公に似ていたのでエッ?何か違うと思いました。
前のページ      次のページ
Powered by Ninja Blog    template by Temp* factory    icon by MiniaureType

忍者ブログ [PR]