第1章 動作環境の構築

1.1 XAMPPをインストールする
1.1.5 XAMPPコントロールパネルの操作
ApacheとMySqlの右にある開始ボタンをクリック - メッセージに起動と表示され、開始のボタンが停止に変化 - http://localhost/と入力

1.2 開発環境を整える
1.2.3 文字化けの回避 - PHPのファイルをEUC形式に統一する
- PHPのProgram Levelで変換 する - mb_convert_encoding関数を使って、DATAを読み込んだ後にShift-JISに変換してから表示する
- HTMLレベルの表記で対応する - <META>タグでEUCを明記 <META http-equiv="" content="text/html; charset=EUC-JP"> - C:\xampp\phpにあるphp.iniで文字コードを変更できる
- 文字コードに関する注意事項 - PHPコードだけのスクリプトについては、ブラウザのエンコードを日本語(EUC)または日本語(自動選択)に切り替えること

第2章 PHPの基礎

2.1 PHPとは

2.2 PHPプログラムの基本
2-2-1 PHPスクリプトの宣言 - smp2-01.php - date.phpをsampledbのフォルダに作成、呼び出し用に2hidden.htmlを新たに作成

Column - 3種類のエラー - 文法エラー このエラーはプログラムが実行前に表示されるので、スクリプトは実行されず、エラーメッセージだけが表示される
- 実行時エラー プログラムが実行されて初めてエラーが発生するので、処理は実行されたり、DBすべての処理がエラーになるので、表示されたエラーから上のところをcheckする
- 論理的エラー 計算式がまちがっている場合などに起こるので、エラーは出ないが、結果が間違うので、実際にテストして、問題を確認しておくこと

2-2-4 変数 - $を付ける、先頭は数字を使わない、変数名の大文字と小文字は区別される、データ型の制約がないので、文字、整数、小数点などを代入できる - smp2-08.php - hensuu.html/phpで2つの値を送って計算するアプリを作製

2-2-5 数値の演算 - 加算子/減算子 - ++、-- smp2-14.php - suuchi.htmlとphpで試す、説明書きの$aが数値に変わってしまうが、それもまたおもしろい結果であると思われる

2-2-6 文字列の扱い方 - ""で囲む、改行を入れて複数行も可、文字として"を出力するときは\"とする、.(ピリオッド)を入れて並べると連結できる、.=(ピリオッドとイコール)で左の変数に代入されている文字列の後ろに、右の文字列/変数に代入した文字列を結合できる、タグの属性は'(シングルクォーテーション)もしくは\"で囲んで文字列の囲みと区別する - smp2-15.php
- 変数と文字列のドッキング - 文字列の結合は.を使う方法と、文字列に変数を含ませる方法があるが、うまく動作しなければ.を使う方法に変えること - mojiretsu.html/phpで送付ができるようにした、EUCになっているのでUTF-8に変更しないと文字化けする

Column - PHPの特殊記号 - \t-タブ、\n-改行、\\-\を文字として表現、\$-$を文字として表現

2.3 条件分岐
2-3-1 if文による条件分岐 HTMLを含むif文 - smp2-20.php - { の代わりに:(コロン)を置き最後にendif;書いて } の代わりにする -> smp2-21.php -

Column - 条件分岐のネストと記号の位置 - 入れ子(ネスト)にするとphpのみで記述できる - smp2-19.php - if_nest.html/phpを試す、htmlはUTF-8でphpはSJISで作っているが、問題なく表示される

2-3-2 比較演算子 - smp2-23,24.php - 文字列を""で囲んで変数の内容と比較する - if_hikaku.html/phpで試すが、文字化けするので、EUCからUTF-8に統一、ただ不一致のときはなにも返さないのであまり使い道はなし

2-3-3 論理演算子 - andまたは&&(論理積)、orまたは||(論理和)、!(否定)、xor(排他的論理和) - smp2-25.php - if_ronrishi.html/phpで試す、数値なので""で囲まなくてもよい、当てはまらないものはなにも返さないので、もう一つ役には立たないのではないか

2-3-4 三項演算子 - smp2-22.php - 条件に応じた値の代入をシンプルに表現できるが、真偽それぞれの別の命令分を実行することはできない - if_sankou.html/phpを試すが、ifを使わず、値の結果をシンプルに表示できるのが特徴

2-3-5 switch文 - smp2-26.php - 複数の条件式によって処理を分岐させることができる - if_switch.html/phpを試すが、文章の入力の多さに比べて、反応が簡単すぎてあまり使い道はない。

2.4 ループ処理
2-4-1 for文 - for(カウンター初期値; ループ続行条件; カウントアップ式) { - 命令文; - : - } - smp2-27.php - 命令文に*= 2になっているのでこれも変えられるともっと有効であるがとりあえずroop_for.html/phpを試す、ただしphpのほうはEUCからUTF-8に変えないと文字化けするようだ - 100を超えたときにbreakする - smp2-28.php

2-4-2 while文 - while ( ループ続行条件 ) { - 命令文; - } - smp2-29.php - 1回のループが完了すると先頭に戻って$cnt<=10が真であるかどうか評価される。 真ならばwhile文の中の処理が実行され、偽になればループを抜けて次の行へ進む - 上とまったく同じ結果であるが、プログラムの構成は分かりやすいので、roop_while.html/phpを作製する

2-4-3 do〜while文 - 最後にループ続行条件を評価するので、最低1回はループ処理を行うので使いわけに注意が必要 - smp2-30.php - roop_dowhile.html/phpを試すが、初めのcntが20になっているので、while文と合わないで一回実行してループの終了へ進んでいる

Column - ループ処理のネスト - 外側のループで行方向の<TR>タグを、内側のループで列方向の<TD>タグを制御 - smp2-31.php - これはDBで一番使うので、roop_nest.phpで例題として上げておく

2.5 関数
2-5-1 関数とは? -

2-5-2 関数の使い方 - 変数 = 関数名 (引数1, 引数2, ....); または print 関数名 (引数1, 引数2, ....); またこの応用として print 関数1 ( 関数2 ( 引数1 ) ); もできる

2-5-3 PHPの数学関数 - func_triple.html/phpで32〜36の各関数を一つのアプリにまとめて表示させる
- abs関数 - 引数の絶対値を返す(引数は任意の数値) - smp2-32.php
- ceil関数 - 引数の小数点以下を切り上げた整数値を返す(引数は任意の数値) - smp2-33.php
- floor関数 - 引数の小数点以下を切り捨てた整数値を返す(引数は任意の数値) - smp2-34.php
- round関数 - 引数の小数点以下を4捨5入した整数値を返す(引数は任意の数値) - smp2-35.php
- rand関数/srand関数 - 乱数を発生させる関数(引数の2つの数値の間を返す)、同じ乱数にならないようにsrand関数を組み合わせる - smp2-36.php

2-5-4 PHPの日付/時刻関数 - func_date.phpで37~41の各関数を一つのアプリに統合
- getdate関数 - 現在の日時を返す、返り値を変数に代入した後、$now['year']などで個別に扱える - smp2-37.php
- date関数 - 現在の日時を返す(第1引数をあらかじめ決められた書式を""で囲んで指定する、書式文字は各種あるので表を参照) - smp2-38.php
- time関数 - 1970年1月1日からの通算秒数を返す、これは2つの日時を比較するときに返す(引数はなし) - smp2-39.php
- checkdate関数 - 引数に指定された日時について、実在する正しい日時かを返す(引数は月、日、年の順番に指定) - smp2-40.php
- strtotime関数 - 現在日時を元に、指定された別の日時を求める(きめられた文字列を"で囲んで指定、文字列の書き方は表を参照) - smp2-41.php

2-5-5 PHPの文字列関数 - str_triple.html/phpで3つの例題を送り、42~46までの各関数を処理するアプリを作製
- strlen関数 - 文字列の長さを返す、全角文字は長さが2としてカウント、空の文字列は0を返す(引数は任意の文字列) - smp2-42.php
- trim関数/itrim関数/rtrim関数 - 文字列から前後のスペースを取り除いた文字列を返す、itrimは前からだけ、rtrimは後ろからだけ、スペースだけでなく、\n(改行)、\t(タブ)も取り除く(第1引数は任意の文字列を指定するが、第2引数は省略でき、任意の文字を指定すれば、その文字を取り除ける) - smp2-43.php
- strpos関数/strrpos関数 - 引数の文字列を検索し、指定した文字が最初に現れる位置を返す、strrpos関数は指定した文字が最後に現れる位置を返す、一文字目は0、全角文字は2文字分として返す(第1引数は検索される文字列を指定、第2引数はそこから見つけたい文字/文字列を指定する) - smp2-44.php
- substr関数 - 文字列から一部分を取り出す(第1引数にもとの文字列を、第2引数は取り出し開始位置、第3引数は長さを指定、先頭の文字位置は0、全角文字は長さを2とする) - smp2-45.php
- strchr関数/strrchr関数 - 文字列内を検索し、指定した文字が最初に現れる位置以降の文字列を返す、strrchr関数は指定した文字が最後に現れる位置以降の文字列を返す(第1引数は元の文字列を指定、第2引数には検索する文字列を指定) - smp2-46.php

- strcmp関数 - 2つの文字列を比較して、同じものであれば0を返す、違う場合は比較して正(1)か負(-1)を返す(比較する文字列を第1、第2引数と指定) - smp2-47.php - これは上のものに追加しても動かないので、strcmp.html/phpで独立させる

- strtr関数/str_replace関数 - 指定した文字に適合する部分を別の文字に置き換え(strtrは元の文字、置き換え前と後の文字の3つ、str_replaceは置き換え前と後、元の文字の3つを指定) - smp2-48.php - str_replace.html/phpを作製し、それに48~51までの関数を統合したアプリにする

- substr_replace関数 - 指定した位置から、指定長さ分を別の文字に置き換え、先頭の文字位置を0、全角文字は長さ=2として指定、短い文はその文短くなる(4つの引数を、元の文字列、置き換える文字列、置き換え開始位置、置き換え長さの順番で指定) - smp2-49.php

- str_pad関数 - 文字列全体が指定された長さになるように、文字列の前後を指定された文字で埋める(第1引数は元の文字列、第2は最終の文字列の長さ、第3は前後を埋める文字列、第4は文字列の埋め方、これを省略すればSTR_PAD_RIGHTが指定されたものとなる) - smp2-50.php

- strtoupper関数/strtolower関数 - アルファベットの大文字/小文字の変換、upperは大文字に、lowerは小文字に変換(引数は任意の文字列) - smp2-51.php

2-5-6 PHPの2バイト文字関数
もし2バイト文字の処理が正常に動作しない時は、以下のCHECKを行うこと - 1.php.iniファイルの中の"extension_dir"の項目が"C:\xampp\ext\"に設定してあるか?
2.php.iniファイルの中の"extension=php_mbstring.dll"の行のコメントが外れているか? 3."C:\xampp\ext\"ファイルフォルダの下に”php_mbstring.dll”というファイルが実在するか?
- mb_strlen関数 - 文字列の長さを返す、半角も全角文字も長さ1としてカウント、すべて半角のときは、strlen関数と同じ結果である(第1引数は調べる文字列、第2はSJISかEUC-JPかを指定、php.iniでmbstringinternaal_encodingが指定されているときは省略できるがこのサンプルは指定されてないので、必ずEUC-JPを指定すること) - smp2-52.php - あまり意味はないが、一応mb_strlen.html/phpで作成、以下のものも統合できるならばここに集めることにする

- mb_strpos関数/mb_strrpos関数 - 引数の文字列を検索して、指定した文字が最初にまたは最後に現れる位置を返す、いずれも最初を0とした値、全角文字も1でカウント(第1引数は検索される文字列、第2は見つける文字列、第3は検索開始位置、rposは最後なのでこの指定は不要) - smp2-53.php - 上にこれもまとめて入れる

- mb_substr関数 - 文字列の中から一部分を取り出す、全角文字も1として扱うので文字化けしない(第1引数は元の文字列、第2は取り出し開始位置、第3は取り出す長さを指定、先頭の文字位置を0、全角文字も長さ=1と指定) - smp2-54.php - 上にこれもまとめて入れる

- mb_convert_encoding関数 - 文字列を指定した文字コードに変換、これはSJISコードとEUCコードのデータ変換に使う(第1引数に文字列、第2に変換先の文字コード、第3に元の文字列のコードを指定) - smp2-55.php - これもまとめるが、PHPがUTF-8になっているので、Shift-JISへ変換すると文字化けすることに注意

- METAタグでShift-JISを含めると表示方法が違ってくるので注意 - smp2-56.php - mb_metatag.html/phpで2バイト文字の扱い方のヒントがあるので、単独で上げておく

- mb_convert_kana関数 - 全角文字と半角文字の相互変換を行う(第1引数に変換前の文字列、第2に変換オプション、オプションの詳細は本文参照) - smp2-57.php - mb_convert_kana.html/phpで試す、codingをSJISにしてみて、どうなるかもついでに試す(大体ヒントをつかんだと思われる)

2-5-7 PHPの変数を処理する関数
- isset関数 - 引数に与えられた変数に値が代入されているか、HTMLのフォームから受け取った値の有無やフォームのどのボタンが押されたかを調べるのに便利(任意の変数を$がついた状態で指定) - smp2-58.php - isset.html/phpを試すが、変数そのものの状態を試すのであまり必要なしだが、okuriで受け取った値の有無や、フォームのどのボタンが押されたかを調べるにも使えるので重要である。

- unset関数 - 変数を破棄、その変数は失われる(任意の変数を$がついた状態で指定) - smp2-59.php - この分も上のisset.phpのなかに破棄のアプリを統合

- empty関数 - 引数の変数が空かを調べる、ただし変数の長さ=0の文字列(")や0が代入されていればからと判断するので注意(任意の変数を$がついた状態で指定) - smp2-60.php - この分もisset.phpの中に$aで空の文面を送り、$bで文字列を送って判定させている

2-5-8 PHPのオリジナル関数の作り方
function 関数名( 引数1, 引数2, ..) { - 命令文; - return 戻り値; - } - 処理が終わったかを返り値にする - test.php - <?php - function test() { - return True; - } - if (test()) { - print "処理成功!"; - } - else { - print "処理失敗!"; - } - ?> -
関数の作成例(1) - 第1引数として与えられた文字列を、第2で指定された色で太字表示するHTML文に変換する - smp2-61.php - 2-5行目を飛ばして、7行目と10行目のfontcolorのところで処理を行う - func_fontcolor.html/phpを作製するが、これも下記も含めて統合したい。

関数の作成例(2) - 返り値を待たずに引数を処理した結果を直接print文で表示させる例 - smp2-62.php - fontcolorのオリジナル関数は返り値がないので、処理せずに上の2-6行目で処理を行う - func_other_fontcolor.html/phpを作製するが、統合したらエラーになったので、独立させる

値渡しと参照渡し - smp2-63.php - &を付けて引数名を宣言すると参照渡しになる - func_plusand.phpを試す、&を付けて違う値を渡すようにできる- smp2-64.php - 呼び出し側は$volを引数として、関数側が$aを引数に異なる名前にする

2.6 関数や変数のインクルード
2-6-1 関数のインクルード
インクルードファイルは別名で保存しておき、それをインクルードする側では、スクリプトの先頭でrequire_once("ファイル名"); で呼び出す仕組み
2-6-2 変数のインクルード
関数だけではなく、変数も使えるので、下記の情報を格納した変数が最適、1.WebApplicationのタイトル、2.WebPageのヘッダやフッタ、ページナビゲーション部分のHTML分、3.HTMLのテーブルタグなどのwidth属性、4.データベースの接続先、5.会社名、6.GIFなどの画像ファイルの保存先のパスなど...smp2-65.php(インクルードファイル) - include_index.htmlですべてのHPを一つにまとめたのだが、まだHeaderとFooterを修正すること - include_index.htmlとphpを試すが、やはりphpでないと表示がうまくゆかないようである - 2hidden.phpにするとうまくゆくので、phpで統一してみること、ただし全部をphpにするのは面倒なので、2hidden.htmlの中の2-6-2だけを統一させることにする。
- smp2-66.php(1.) - include_php.phpで試して成功 - 2hidden.phpに導入して表示成功
と smp2-67.php(2.)にインクルードした例 - hidden.phpに導入して表示成功、

Column - 開発環境と運用環境の切り替えに使うIncludeFile - DbMnger.php - <?php - $DBSERVER = "localhost"; - $DBUSER = "root"; - $DBPASSWORD = ""; - /* - $DBSERVER = "mysql:dbname=db0kobksh01; host=localhost"; - $DBUSER = "kobksh01"; - $DBPASSWORD = "sugano12"; - */ - ?> - DbMnger.phpで切り替えられるように作るが、実験用はdb名が多いので、dataのフォルダに全部移植した

2.7 配列
2-7-1 数値インデックスの配列 - smp2-68.php - Indexを省略すると0から順番に番号が自動で記に割り振る - smp2-69.php
配列の使い方 - 配列名[インデックス]を付けてデータの入れ物を識別 - 配列は通常の変数と同じように扱うことができる
変数のIndex - 配列中のデータの入れ物はIndexで識別 - Indexは通常0から割り振る - インデックスとして文字列も使える
配列に入れるデータ - 数値、文字列など1つの配列には同じタイプのデータを入れる - 氏名データや商品データなど1つの配列には同じ分類の関連性があるデータを入れる
2-7-2 連想配列 - 文字列Indexの配列 - [ ]内に指定する文字を特に「キー」と呼ぶ、配列に代入されているデータを値と呼ぶ、キーは前後を”で囲んで表記できる - smp2-70.php - 68~70のものは送るべきものがないので省略

2-7-3 phpの配列用関数
- array関数 - 引数に列挙されたデータをまとめて配列に代入、変数は自動的に配列になる(配列に代入する1つまたは複数のデータ) - smp2-71.php
- count関数 - 引数に指定した配列のデータ数を返す、配列のデータ数はIndexの最大値+1になる、for文と組み合わせて配列数がわかっていない時でもすべてのデータを表示できる(任意の配列) - smp2-72.php - hairetsu_array.htmlとphpおよびhairetsu_count.phpでためすが、配列を送ると"の前に\が入ってしまい、期待した結果が出ないようであるので、これらも使えない。

- list/each関数
- sort関数
- array_unique関数
- array_sum関数
- array_search関数
- array_flip関数
- array_unshift関数
- array_push関数
- array_shift関数
- array_pop関数
- join/implode関数
- str_split関数
- is_array関数

Column 配列のデバッグに便利なprint_r関数 - ループ処理をしなくても、配列のようにまとめて出力してくれるので動作確認などに便利 - smp2-87.php - hairetsu_printr.html/phpを試すが、やはり配列として送っても、[0]にすべて入るだけなので、やはり不可のようである。

2.8 フォームとPHP
2-8-1 WindowApplicationとWebApplication - フォーム上で登録がクリックされると、<FORM>タグのaction属性に指定されている別のPHPファイルが呼び出されて、そのファイルで表示すべきページに切り替わる

2-8-2 フォームとPHPのやり取り - 表示画面のHTML - smp2-88.htm - 役割:<FORM>タグのaction属性に、クリック後に呼び出すPHPファイル名を指定 - フォーム部品にはname属性<INPUT size="35" type="text" name="username">を指定 - クリックの判定には、プッシュボタンにもname属性<INPUT type="submit" value=" 登録 " name="exereg">を指定
- 次に呼び出される側のPHPファイルを作る - smp2-89.php - type属性がsubmitとなっているボタンがクリックされると、<FORM>タグのaction属性に指定されたファイルが呼び出されて、そのページへジャンプし、PHPであればそのスクリプトが実行される、その時<FORM>〜</FORM>タグで囲まれた中にあるフォーム部品に入力された値や選択された値の情報が渡される - 呼び出されたphpファイルでは、渡された情報を$_POSTという名前の配列の変数に対するname属性と同じ名前の文字列Indexによって取得する - form_php.htm/phpで試して、かつShift-JISに変換して、送付と表示が成功、あとはMySQLに挿入するProgramを追加して完成になる。

2-8-3 POSTメソッドとGETメソッド - どちらでやっても同じ結果、method=""がPOSTかGETに帰るのみがPOSTかGETに変えるのみ - GETの場合のPHP例 - smp2-90.php - POSTと同じ結果でダブるので不要

2-8-4 フォーム部品とPHP - 部品ごとに入力値や選択値の違いで結果が変わる - smp2-91.htm と smp2-92.php の対応関係に注意 - フォーム部品についての詳細は以下 - そのまま2Hiddenに登録、何かに必要になればここから移植すればよいと思われる。
- TextBox
- TextArea
- RadioButton
- CheckBox
- ListBox/OptionMenu
- PushButton
- 隠しフィールド

第3章 MySQLの基礎

3.1DBの基本概念
3-1-1 DBの特徴
3-1-2 DBの構造 - フィールド、カラム、列 と レコード、ダブル、行 の構成、 およびインデックスと呼ばれる主キーを必ず設定のこと(ほかのレコードと重複しない値を入れるフィールド)

3.2 MySQLとSQL
3-2-1 MySQLの生い立ち - Version5.1を使う、
3-2-2 SQLとは?-

3.3 SQLによるDBの操作
sampledbのフォルダをそのまま、D:\xampp\mysql\data\sampledbにコピーする、読み取り専用属性を解除、再度MySQLを停止して再起動させておく
3-3-1 DB全体の操作
コマンドプロンプトからD:\xampp\mysql\bin\mysql -u root -p と入力し password を入力して mysql>のコマンドになれば成功
- show databases; でDBを一覧表示
- use <DB名>; DBの選択
- show tables; sampledbのDB内にあるテーブルを表示
- show fields from <テーブル名>; フィールドの一覧表示
- create database <DB名>; MySQLのすぐ下に新しいDBを作成 - testdbというDBを作成して、show databases; で確認
- drop database <DB名>; DBを削除 -

3-3-2 テーブル全体の操作
- テーブルの新規作成 - dataの種類と最大値を決める、それぞれのフィールド名を決める、各フィールドのデータ型を決める、Indexやその他属性が必要かを決める - create table meibo ( -
no int primary key not null auto_increment, - name varchar(30), - zip varchar(8), - address varchar(50), - tel varchar(20), - email varchar(50), - sex bit, - index keyzip (zip) - ) engine=MyISAM; -

memberのテーブルを作製 - create table member(id int primary key not null auto_increment, nam varchar(30), tel varchar(20), zip varchar(8), addr varchar(50), mail varchar(30) ) engine=MyISAM;
入力されたらshow fields文でテーブルの存在とその中身を確認 - print "氏名 → " . $_POST[nam] . "<BR>"; - print "電話番号 → " . $_POST[tel] . "<BR>"; - print "郵便番号 → " . $_POST[zip] . "<BR>"; - print "住所 → " . $_POST[addr] . "<BR>"; - print "メールアドレス → " . $_POST[mail] . "<BR>";

- テーブル構造の変更 - alter table <テーブル名> <変更処理名> <変更内容>;
- フィールドの追加(add column)、フィールド名やデータ型の変更(change column)、フィールドの削除(drop column)、テーブル名の変更(rename as)、インデックスの追加(add index)、インデックスの削除(drop index)、主キーの削除(drop primary key)、主キーの追加(add primary key) - meiboテーブルにemailフィールドを追加して結果を確認する - alter table meibo add column email varchar(50) after tel;

3-3-3 レコードの読み込み
- select文 - select * from <テーブル名>; - その前に全角文字のデータをあつかう場合は、事前に一度だけset names sjis; を実行しておくこと − select * from tblpref;
- フィールド名を指定したselect文 - select <フィールド名>、<フィールド名>、.... from <テーブル名>;
3-3-4 レコードの抽出と並べ替え
- 一つの特定条件でレコードを抽出する - where句を使ったselect文 - select 〜 from <テーブル名> where <抽出条件>; - select * from tblpref where population > 5000000; あるいはselect * from tblpref where prefecture like '%山%';
- 複数の条件でレコードを抽出する - select * from tblpref where zone = '関東' and population > 5000000;
- フィールドの値が2つの値の間にあるレコードを抽出 - select * from tblpref where population between 2000000 and 5000000;
- レコードを並べ替える - order by <フィールド名>; - select * from tblpref order by area; - 大きい順に並べる - select * from tblpref order by area desc; - 抽出したデータを並べ替える - select * from tblpref where population > 5000000 order by area desc;

3-3-5 フィールドの四則演算
- フィールドの値で演算する - select population/1000 from tblpref;
- フィールドの値同士で演算する - select population/area from tblpref; - as句を使うと演算を行った結果のフィールドに対して、任意の名前を付けて結果を一つのフィールドとして扱える - select population/area as density from tblpref;

3-3-6 MySQL関数による演算
- now関数とlength関数 - selectを付けて関数を確認する

3-3-7 MySQLの文字列関数
- concat関数 - 引数に指定した複数の文字列を結合、MySQLは+や&などの記号を使えないのでこの関数を使う - select concat(zone, prefecture) from tblpref;
- lenght関数 - 引数に指定した文字列の長さを返す、半角文字1、全角文字2となる - select length( prefecture) from tblpref;
- char_length関数 - select char_length( prefecture) from tblpref - 指定した文字列の長さを返す
- left関数 - select left( prefecture, 2) from tblpref - 指定した文字列の左から2文字を返す
- right関数 - select right( prefecture, 2) from tblpref - 指定した文字列の右から2文字を返す
- substring関数 - select substring( prefecture, 2, 1) from tblpref - 指定した文字列の指定した位置と文字数を返す
- ltrim関数 - select ltrim( prefecture) from tblpref - 指定した文字列の前にあるスペースを取り除いてを返す
- rtrim関数 - select rtrim( prefecture) from tblpref - 指定した文字列の末尾にあるスペースを取り除いてを返す
- - - - - - - - select trim( prefecture) from tblpref - 指定した文字列の前後にあるスペースを取り除いてを返す
- ucase関数 - select ucase(fld1) from tbltest - 指定した文字列を大文字に変換した値を返す
- lcase関数 - select lcase(fld1) from tbltest - 指定した文字列を小文字に変換した値を返す
- instr/locate関数 - select instr(prefecture. '県') from tblpref - 指定した文字列を検索してその位置を返す
- - - - - - - - - - - - select locate( '県', prefecture) from tblpref - 指定した文字列を検索してその位置をを返す

3-3-8 MySQLの数学関数
- abs関数 -
- ceiling関数 -
- floor関数 -
- round関数 -
- mod関数 -

3-3-9 MySQLの日付/時刻関数
- now関数 -
- curdate/current_date関数 -
- date_add関数 -
- year/month/day/weekday関数 -
- hour/minute/second関数

3-3-10 MySQLの条件分岐関数
- if関数 -
- ifnull関数 -
- case when 〜 then 〜 end 式 - 条件分岐 - select prefecture, case when right(prefecture, 1) = '都' then '都' when right(prefecture, 1) = '道' then '道' when right(prefecture, 1) = '府' then '府' else '県' end as prefkind from tblpref; - これはなかなか使いにくいが、役に立ちそうな関数で複雑な処理ができそうだが、Hiddenにはとうろくできないので、おぼえておくこと

3-3-11 レコードの追加
- insert into <テーブル名>(<フィールド名1>,<フィールド名2>,<フィールド名3>,...) values (<データ名1>,<データ名2>,<データ名3>,...); 追加データが文字列や日付のときは'で囲む、フィールド1とデータ1は対応させる、auto_increment属性がないときはprimary key属性を持つ主キーは必ず指定して、データを入力する、not null属性を持つフィールドには必ずデータを入力する、auto_increment属性をもつものは追加フィールドに指定しない - insert into member(nam, addr, tel, zip, mail) values('白井一男', '神戸市須磨区菅の台3-4-4', '078-792-2511', '654-0143', 'kazuo_shirai@hotmail.com') ; - memberに2つ目を追加した、あとはphp文で追加するのと、xsl文で一括追加する方法を試すこと

3-3-12 レコードの更新
- update <テーブル名>set <フィールド名1> = <データ名1>, <フィールド名2> = <データ名2>, <フィールド名3> = <データ名3> where <注出条件>; - update tbladdress set tel = '000000'; あるいはupdate tbladdress set tel = '078-792-2511' where prefid = 28; など - 必要が出てきたら試すこと

3-3-13 レコードの削除
- delete from <テーブル名> where <抽出条件>; - 必要が出てきたら試すこと

3.4 PHPによるMySQLの操作
3-4-1 DB操作の基本手順
- mysql_connect関数を使ってMySQLに接続 - $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);
- MySQL読み込み時に文字コードを設定(set names sjis) - mysql_query("set names utf8");
- mysql_select_db関数で、MySQL内のどのDBを使うかを選択 - $selectdb = mysql_select_db($DBNAME);
- SQLを組み立て(通常の文字列の組み立て) - $sql = "SELECT * from member";
- mysql_query関数などで、MySQLに対してSQL文を発行 - $rst = mysql_query($sql);
- SQL文がinsert文、update文、delete文であれば、それが正常に処理されたかや、何件のレコードが処理されたかなどを、確認 - $body = mysql_num_rows($rst) . " 件のデータがあります。";
- sqlがselect文であれば、返されたレコードをmysql_fetch_array関数などで結果セットとして受け取り、それらを画面表示するなどの処理を行う - while ($col = mysql_fetch_array($rst)) {
$body .= "<TR>" .
"<TD>$col[id]</TD>" .
"<TD>$col[nam]</TD>" .
"<TD>$col[tel]</TD>" .
"<TD>$col[zip]</TD>" .
"<TD>$col[addr]</TD>" .
"<TD>$col[mail]</TD>" .
"</TR>";
}
$body .= "</TABLE>";
- SQLがselect文のときは、mysql_free_result関数で結果セットを破棄 - mysql_free_result($rst);
- 最後に、mysql_close関数でMySQLとの接続を解除 - $con = mysql_close($con); - select_member.phpで試して成功、文字指定はUTF8になっている。

3-4-2 select文のスクリプト例
smp3-01.php - mysqll_connect関数 - 接続を行い判断は条件分岐で行う(引数はサーバ名、ユーザ名、パスワードを指定)
- mysql_select_db関数 - 複数のDBから、1つのDBを選択する、確認が必要なら条件分岐にする(第1引数には選択するDB名を指定)
- mysql_query関数 - SQL文を発行、成功するとselect文ではSQLによって取得された結果セットのidが返される、insertやupdateではtrueが返される(第1引数にはセl文の文字列を指定)
- mysql_num_rows関数 - select文をmysql_query関数で発行した帰り値である結果セットの中に、何レコードのデータがあるかを返す(mysql_query関数で返されたidを指定)
- mysql_fetch_array関数 - 結果セットの中から1レコード文のデータを取り出し、変数$colに代入し、連想配列として格納、$col(フィールド名)でデータを取り出すために連想配列で扱うことで全データを自動的に取り出す(引数は結果セットのidを指定、第2引数にはどのように変数に格納するか、省略するとMYSQL_BOTH連想配列と数値Indexの両方の形式で格納)
- mysql_free_result関数 - 結果セットを破棄して、メモリを解放(mysql_query関数で返された結果セットIDを指定)
- mysql_close関数 - MySQL都の接続を解除(mysql_connect関数で返されたMySQL接続IDを指定)
smp3-02.php - mysql_num_rows関数の返り値をループ処理で使う - 上とまったく同じだが対象がtbladdressになっているのと、文字指定がUJISになっている

3-4-3 insert文のスクリプト例
smp3-03.php - Keijibanに自動でInsertします。 - insert_keijiban.phpを作製、EUCでないと送ると文字化けする、一覧表示はSJISで正しく表示されるし良くわからん、doubleのokuriはうまくゆかず(\"の囲みのためか)
SQL文が全角文字を含む場合 - MySQLに発行する段階で文字化けするので、事前にset names ujisを送っておく
- 'ではなく"で囲む - 'で囲むとSQL文では2重になるのでPHPでは\"で囲むように心がける
- 改行でスクリプトを区切る - スクリプトを見やすくするために改行を入れるとSQL文では半角スペースを処理される機能を使うこと
- mysql_affected_rows関数 - レコード数を返す、delete文では0、失敗すると-1、updateで変更がないときも0を返す(引数はMySQLの接続IDを指定)
- mysql_insert_id関数 - insert文でauto_increment属性に自動生成された値をかえす、ないときは0を返す(引数はMySQLの接続IDを指定)

3-4-4 update文のスクリプト例 - update_tbladdress.html/phpを試す、UTF8で統一したら文字化けが治る、tel noのみを訂正するだけなのであまり使い道ないが、keijibanであればmessのみの修正なので使えるかもしれない - smp3-04.php - Keijibanに自動でUpdateします。 - update_keijiban.html/phpで試して成功、messの修正を送付して訂正できるので便利、UTF-8で統一させたのも分かりやすい

3-4-5 delete文のスクリプト例 - phpMyAdminでやれるのであまり使わなそうなので省略
smp3-05.php - Keijibanに自動でDeleteします。

3-4-6 PHPのMySQL操作用関数
- mysql_fetch_assoc関数 - select文をmysql_query関数で発行した帰り値である結果セットの中から1レコード文のデータを連想配列で取り出す(mysql_query関数で返された結果セットidを指定) - smp3-06.php - 実用掲示板用のデータ配列を返すように変更

- mysql_fetch_row関数 - select文をmysql_query関数で発行した帰り値である結果セットの中から1レコード文のデータを数値INDEXの配列で取り出す,mysql_fetch_array関数と同じ結果を得る(mysql_query関数で返された結果セットidを指定) - smp3-07.php - 一行掲示板に現在あるスレッド一覧。 - 簡単掲示板用のデータ配列を返すように変更

- mysql_num_fields関数 - 結果セットに含まれる、フィールドの数を返す、主に各フィールドをループで処理するようなときに使う(返された結果セットIDを指定) - smp3-08.php - 実用掲示板に現在あるスレッドの一覧 - meibo_aのデータ配列を返すように変更

- mysql_field_name関数 - 結果セットから特定のフィールド名を返す(第一引数に結果セットIDを指定、第二は取得したいフィールドを0から指定) - smp3-09.php - PhotoLibraryの写真の表示Itemの一覧です - memberのフィールドのItemの一覧を表示

- mysql_result関数 - 結果セットから特定の行番号・列番号のデータを返す、ループ処理においてレコード番号やフィールド番号をインデックスとして扱いたい場合や、先頭からの順次アクセスではなく、ランダムに取り出したいときに使用(第一引数に結果セットIDを、第2に取り出したいレコード(行)の番号を0から、台3にフィールド(列)を指定) - smp3-10.php - Memberのデータの入力されたもの一覧です - messageのデータ配列を返すように変更

- mysql_list_tables関数 - DB内のテーブルの一覧を結果セットとして返す(第一引数はDB名を指定、第2はmysql_connect関数で返されたMySQL接続IDを指定) - smp3-11.php - データベース内のテーブル名の一覧です - selfphpの中にあるテーブルの一覧表示

- mysql_list_fields関数 - テーブルの中のフィールド名の一覧を結果セットとして返す(第一引数はDB名を指定、第2はテーブル名を指定、第3はmysql_connect関数で返されたMySQL接続IDを指定) - smp3-12.php - 同窓会名簿の各フィールドを表示します - photolibdbの中のtblphotoのフィールド名の一覧を返す

- mysql_errno関数、mysql_error関数 - 発生したエラーについて、errno関数はそのエラー番号を返す、エラーがなければ0(ゼロ)を返す、error関数はエラーメッセージを返す(引数は、mysql_connect関数で返されたMySQL接続IDを指定) - smp3-13.php - 存在しない架空のDBを探してエラーを表示させます - 存在しないDB名を指定してエラーを表示させる

Column MySQL5とストアドプロシージャ
delimiter // - create procedure testproc1() - begin - update tblpref set area = area/1000; - update tblpref set population = population/1000; - delete from tblpref where zone <> '関東'; - select * from tblpref; - end // - delimiter ; - これを実行すれば、testproc1をDB上に生成されて、これを呼び出せば、4つのSQL文が一度に実行される

第4章 フォトライブラリの概要

4.1 フォトライブラリのセットアップ
4-1-1 フォトライブラリの概要
4-1-2 PHPファイルのセットアップ
4-1-3 MySQLデータベールファイルのセットアップ
- 稼働中のMySQLを停止、photolibdbフォルダをコピーする、C:\xampp\mysql\dataフォルダに張り付け、読み取り専用を解除、MySQLを起動、http://localhost/phpmyadmin/を入力 - localhostでは問題ないが、atPagesではmysql\dataがどこにあるかが不明なのでコピーができないので、photolibdbフォルダを作ってから、1件づつImportしなければならないかも

4.2 PAGEの遍移と操作の概要
4-2-1 Photolibraryのページの流れ index.html(メインメニュー) - 共通ファイル(スタイルシート(photolib.css)、共通インクルードファイル(photolibini.php))
- 1.登録日別一覧ページ(regdatalist.php) - 検索結果ページ(search.php)
- 2.カテゴリー別一覧ページ(categlist.php)
- 3.写真の新規登録ページ(photonew.php) - 写真の新規登録確認ページ(photonewchk.php) - 写真の新規登録実行ページ(photonewexec.php)
- 4.管理者ログインページ(adminlogin.php) - 写真のメインテナンスページ(photomnt.php) - 写真の編集ページ(photoupd.php) - 写真の編集確認ページ(photoupdchk.php) - 写真の編集実行ペ-ジ(photomntexec.php)
.......................................................................- カテゴリのメインテナンスページ(categmnt.php)

4-2-2 メインメニュー画面
http://localhost/photolib/ でアクセス、LocalhostはEUC-JPで問題なく表示や入力ができている。新規登録も成功する。しかし、atPagesでは新規の登録で失敗するが、UTF-8に統一したがやはり途中まで成功するが最後に失敗 - 原因不明

4-2-3 写真データを検索 - キーワード検索
- 検索結果のページの操作 - and検索(スペースで区切る)、or検索(,で区切る)、登録日別検索(任意の日付をクリック)、カテゴリ別検索(任意のカテゴリをクリック)、- atPagesのphotolib/photo/ へ北海道の写真を全部移すが、やはり検索では出てこない

4-2-4 写真データを新規登録する - jpgでかつ1Mバイト以下 - 制限は設定を書き換えること - コメントは255文字分のみ - atPagesでは最後で失敗する。

4-2-5 写真やカテゴリのメンテナンス - パスワード(password)の入力(PHPに埋め込まれているので書き換えること) - atPagesでは更新に失敗

4.3 Photolibraryの内部仕様
4-3-1 MySQLデータベースの仕様
tblcategory と tblphoto と言う2つのテーブルだけで構成されるDBで、photolibdbというDB名で非常にシンプル
- tblcategory テーブル - マスターデータ、2つのフィールドで構成 - カテゴリID(categoryid、int、primary key not null auto_increment) と カテゴリ名(categoryname、varchar(50)) - primary key とauto_incrementを追加
- tblphoto テーブル - 写真のデータを保存 - 写真番号(photoid、int、primary key not null auto_increment)、写真ファイル名(photofilename、char(20))、カテゴリID(categoryid、int、keycategoryというIndex)、コメント(comments、varchar(255))、登録日(regdate、date) - primary key とauto_incrementを追加
- 写真の内部ファイル名 - C:\xampp\htdocs\photolib\photoのフォルダ内に保存 - 登録処理日を1970/1/1 00:00:00からの経過秒数に換算したファイル名で管理
- categoryidフィールドの値 - カテゴリ名ではなく、値(数値)で保存 - 長い文字データにすると効率が悪く、またカテゴリ名を変更したときにtblcategoryテーブルだけの変更で済む、ただしWebページに表示するときはカテゴリ名の方がわかりやすいので、2つのテーブルを結合して結果セットを取得する
- tblcategoryテーブルとtblphotoテーブルをSQLで生成 - 新しくphotolibdbのデータベースが作れないので、db0kobksh01 の中に直接2つのテーブルを作製する - create database photolibdb default character set ujis collate jis_japanese_ci; - use photolibdb; - create table tblcategory ( - categoryid int primary key not null auto_increment, - categoryname varchar(50) - ) engine=MyISAM; - create table tblphoto ( - photoid int primary key not null auto_increment, - photofilename char(20), - categoryid int, - comment varchar(255), - regdate date, - index keycategory (categoryid) - ) engine=MyISAm; - photolib.sqlでUTF8用に変更してdb名はdb0kobksh01に変更して作製している。 - 新たにdb名をphotolibdbにしてEUCで統一して、tblcategoryとtblphotoを作ったほうが早いかもしれない - EUCで統一してTest_dbに2つのテーブルを作成し、同窓会のファイルへ登録が成功した。

4-3-2 PhotolibraryのPHPファイルの仕様
● PhotolibraryのFolder
- imagesフォルダ - index.htmlで使われるGIFファイルを保存
- photoフォルダ - 写真のファイルを保存するフォルダ
- phototmpフォルダ - Upload後に一時的に保存、登録後にphotoフォルダに移動
● PhorolibraryのPHPファイル
- 1. 共通Includeファイル(photolibini.php) - MySQLへの接続情報や各ページのヘッダとフッタのデザインデータを保存
- 2. 検索結果ページ(search.php) - 検索処理とその結果の表示を行う、キーワード、登録日別、カテゴリ別検索を行うファイルや並べ替え、サムネイルなどの表示形式の制御などのファイルも含む
- 3. 登録日別一覧ページ(regdatelist.php) - DBから集計処理を行い、登録日や件数を一覧表示するPHPファイル - search.phpを呼び出す
- 4. カテゴリ別一覧ページ(categlist.php) - カテゴリ名と件数を一覧表示するPHPファイル - search.phpを呼び出す
- 5. 写真の新規登録ページ(photonew.php) - 写真の新規登録のデータの入力を行うPHP、HTMLに近い、photonewchk.phpに渡される
- 6. 写真の新規登録確認ページ(photonewchk.php) - 新規登録のデータのcheckや再表示を行い、確認するPHPで、OKであればphotonewexec.phpに渡す
- 7. 写真の新規登録実行ページ゙(photonewexec.php) - 入力されたデータやファイル名をDBへ追加処理を行うPHP
- 8. 管理者ログインページ(adminlogin.php) - 認証を行い、photomnt.phpまたはcategmnt.phpへジャンプする
- 9. 写真のメンテナンスページ(photomnt.php) - 一覧表示されたデータを選んで編集ボタンが押されたらそのデータをphotoupd.phpに渡す、削除ボタンのときはphotomntexec.phpへ渡す
- 10. 写真の編集ページ(photoupd.php) - 編集用のHTMLフォームを表示し、編集された内容をphotoupdchk.phpに渡す
- 11. 写真の編集確認ページ(photoupdchk.php) - 入力されたデータのcheckや再表示、確認を行い、OKであればphotomntexec.phpに渡す
- 12. 写真の編集実行ページ(photomntexec.php) - 写真データの更新、削除を行う、
- 13. カテゴリのメンテページ(categmnt.php) - カテゴリのマスターデータを管理する、HTMLとして画面表示して、その更新、削除、追加をすべて行う
- その他のファイル - MainMenuPage(index.html) と スタイルシート(photolib.css)

第5章 フォトライブラリのプログラム解説

5.1 メインメニューページ(index.htm)
5.1.1 概要
5.1.2 プログラム構造 - HTMLのみの構成、<A>タグで各メニューへリンクする
5.1.3 ポイント1: GETメソッド - キーワードに入力された値をsearch.phpに渡す、$_GET[namae属性のインデックス]でPHPファイル上で処理される - search.php?keyword=%E8%8A%B1 - 特に問題なし
5.1.4 ポイント2: <A>タグでPHPへパラメータを渡す -

5.2 共通IncludeFile(photolibini.php) - 特に問題なし
5.2.1 概要
5.2.2 プログラム構造 - 7〜10行目: 必要な情報を変数に代入1 - DBにアクセスする情報を保持し、接続させる関数の引数として利用
- 12〜15行目: 必要な情報を変数に代入2 - 接続情報以外の、各PHPで使う情報を変数に代入
- 18〜50行目: オリジナル関数htmlheaderとhtmlfooter - 各ページで共通して出力するHTMLのヘッダとフッタのHTML文を組み立てて返す
- 52〜93行目: オリジナル関数dfirst - あるテーブルの中から、引数として指定した条件に一致する最初のレコードを読み込み、目当ての値を取得する
- 95〜99行目: オリジナル関数debugprint - スクリプトの途中で変数にどのような値が入っているかを知りたいときにprint $_変数名の命令を一行加えるとよい
5.2.3 ポイント1: HTML文の関数化 - $pagetitleを入れてそれぞれのタイトルバーの表示された文字列を変えるため(ほぼ同じ内容であって、一部を動的に変える場合)
5.2.4 ポイント2: オリジナル関数での留意点 - global $変数名 - 先頭の変数をこの関数内でも利用するとき
- $closeflgの意味 - dfirst関数内で接続が解除されないように引数にFalseを指定しておく

5.3 写真の新規登録ページ(photonew.php)
5.3.1 概要 - 入力されたデータをphotonewchk。phpへ渡す - atPagesはUTF-8でも送ると成功、photonewexeがUTF-8Nになっていたので修正したら成功した。 localhostは変なDownが出現するので、下のパソコンで試すこと。下でEUCで送って成功。

5.3.2 プログラム構造 - 55行目で <?=$stroption?> によってPHPスクリプトを画面出力させる - 内容は16行から27行目の間を<OPTION>タグで表示させている
5.3.3 ポイント1: POSTメソッド - <FORM>タグで囲まれた中に入力されたデータをPOST形式でphotonewchk.phpへ渡す
5.3.4 ポイント2: ファイルをUploadするForm - 47行目の<INPUT type="file" name="uploadfile" size="60">で参照ボタンを表示させて名前を付けて認識させる、40行目のenctype="multipart/form-data"で属性を指定してWebサーバへUploadできる - 1.タイミング(chkファイルを呼び出す前) 2.ファイルのCHECK゙(Uploadsする前にはできない) 3.Uploadは仮の状態゙(tmpにあがるのみ)

5.4 写真の新規登録確認ページ(photonewchk.php)
5.4.1 概要 - SJISで登録すると文字化けが解消、最後の確認ページのみまた文字化けする,photonewexec.phpのせいか?
5.4.2 プログラム構造 - 9〜14行目: 前ページからのデータの受け取り - データを$_POSTで、ファイルの情報を$_FILESで受け取る
- 16〜19行目: 入力された文字列の変換 - 問題が発生しないように、いくつかの関数を使って、入力された文字列を変換
- 21〜31行目: 入力データのCHECK - 文字列の長さなど、一般的な入力データのCHECK
- 36〜62行目: 仮の状態でUploadされたファイルの後処理 - ファイルサイズがオーバーしていないか、拡張子がjpgであるかをCHECKして、OKであれば所定のフォルダへ移動
- 64〜72行目: データに問題があるときの条件分岐 - エラーがあったとき、該当のHTML文を作成し、仮の状態のファイルを削除
- 73〜111行目: データに問題がなかったときの処理 - 問題がないとき、データをそのままの形でHTML文を作成し、次のPHPファイルへ渡すために隠しフィールドでFORMタグ内に記述
- 113〜118行目: Webページを表示 - HTMLのヘッダ値と変数$BODYの内容、およびHTMLのフッタ部をまとめてprint文によって出力
5.4.3 ポイント1: 入力データの変換 - stripcslashes関数 - ' " \などの変数のエスケープを本来の形に戻す
- htmlspecialchars関数 - < や >という文字を&lt;や$gt;といった実態参照に変換して、HTML文のレベルでタグを挿入させる悪意のある文字列を防ぐ
- nl2br関数 - 改行コードをブラウザ上でも機能させるために<br />を入力してHTML文でも同じように表示を行える
- 半角カタカナが入力された時 - mb_convert_kana関数を使って全角カタカナに変換する
- ' が入力された時 - ' が命令文とバッティングするので106行目のように(value=\"$comment\") "を使うこと
5.4.4 ポイント2: - Uploadfileの後処理 - 39行目: ファイル名と拡張子を取得 - 元のLocalのファイル名からpathinfo関数でファイル名と拡張子を分割して、連想配列で取得、$fileinfoに代入
- 40行目: 拡張子の情報を操作 - 拡張子の情報を取り出して、変数$fileextに代入、配列の引数にextensionを設定して、拡張子を取り出し、strtoupper関数で大文字に変換
- 41〜48行目: ファイルのサイズをcheck - $uploadfile_size変数にはサイズが代入されているので、その値を調べて、上限/下限をcheckする
- 54〜56行目:内部的に管理するファイル名を設定 - microtime関数で1970/1/1からの通算秒数を返すので、その値でファイル名を設定する
- 58行目: ファイルを正規のフォルダに移動 - move_uploaded_file関数を使って正規の場所に移動、OKが押されると第一引数のtempのパス、第2引数に移動先のパスを指定、この時この関数の引数には文字列を指定するという決まりがあるので、2つ変数全体を"で囲む

5.4.5 ポイント3: ファイル操作関数 - //アップロードしたファイルの実体を削除します - if(strlen($uploadfile) > 0 ) { - @unlink($uploadfile); - @unlink("$PHOTOTMP$imagefile");
- fputs関数とfgetcsv関数 - smp5-01.php - テーブルのデータをcsvファイルに書き出し、それを画面出力する - localhostは成功 - それぞれのselfphpの中でのmeibo_a、member、messageのアプリも作成、しかし、atPagesは表示されず、エラーが表示されないので原因不明

Column ファイルのUploadに関するphp.iniの設定
php.iniの503行目付近 - Maximum allowed size を32Mから64Mに変更した さらに128Mに増やす

5.5 写真の新規登録実行ページ(photonewexec.php)
5.5.1 概要 - 最終的にSJISで統一できたので文字化けは解消できたようである
5.5.2 プログラム構造 - 15行目のisset関数で、変数$cancelに値が代入されているかをCHECKしてその後の処理を2つに分岐、cancellが押されていない時はinsert文で、写真データをtblphotoに追加書き込みを行う、同時にtmpフォルダに保存されていた写真をphotoフォルダに移動するが、そのフォルダ名は、インクルドファイルのphotolibini.phpで変数$PHOTOTMPや$PHOTODIRとして定義されているものである。
5.5.3 ポイント: リダイレクト - 30行目のheader関数でLocationで始まるヘッダ情報をリダイレクトしている - いろいろ試すがすべて失敗、もう方法が思いつかない

5.6 管理者用ログインページ(adminlogin.php)
5.6.1 概要 -
5.6.2 プログラム構造 -
5.6.3 ポイント1: 自分自身を呼び出す -
5.6.4 ポイント2: セッション管理 -

Column クッキーでページ間のデータを共有する - smp5-02.php(Shift-JISで作成しても問題ない?-表示もEncodingを変更する必要がない、もう一つそれらの関連具合の理解が不足している)

5.7 写真のメンテナンスページ(photomnt.php)
5.7.1 概要 - LoginCheckの部分をコメントアウトして本文へ直接アクセスできるようにした
5.7.2 プログラム構造 - 9〜17行目: session変数が定義されているかをcheck -
- 34〜51行目: ページングの管理 -
- 56〜71行目: JavaScript -
- 73〜83行目: ガイダンスを表示するHTML文を組み立てる
- 85〜93行目: 20レコードだけを取り出す
- 95〜126行目: ページ本文のHTMLを組み立てる
- 133〜148行目: ナビゲーションのHTMLを組み立てる
5.7.3 ポイント1: テーブルの結合 - テーブルの結合とは -
- テーブルを結合するSQL文 -
- テーブルを結合する3つの方法 -
5.7.4 ポイント2: limit句

5.8 写真の編集ページ(photoupd.php)
5.8.1 概要 - UTF-8で統一すると問題なし
5.8.2 プログラム構造 - 前半: PHPによるDB処理 -
- 後半: HTMLフォームの組み立てと表示 -
- HTMLフォームへの初期値の代入について -

5.9 写真の編集確認ページ(photoupdchk.php)
5.9.1 - 概要 - UTF-8で統一すると問題なし
5.9.2 - プログラム構造 - 81〜88行目: 写真の差し替えを判別
110〜111行目: 削除するファイルの情報を次のファイルへ渡す
114〜115行目: 編集する写真のデータの情報をphotomntexec.phpへ引き渡す

5.10 写真の編集実行ページ(photomntexec.php)
5.10.1 - 概要 - 最終的に全部の問題が解決した
5.10.2 - プログラム構造 - 18〜27行目: photoupdchk.phpでキャンセルがクリックされた場合の処理
36〜75行目: データベース更新のメイン処理
5.10.3 −プログラム構造:2 - 78行目: 変数$procの値をcheckする -
80〜81行目: 写真ファイルの削除 -
83〜96行目: テーブルから該当レコードを削除 -

5.11 カテゴリのメンテナンスページ(categmnt.php)
5.11.1 概要 -
5.11.2 プログラム構造 - 29行目: はじめて呼ばれたか否かを調べる
- 31〜64行目: クリックされたボタンを調べる
- 76〜103行目: tblcategoryテーブルの全レコードを読み込み
- 104〜110行目: 表の最後の行の表示
- 111行目: 総レコード数のカウント
5.11.3 ポイント: フォーム部品に動的な名前を付ける
- 動的な変数名/配列名を使う
- 29行目: 動的な変数名/配列名を処理するには

5.12 登録日別一覧ページ(regdatelist.php)
5.12.1 概要 -
5.12.2 プログラム構造 - 32行目でsearch.phpをリンク先にしている -
5.12.3 ポイント: グループ集計 - グループ集計のメカニズム
- グループ集計のSQL
- グループ集計の例

5.13 カテゴリ別一覧ページ(categlist.php)
5.13.1 概要 -
5.13.2 プログラム構造 - 17行目: カテゴリー別の登録件数を集計 -
- 33行目; 検索結果ページをリンク先に設定

5.14 検索結果ページ(search.php)
5.14.1 - 概要 -
5.14.2 - プログラム構造1: このファイルが呼び出された時 - 1. メインページで検索キーワードが押された時は変数$keywordで受け取る
- 2. メインページで登録日別検索が押された時は、regdatelist.php(登録日別一覧ページ)での検索対象登録日の選択の後、その日付を変数$regdateで受け取る
- 3. メインページでカテゴリ別検索が押された時は、categlist.php(カテゴリ別一覧ページ)での検索対象カテゴリの選択の後、そのカテゴリIDを変数$categidで受け取る
- 4. 並べ替えや表示方法切り替え時の再表示のボタンがクリックされたり、月の20件などのナビゲーションのリンクがクリックされたときは、search.phpは自分自身を呼び出す
- 5. 再表示が押されて自分自身が呼び出された時、1〜3でわたされた情報は隠しフィールドでリンク先の情報などを継続して保持しておく
- 6. photomnt.phpと同様に、ページング機能が付いているので、その現在のページ番号(変数$page)、該当件数の情報(変数$tcnt)やリンク先のファイルのパラメータとして、自分自身へ渡す
5.14.3 - プログラム構造2: スクリプトの詳細 - where句を組み立て(45〜97行目)、order by句を組み立て(99〜107行目)、DBからデータを抽出(109〜158行目)、データを一覧表示またはサムネイル表示するHTML文を組み立て(160〜218行目)、ページナビゲーションや並べ替え/表示方法のHTMLフォームを組み立て(225〜290行目)、htmlを出力(292〜297行目)
- 18〜21行目; 写真の表示件数を設定
- 23〜43行目; 検索方法のCHECK
- 45〜97行目; データを抽出するSQL文のwhere句を組み立てる
- 99〜107行目; SQL文のorder by句の設定
- 109〜158行目; ページングに必要な前処理
- 162〜194行目; 写真データを一覧表示するHTML文の組立て
- 195〜218行目; サムネイル表示するHTML文の組立て
- 225〜257行目; <A>タグによるリンク文字列の組み立て
- 259行目; 画面の最下部の表示
5.14.4 - ポイント1: 複数のキーワードの分解処理 - //キーワードからエスケープ文字を取り除きます - $keyword = stripcslashes($keyword); - //キーワードの前後のスペースを取り除きます - $keyword = trim($keyword); - キーワードの前の\や前後の余分なスペースを取り除く
//全角スペースの半角変換と半角カナの全角変換を行います - $keyword = mb_convert_kana($keyword, "sKV", "Shift-JIS"); - 全角スペースを半角に、半角仮名を全角に変換
if(!strrchr($keyword, " ")){ - //キーワードに半角スペースが含まれていないとき - $keyword = str_replace("、", ",", $keyword); - $keyword = str_replace(",", ",", $keyword); - $arykey = explode(",", $keyword); - $tmpkey = "Or"; - } - キーワードをor検索を指定するために、半角コンマで区切って分解、explode関数でそれぞれの文字列を配列($arykey[0],[1],[2]...])で返す、そして$tmpkeyで指定したorが後のSQL文のwhere句を組み立てるときに使われる
else{ - //キーワードに半角スペースが含まれているとき - $arykey = explode(" ", $keyword); - $tmpkey = "And"; - } - 半角スペースを指定して、文字列を半角スペースで区切り、配列$arykeyに切りだす
//分解された各キーワードが空でないかチェックします - for ($i = 0; $i < sizeof($arykey); $i++) { - if (strlen($arykey[$i]) == 0) { - //分解されたキーワードのいずれかが空のとき - $body = "キーワードの指定が正しくありません! - <INPUT type='button' value='ホームへ戻る' - onclick='window.location=\"index.htm\"'>"; - print htmlheader("検索結果") . - $body . htmlfooter(); - exit(); - } - } - 空のキーワードがあればエラーを表示してこのスクリプトを終了、
//最初のキーワードをWHERE句に追加します - $where = " WHERE (comment Like \"%$arykey[0]%\")"; - //2つめ以降のキーワードをWHERE句に追加します - for ($i = 1; $i < sizeof($arykey); $i++) { - $where .= " " . $tmpkey; - $where .= " (comment Like \"%$arykey[$i]%\")"; - } - $arykey[0]を使ってwhere句を作成、sizeof関数でキーワードの数を調べて配列から取り出して、$tmpkeyを調べてAnd か Or を接続に使いwhere句に追加してゆく
5.14.5 - ポイント2: 正規表現 - //キーワードが指定されているときはコメント内のキーワードを太字に置換します - $tmpcomment = $col[comment]; - if ($searchtype == "kw") { - for - ($i = 0; $i < sizeof($arykey); $i++) { - $tmpcomment = ereg_replace(preg_quote($arykey[$i]), "<B>". "\\0" . "</B>", $tmpcomment); - } - } - コメントをいったん$tmpcommentに代入、検索の方法を$searchtypeで確認して、キーワード検索のときはループで太字変換を行う
- 184行目: ereg_replace関数 - 第3引数に指定した文字列内を正規表現で検索し、キーワードに一致する部分に<B>〜</B>を付けた文字列に置換する
- 正規表現について - あいまいな表現を使って文字列内の検索や置換を処理する、使用できる記号は本文を参照
- 184行目: preg_quote関数 - 正規表現で使う特殊文字が含まれているときに\を付けて正規表現ではない通常の文字として扱われるようにする - 特殊文字や全角文字が含まれているとエラーになるので、その前にこれらを変換し通常の文字にするために\を付け加える

Column - ereg関数で正規表現による検索を行う - smp5-03.php - 正規表現の具体例として最適 - ereg.htmlとphpで""I am Taro, 20 years old"を分解するアプリを作製したので、送付する内容で正規表現の修正を加えることで役に立つと思われる。

Column - GDライブラリによる画像処理 - 元の画像ファイルの縮小版を作って通信量を抑えて時間を短縮できる - smp5-04.php - albumの中のdataに保存して、その一つを指定して成功、あくまでもPHP内にあるJPGのものしか縮小しないので、MySQLの中では使うことは難しくあまり使い道なし。- sm_1383872242.jpgができたようである。しかしほかの記録などでHTML内の画像を張り付けたりするときは便利かも - dc_library.phpとcd_library.phpの連携でalbumの中のDATAを選んで、縮小版を作るアプリを作製した

付録 phpMyAdminツールの活用

phpMyAdminの起動 - 1.1.5のXAMPPのトップページから起動、アドレスはhttp://localhost/phpmyadmin/ でおこなえる

データベースの選択 -

テーブルの選択 -

テーブル構造の変更 -

レコードの表示と編集 -

レコードの追加 - 挿入をクリック - これで画面を半分筒表示させて、Hotmailから貼り付けすれば効率的に行えるだろう

SQL文の発行
- テーブルのExport - Export - ExportのOptionを選択 - 実行 - 表示されたSQL文をコピーし、Editorにペーストしてファイルに保存 - そのSQL文を発行ページで実行
- テーブルのエキスポート - Exportをクリック - Exportのオプションを選択 - 実行する - テーブル生成やレコードの追加用のSQL文が画面に表示される - 画面上からコピーしてファイルとして保存