2012年3月28日水曜日

2012年03月28日 講義038日目

2012年03月28日
講義038日目
------------------------------1H------------------------------
★smarty
●smart復習
・$smarty.sessionは「smartyの予約変数」
・phpファイルからhtml部分をカット

・smartyのfetch関数を使うと他ページにある複数のロジックを扱える
・smartyで使えないphpの関数もあるので注意
------------------------------2H------------------------------
★smarty
●smarty復習
・配列のインデックスを引っ張るときに
例{$row.nickname|htmlspecialchars}
{$row.1|htmlspecialchars}
{$row.[1]|htmlspecialchars}
でも引っ張ってこれるが、連想配列の.○○○を使った方が分かりやすい
・includeを使ってheader部分を別の.tplファイルに持たせる
例{include file"header.tpl"}
を元のheaderがあった場所に記述
------------------------------3H------------------------------
★smarty
●smartyの関数
・$smarty->fetch関数
指定したテンプレートの出力結果を(文字列として)取得する関数
(テンプレートを表示するdisplayとは違う)
・article.tplを作成
index.tpl内の
{foreach from=$rows item=row key=keyname}~{/foreach}
を移動する
・.inc
includeするファイルの意味
・データベースのcommentテーブルにcategory_idカラムを追加する
index.phpに追記
5行目あたりに
include("./config/config.inc");
$cid = $_GET["cid"];
------------------------------4H------------------------------
★smarty
●カテゴリの実装
index.phpからarticle.tplへ
{*かつてindex.phpで出力していた処理をコメントアウト
<?php
while($row = mysql_fetch_array($result)) {
    print "<div class=\"commentBox\">";

    //urlカラムにデータが入っていたら名前にリンクを貼る
    if($row["url"]!=""){
        print "<a href=\"" . $row["url"] . "\" target=\"_blank\">";
        print nl2br(htmlspecialchars($row["nickname"]));
        print "</a>";
        print "さんの投稿<br>";
    }else{
        print nl2br(htmlspecialchars($row["nickname"]))."さんの投稿<br>";
    }

    //画像を出力する
    if($row["photo"] != ""){
        print "<img src=\"./img/".$row["photo"]."\" width=\"100\"><br>";
    }
    print nl2br(htmlspecialchars($row["content"]))."<br>";

    //年月日を装飾する
    //strtotime関数:文字列の日時をtime型に変える
    print date("Y年m月d日",strtotime($row["created_at"]))."<br>";



    print "<a href=\"reply.php?comment_id=".$row["id"]."\">返信する</a>";
    print "</div>";

    //返信用ループここから
    $sql = "SELECT * FROM reply
    WHERE comment_id = '".$row["id"].
    "' ORDER BY created_at ASC";
    $result_reply = mysql_query($sql);
    while($row_reply = mysql_fetch_array($result_reply)) {
        print "<div class=\"replyBox\">";
        print nl2br(htmlspecialchars($row_reply["nickname"]))."さんの返信<br>";
        print nl2br(htmlspecialchars($row_reply["content"]))."<br>";
        print $row_reply["created_at"]."<br>";
        print "</div>";
    }
    //返信用ループここまで
}
?>
*}
------------------------------5H------------------------------
★smarty
●カテゴリの実装
・phpのソースと連動しなければならないときは
$smarty->fetch関数を使う
動的でなければ
{includeでかまわない
・config.incをリネーム
直打ちしたときに内容が出ないようにconfig.inc.phpに変更
F2でリネーム
●関数の書き方
・引数を持つ関数もある
・予約変数
{$smarty.変数名.添字}
------------------------------6H------------------------------
★BBSの管理画面作成
●管理画面の実装
メンバーテーブルのpasswordカラムの後に、admin_ynカラムを追加する
データ型char(1)
ALTER TABLE member ADD admin_yn char(1) AFTER password;
sql文にadmin_ynを追加
        if($row[2] == "y"){
            $_SESSION["admin"] ="y";
        }else{
            $_SESSION["admin"] ="n";
        }
-----------------------------memo------------------------------
if文が複雑になるとマジでよくわからなくなる件
多分苦手意識が発生してるっぽいので改善する方向で

2012年3月27日火曜日

2012年03月27日 講義037日目

2012年03月27日
講義037日目
------------------------------1H------------------------------
★javascript
●jqury
・changeSpace.php
  jquery部分
<?php
$num = $_GET["num"];

if($num){
    echo "取得した数字は".$num."です";
}else{
    echo "数字ではないか、0です";
}

・HTML部分
<script type="text/javascript">
function getChangeSpace(){
$.ajax({type:'POST',
    dataType:'html',
    data:$(this).serialize(),
    success:function(i){
        $('#change_space').html(i);
    },
    url: "./changeSpace.php?num=3"
    });
}
</script>
------------------------------2H------------------------------
★javascript
●データベースに接続してみる
・jq.php
  jquery部分
function getChangeSpace(){
$.ajax({type:'POST',
    dataType:'html',
    data:$(this).serialize(),
    success:function(i){
        $('#change_space').html(i);
    },
    url: "./changeSpace.php?num=3&member_id=" + $("#member_id").val()
    });
}
</script>

・jq.php
  HTML部分
<button id= "ajaxiventtest" onclick="getChangeSpace()">
AJAXテスト</button>
<form action="">
<input type="text" id="member_id">
<button onclick="getChangeSpace();return false;">
IDを入力してクリック
</button>
</form>
<br>
<div id="change_space">
この位置が書き換わる
</div>

・changeSpace.php
$member_id = $_GET["member_id"];
if(member_id){
    mysql_connect("localhost", "ユーザ名","パスワード");
    mysql_select_db("study");
    $sql = "SELECT * FROM member WHERE id = ".$member_id;
    $result = mysql_query($sql);
    $row = mysql_fetch_array($result);
    echo "<br>入力された番号は".$row["nickname"]."さんです";
}
●サーバーのルートのパスの取り方
サーバー移行を前提としたルートのパスの取り方
・BBS/lib/mySubmitUtil
require_once(realpath(".") . "/lib/DbWrapper.class.php");

$web_root_path = substr($_SERVER['SCRIPT_FILENAME'] ,0 , -strlen($_SERVER['SCRIPT_NAME']));
require_once($web_root_path . "/lib/DbWrapper.class.php");

・substr()
・strlen()
  -をつけると後ろから
・$_SERVER['SCRIPT_FILENAME']
  動いてるファイル名を取得
  $_SERVER['SCRIPT_NAME']
  ホストから見た相対パスを取得

$SERVER['DOCUMENT_ROOT']でのルートの取り方は問題が発生する(サーバー)
------------------------------3H------------------------------
★smarty
●smarty
・拡張子.tpl
・smartyのlibsフォルダをプロジェクトの/直下にコピー
・プロジェクト/直下に以下のフォルダを作成
templates
templates_c
config
cache

require("./libs/Smarty.class.php");
$smarty = new Smarty;

・assign関数
テンプレート側で使う変数を渡す
・display
使用するテンプレートを指定
・tenplatesフォルダに
index.tplを作成
・index.php内のhtml部分を全て切り取りindex.tplへ

------------------------------4H------------------------------
★smarty
●smarty内で動的な処理を表現する
{}で括る
・->assign()
に入ってる変数を使えるようにする

<?php echo $_SESSION["nickname"];?>
さん、こんにちは | <a href="./logout.php">ログアウト</a>
</div>

{smarty.session.nickname}

<?php echo $_SESSION["submit_id"]?>

{smarty.session.submit_id}

・コメントアウト
{* *}

while($row = mysql_fetch_array($result)) {
    print "<div class=\"commentBox\">";

    //urlカラムにデータが入っていたら名前にリンクを貼る
    if($row["url"]!=""){
        print "<a href=\"" . $row["url"] . "\" target=\"_blank\">";
        print nl2br(htmlspecialchars($row["nickname"]));
        print "</a>";
        print "さんの投稿<br>";
    }else{
        print nl2br(htmlspecialchars($row["nickname"]))."さんの投稿<br>";
    }

    //画像を出力する
    if($row["photo"] != ""){
        print "<img src=\"./img/".$row["photo"]."\" width=\"100\"><br>";
    }
    print nl2br(htmlspecialchars($row["content"]))."<br>";

    //年月日を装飾する
    //strtotime関数:文字列の日時をtime型に変える
    print date("Y年m月d日",strtotime($row["created_at"]))."<br>";



    print "<a href=\"reply.php?comment_id=".$row["id"]."\">返信する</a>";
    print "</div>";
↓テンプレート化
{foreach from=$rows item=row key=keyname}
    <div class="commentBox">

    {* urlカラムにデータが入っていたら名前にリンクを貼る *}
    {if $row.url != ""}
        <a href="{$row.url}">
        {$row.nickname|htmlspecialchars}
        </a>
        さんの投稿<br>
    {else}
        {$row.nickname|htmlspecialchars}さんの投稿<br>
    {/if}

    {*画像を出力する*}
    {if $row.photo != ""}
        <img src="./img/{$row.photo}" width="100"><br>
    {/if}
    {$row.content|htmlspecialchars|nl2br}<br>

    {*
    //年月日を装飾する
    //strtotime関数:文字列の日時をtime型に変える
    print date("Y年m月d日",strtotime($row["created_at"]))."<br>";
    *}
    {$row.created_at|date_format:"%Y年%m月%e日"}<br>

    <a href="reply.php?comment_id={$row.id}">返信する</a>
    </div>
    {foreach from=$row.reply item=row_reply}
        <div class="replyBox">
        {$row_reply.nickname|htmlspecialchars} さんの返信<br>
        {$row_reply.content|htmlspecialchars|nl2br}<br>
        {$row_reply.created_at|date_format:"%Y年%m月%e日"}<br>
        </div>
    {/foreach}
{/foreach}

・foreach
from:ループの元になるデータ
item:ループの中で使う変数
key :ループの中で使うインデックス
・関数を使うときは|を関数前に置く
・$smarty->display("index.tpl");
使いたいテンプレートを出力
・テンプレートからテンプレートを呼び出すこともできる
------------------------------5H------------------------------
------------------------------6H------------------------------
★smarty
●submit.phpもテンプレート化する
-----------------------------memo------------------------------

2012年3月26日月曜日

2012年03月26日 講義036日目

2012年03月26日
講義036日目
------------------------------1H------------------------------
------------------------------2H------------------------------
★javascript
●前回の復習
●DOM
・ノード
文書に含まれる、属性、要素、テキストをオブジェクトとみなして扱う
DOMはこの「ノード」を抽出、追加、置換、削除するためのAPI

・getElementById()
idを元にして値を参照する
・getElementByName()
nameを元にして値を参照する
------------------------------3H------------------------------
★javascript
●javascript特有の記述方法
  ピリオドの後に関数
・.list
・.length
リスト配列の数
・.item
・.push
配列内に要素を入れる
・.join
・.val
・.text
------------------------------4H------------------------------
★javascript
●相対パスでノードを指定
・.childNodes

・.nodeType

------------------------------5H------------------------------
★javascript
●練習問題
------------------------------6H------------------------------
★javascript

・getElementsByName
name属性は同じになりえる、id一意
・「ページのソースを表示」
してもjavascriptの結果は反映されない
・検索エンジンはjavascriptを動かさない
・<script></script>タグ内であれば、<!-- -->でコメントアウトしても動く
ブラウザによっては文字列として扱ってしまうので、防ぐために行われるが
外部に持つほうが管理的にも推奨
・関数の多重定義ができない
ライブラリ内での競合などに注意

-----------------------------memo------------------------------

2012年3月23日金曜日

2012年03月23日 講義035日目

2012年03月23日
講義035日目
------------------------------1H------------------------------
★classの復習
●アロー演算子
・->
    クラス外でクラス内の関数を呼び出す
・$this->
    クラス内の変数た関数にアクセス
    自分自身のオブジェクトを使うことを表す
●public、protected、private
・public
省略するとpublicになる
アロー演算子で外部からアクセスできる
・protected、private
$thisを使ってクラス外からもアクセスできる
メンバ変数、functionに適応
●関数の利点
・classが別なら、各々のclass内に同じ関数が存在しててもエラーにならない
    newで新しくインスタンス化させるから
------------------------------2H------------------------------
★class
●BBS/replysubmitのクラス化

------------------------------3H------------------------------
★class

・$pathinfo = pathinfo(__FILE__);
  require_once($pathinfo["dirname"]."/MySubmitUtil.class.php");
pathinfo(__FILE__)で現在位置を取得
・require_once(realpath(".") . "/lib/MySubmitUtil.class.php");
realpath(".") で現在位置を取得
・static
functionの前にstaticをつけると、インスタンス化せずに呼び出せる
ただし、インスタンス化した際の「$this」や「->」が使えない
設定ファイル等で使用される
メンバ変数を書き換えたい処理はstaticにしない
メンバ変数を呼び出すような処理もstaticにしない
・::
スコープ定義演算子
クラス名::関数名
staticで定義した関数は::をつけないと呼び出せない
------------------------------4H------------------------------
★class

・self::
staticにおける$thisのようなもの
ただし、オブジェクトの値を保持できない
・parent::
親クラスの関数を参照する
同じクラスに同じ名前の関数があっても親クラスに呼びにいく

------------------------------5H------------------------------
★class
●テンプレートエンジン
classを使ったhtml部分の部品化
・submit.phpを
submit.php(php記述部分)と
web/submit.htmlに分解
・file_get_contents()
ファイルの内容を全て文字列に読み込む
(file()だと一行ごとに読み込む)
・str_replace()
検索文字列に一致したすべての文字列を置換する
(preg_replace())
・擬似テンプレートエンジン化させた
//submit.htmlを読み込んで、該当箇所を書き換える
$output = file_get_contents("./web/submit.html");
$output = str_replace("<templatetest1>",$_SESSION["nickname"],$output);
$output = str_replace("<templatetest2>",$submit_util->getMessage(),$output);
//最終的に$outputはブラウザに出力されるhtmlタグの文字列になる
echo $output;
・smarty
テンプレートエンジン
を使ってロジックとhtmlを切り分ける

・MVC
Model
→データベースと連動する処理
View
→出力画面
Controller
→ModelとViewを結びつける
WEBをモデル、ビュー、コントローラーに切り分ける考え方
------------------------------6H------------------------------
★javascript
●基本的な記述
<html>
<head>
<meta http-equiv="Content-Type" content="text/html:charset=UTF-8">
<title>Javascript</title>
</head>
<body>
<!--
<script type="text/javascript" src="/js/main.js"></script>
 -->
<a href="javascript:alert('test');">ポップアップ</a>

</body>
</html>
●イベントハンドラ
<script type="text/javascript">
function btnOnClick() {
    alert("クリックされました");
}
</script>
<button onclick="btnOnClick()">クリック</button>

●変数の定義
var 変数名 = 値;
-----------------------------memo------------------------------

2012年03月22日 講義034日目

2012年03月22日
講義034日目
------------------------------1H------------------------------
★class
  ●classについて
    ・管理が便利
    ・プロジェクトの規模が大きくなるほどクラス化のメリットがある
    ・オブジェクト指向
  ●classの記述方法
    ・変数(メンバ変数)と関数(メソッド)をパッケージングしたもの
  ●クラスとインスタンス
    ・鋳型(クラス)と実態(インスタンス)
  ●kiso.com/class/indexに記述
      <?php
      //クラス名の最初の文字は大文字
      class IdData {
          ■//メンバ変数を定義する
          protected $id = "10";

          ■//関数(メソッド)を定義する
          function getId() {
              //メンバー変数は$this->変数名という形で参照する
              return $this->id;
          }
          function setID($id) {
              $this->id = $id;
          }
      }
      ■//new : クラス定義を元にしてデータを取得(インスタンス化)
      $test = new IdData();
      ■//->クラス内の関数や変数にアクセスする
      echo $test->getId();
      $test->setId("33");
      echo "<br>";
      echo $test->getId();

      echo "<br>別のインスタンスを生成する<br>";
      $test2 = new IdData();
      echo "test2オブジェクトのID:" . $test2->getId() . "<br>";
      echo "testオブジェクトのID:" . $test->getId();
------------------------------2H------------------------------
★class
  ●kiso.com/class/humanに記述
      <?php
      ■//Humanクラスの作成
          ・public
              外部から参照できる
          ・protected
              外部から参照できない
              継承元でも参照できる
          ・private
              外部から参照できない
              自クラスのみ
      Class Human{
          //変数(メンバ変数)を定義
          public $name;
          private $address;
          //関数(メソッド)を定義
          public function setAddress($address){
              $this->address = $address;
          }
          public function getAddress(){
              return $this->address;
          }
      }

      ■//Humanクラスを継承、機能を引き継ぐ
      Class ChildHuman extends Human{
          private $age;
          public function setAge($age){
              $this->age = $age;
          }
          public function getAge(){
              return $this->age;
          }
      ■//親クラス、「Human」の関数を書き換える、オーバーライド。
        //親クラスの関数より優先される
          public function setAddress($address){
              //親クラスの処理を利用する「parent::」
              parent::setAddress($address. "在住");
          }
      }

      ■//インスタンスの生成
      $human = new Human();
      $human1 = new Human();
      //名前をセット
      $human->name = '鈴木';
      $human1->name = '佐藤';
      //住所をセット
      $human->setAddress('神奈川県藤沢市');
      $human1->setAddress('神奈川県横浜市');
      //住所を取り出して表示
      print $human->name."の住所は、".$human->getAddress()."です。\n";
      print $human1->name."の住所は、".$human1->getAddress()."です。\n";

  ●その他キーワード
    ・parent::親クラスを読み込む
    ・メンバ変数を作るときは、今は基本的にprotectedでいい
------------------------------3H------------------------------
★class
  ●コンストラクタ
    ・インスタンスが生成された時に必ず実行されるメソッドの事。
      (インスタンス生成が終了したときに実行されるメソッドをデストラクタ)
    ・print_r($human);でオブジェクトの中身を確認することができる
  ●練習問題
    ・練習問題1
        Dogクラスを定義し、コンストラクタで名前と種類を設定してください。
        Dog クラスに名前をゲットするメソッドを定義し、名前を表示してください。
          <?php
          //Dogクラスを定義し、コンストラクタで名前と種類を設定してください。
          //Dog クラスに名前をゲットするメソッドを定義し、名前を表示してください。
          Class Dog{
              protected $name;
              protected $type;
              function Dog($name, $type) {
                  $this->name = $name;
                  $this->type = $type;
              }
              function getName(){
                  return $this->name;
              }
          }

          $dog = new Dog("ジョン","柴犬");
          echo $dog->getName();
    ・練習問題2
      電卓クラスを定義し、コンストラクタで、2 つの数字を引数として渡し、
      メンバー変数に格納。
      メソッド、plus,minus,multiply,divisionを定義し、
      2 つの数字の足し算、引き算、掛け算、割り算の結果を取得し表示してください。
          <?php
          //電卓クラスを定義し、コンストラクタで、2 つの数字を引数として渡し、
          //メンバー変数に格納。
          //メソッド、plus,minus,multiply,divisionを定義し、
          //2 つの数字の足し算、引き算、掛け算、割り算の結果を取得し表示してください。
          Class Dentaku{
              protected $num1;
              protected $num2;
              function Dentaku($one,$two) {
                  $this->num1 = $one;
                  $this->num2 = $two;
              }
              function plus(){
                  return $this->num1 + $this->num2;
              }
              function minus(){
                  return $this->num1 - $this->num2;
              }
              function multiply(){
                  return $this->num1 * $this->num2;
              }
              function division(){
                  if($this->num2 == 0){
                      return 0;
                  }
                  return $this->num1 / $this->num2;
              }
          }

          $dentaku = new Dentaku("2","3");
          echo "足し算の結果:" .$dentaku->plus()."<br>";
          echo "引き算の結果:" .$dentaku->minus()."<br>";
          echo "掛け算の結果:" .$dentaku->multiply()."<br>";
          echo "割り算の結果:" .$dentaku->division()."<br>";
------------------------------4H------------------------------

  ●/BBS/lib/MySubmitUtil.class.php
    ・をclass化していく
  ●ctl+shift+F
    ・preiadesのショートカット、PHPのコードを自動で修正してくれる
      htmlが入ってるとやや不完全に修正する
------------------------------5H------------------------------
★BBSのできるところのクラス化
------------------------------6H------------------------------
★BBSのできるところのクラス化
-----------------------------memo------------------------------
クラスへの理解がいまいちだ
作って触って慣れていくしかない

2012年3月22日木曜日

2012年03月21日 講義033日目

2012年03月21日
講義033日目
------------------------------1H------------------------------
レンタルサーバーへ掲示板移行のバグ取り
------------------------------2H------------------------------
レンタルサーバーへ掲示板移行のバグ取り
------------------------------3H------------------------------
★レンタルサーバーへの掲示板移行
  ●アクセス権限
                    |オーナー|グループ|その他  |
    ・読み込み許可  |   ○   |   ○   |   ○   |
        read        |   4   |   4   |   4   |
    ・書き込み許可  |   ○   |   ×   |   ×   |
        write       |   2   |   2   |   2   |
    ・実行許可      |   ○   |   ○   |   ○   |
        execute     |   1   |   1   |   1   |
    webサーバーユーザーで、ファイルにアクセスする
    apacheユーザ等→その他に該当
  
  ●1から7の数字の組み合わせで権限を表現
      授業ではimgフォルダに対して、755→777に変更した
      FFFTPから属性変更することも可能
------------------------------4H------------------------------
★ファイル操作
  ●filesousaプロジェクトの作成
    ・SwitchHostを使用してhostsファイルの編集
        hostsファイルにfilesousa.comを追加
    ・http-vhostファイルの編集
        <VirtualHost *:80>
            DocumentRoot C:\pleiades\xampp\htdocs\filesousa
            ServerName filesousa.com
            <Directory "C:\pleiades\xampp\htdocs\filesousa">
                AllowOverride All
                Options -Includes -ExecCGI
            </Directory>
        </VirtualHost>
    ・htaccessの設定
        http-vhostファイルに書き込まれた<Directory></Directory>で囲まれた部分の内容は
        そのディレクトリに書き込まれたhtaccessが優先される
        普通はhtaccessで制御する
  ●mysqlのデータをCSVで吐き出してみる
      mysql> SELECT * FROM comment INTO OUTFILE "./export.csv" fields terminated by ',' ;
      C:\pleiades\xampp\mysql\dataに吐き出される
------------------------------5H------------------------------
★filesousa.com
  ●filesousa.comにdataフォルダを作成
          ・CSVで吐き出した./export.csvをコピー
        
          ・index.phpに記述
      <?php
      $csv = "./data/export.csv";
      $row = 1;
      if (($handle = fopen($csv, "r")) !== FALSE) {
          while (($data = fgetcsv($handle, 1000, ",")) !==FALSE) {
              $num = count($data);
              print $row. " 行目には".$num. "列あります<br />。";
              $row++;
              for ($i=0; $i < $num; $i++) {
                  print $data[$i] . "<br />\n";
              }
          }
          fclose($handle);
      }
  ●fopen関数、fgetcsv関数、fclose関数
    ・fopen関数
      ファイルを開くための関数
    fopen($csv, "r")
    "r"→読み込みのみ
    "w"→書き込みのみ
    "a"→で追加
    ・fgetcsv関数
    一行づつ読み込むので、ループさせて使う
    カンマで区切られた部分を配列として読み込む
    データのくくり文字(エンクロージャ)も指定できる
    fgetcsv($handle, 1000, ",")
    ・fclose関数
    一応操作が終了したら書いておくのを推奨
    大量の処理の場合に重くなったりする
    基本は開いたら閉じる
    if文を使って、
      ファイルを開いたら閉じる
      ファイルを開けなかったら動かない
    ようにする
  ●色々なデータの読み込み関数
  ・fgets,fputcsv,fputsなど
  ●リソース型
    上のソースの$handleに入ってる値はリソース型
    mysqlの時の$resultと同じ
------------------------------6H------------------------------
★filesousa.com
  ●練習問題
    ・自分で作成したデータベース内のテーブルのデータをcsv にエクスポートし、
      そのデータをHTMLのテーブルで表示するプログラムを作ってください。
    ・mysql> SELECT * FROM mone_grandprix INTO OUTFILE "./mone_gradprix.csv" fields terminated by ',' ;
      で吐き出したデータをfilesousa.com/dataフォルダへ
      <?php
      $csv = "../data/mone_grandprix.csv";
      if($handle = fopen($csv, "r")) {
          echo "<table>";
          while (($data = fgetcsv($handle,1000, ","))) {
              echo "<tr>";
              for($c=0; $c < count($data); $c++){
                  echo "<td>";
                  echo $data[$c];
                  echo "</td>";
              }
              echo "</tr>";
          }
          echo "</table>";
          fclose($handle);
      }
      ?>
  ●fputs関数
    ・テキストファイルの生成と追加ができるプログラム
      <?php
      $file_path = "../data/putfile.txt";

      if($handle = fopen($file_path, "a+")){
          if(!fputs($handle,"これはテストです\n")){
              echo"書き込みに失敗しました。<br>";
          }
          fclose($handle);
      }else{
          echo "ファイルオープンに失敗しました<br>";
      }

      echo "ファイルの書き込みを確認してください";
      ?>
      ページにアクセスするたびにテキストが増えていく
-----------------------------memo------------------------------

2012年03月19日 講義032日目

2012年03月19日
講義032日目
------------------------------1H------------------------------
★データベースを使ったウェブページ作成実習の補足と解説
  ●物理削除と論理削除
    ・物理削除
        実際に消すのでサルベージ不可
    ・論理削除
        DELETEでデータベースの内容を消すのではなく
        削除フラグカラムを用意して消えているものとみなす
  ●wrapper
    ・システムから見て、関数的な機能を持つ一塊の部分
        授業で作ったdbChoiceがそれにあたる
  ●投稿確認画面をリロードで同じ内容を再投稿してしまう問題の解決
  (いくつか方法がある)簡単な方法の例
    ・index.phpを改変
        //↓↓↓↓↓セッションIDを取得する部分↓↓↓↓↓
        $_SESSION["submit_id"] = session_id();//←セッションIDを取得する関数
        //$_SESSION["submit_id"];//表示テスト
        //↑
       
        <input type="hidden" name= "session_id" value=<?php echo $_SESSION["submit_id"]?>">
       
    ・submit.phpを改変
        //<!--↓↓↓↓↓セッションIDを書き換える部分↓↓↓↓↓-->
        if($_SESSION["submit_id"] != $_POST["session_id"]) {
            header("Location:http://localhost/bbs/index.php");
            return false;
        }
        //何度も投稿できないようにセッションIDを書き換える
        session_regenerate_id();
        $_SESSION["submit_id"] = session_id();
        //<!--↑↑↑↑↑セッションIDを書き換える部分↑↑↑↑↑-->
------------------------------2H------------------------------
★データベースを使ったウェブページ作成実習の補足と解説
  ●投稿確認画面をリロードで同じ内容を再投稿してしまう問題の解決
    →を関数化する
    BBS/myUtil.phpを改変
      function submitPageCheck(){
          //<!--↓↓↓↓↓セッションIDを書き換える部分↓↓↓↓↓-->
      if($_SESSION["submit_id"] != $_POST["session_id"]) {
          header("Location:http://localhost/bbs/index.php");
          return false;//exitはソースにはあまり使われない
          }else{
          //何度も投稿できないようにセッションIDを書き換える
          //再度読み込みすると書き換わったセッションによって
          session_regenerate_id();
          $_SESSION["submit_id"] = session_id();
          return true;
          //←セッションIDを取得する関数
          //<!--↑↑↑↑↑セッションIDを書き換える部分↑↑↑↑↑-->
          }
      }
  ●他のページにも適応させる
      ・submit.phpを改変
          関数化する前に関数があった場所に
          if(submitPageCheck()):
          ソースの終了に
          <?php endif;?>
      ・reprysubmit.php
          もsubmit.phpと同様に改変
      ・reply.phpもindex.phpと同様に改変
  ●session_regenerate_id();
      で毎ページごとに新しいセッションIDを書き換える手法もある
------------------------------3H------------------------------
★データベースを使ったウェブページ作成実習の補足と解説
  ●hogeについて
    ・プログラムのテスト用、一時的な変数によく使われる表現
  ●preg_macthについて
      検索をしてくれる関数
      正規表現、メールアドレスの正常性チェックとかにも使われる
      (メールアドレスの形になってるかどうか)
      詳しくはメール送信の講義
      →mb_send_mail関数
★外部に課題で作成したウェブページを置いてみる
  ●toypark
    ・MySQLが使えるので使ってみる
  ●BASIC認証
    ・pleiadesの直下(わかりやすい所)
      .htaccessというテキストファイルを作る
      作れない場合はa.htaccessなどと仮に作っておき、
      コマンドプロンプトで名前を変更
        C:\Documents and Settings\mis>cd c:\pleiades
        C:\pleiades>ren a.htaccess.txt .htaccess
      で変更する
    ・アクセス制御ができるファイル
    ・作った○○○.toypark.inのアドレスをブラウザに直に打つ
      このファイルを置き換えてページを作成してください。
      というメッセージが表示されるページを確認
------------------------------4H------------------------------
★外部に課題で作成したウェブページを置いてみる
  ●.htaccessに以下を記述
      AuthUserFile /home/vhosts/ryousyu-input.toypark.in/public_html/.htpasswd
      AuthName "Please enter your ID and password"
      AuthType Basic
      require valid-user
  ●.htaccessをサーバにアップロードする
    ・ファイルのアップロード画面に従いアップロードする
    ・作った○○○.toypark.inのアドレスをブラウザに直に打つ
      ログインの画面を出す
  ●.htpasswdの作成
    ・コマンドプロンプトC:\pleiades>cd c:\pleiades\xampp\apache\bin
        C:\pleiades>cd c:\pleiades\xampp\apache\bin
      →移動する
        C:\pleiades\xampp\apache\bin>htpasswd -c .htpasswd パスワード
        Automatically using MD5 format.
        New password: ******
        Re-type new password: ******
        Adding password for user ユーザ名
      →c:\pleiades\xampp\apache\bin内に.htpasswdファイルが作られてる事を確認
  ●.htpasswdのアップロード
●データベースにログインする
    http://www.toypark.in/phpmyadmin
    を直打ち
------------------------------5H------------------------------
★外部に課題で作成したウェブページを置いてみる
  ●講義で作ったBBSをアップロードする
    ・toyparkにソースを移行する
    ・toyparkのデータベースにテーブルを移行する
  ●データベースの移行
        member,comment,replyテーブルを.sqlにエクスポートする
    ・localhostにある自分のデータベースmyphpadminを開く
        エクスポートタブを選択し、必要事項にチェックを入れて実行する
    ・.sqlファイルを確認する
    ・toyparkのphpmyadminを使ってインポートする
  ●BBSファイルをコピーし改変する
     ・header関数を書き換える
        session.phpを
        header("Location:http://○○○.toypark.in/bbs/login.php");
        に書き換える
       
        login.php
        logout.php
        lib/myUtil.php
        の
        header("Location:http://localohst/bbs/index.php");
        を
        header("Location:http://○○○.toypark.in/bbs/index.php");
        に書き換える
     ・DBラッパーを書き換える
         lib/myUtil.php
        
         $username = "ユーザ名"
         $password = "パスワード"
         $dbname = "データベース名"
         ↓
         $username = "toyparkから発行されたMySQL ID"
         $password = "toyparkのDBに接続するためのpassword"
         $dbname = "toyparkから発行されたMySQL ID"
  ●FFFTP
    ・ホストの新規作成
      ホスト名→○○○.toypark.in
      ホスト名アドレス→○○○.toypark.in
      ユーザ名→○○○.toypark.in
      パスワード→○○○.toypark.inのパスワード
      を入力
    ・toyparkのブラウザ上でアップロードするより早い
    ・右側のファイルは編集可能なので注意する
  ●FTP接続→暗号化しない
    SFTP接続→暗号化するので安全
-----------------------------memo------------------------------

2012年03月16日 講義031日目

2012年03月16日
講義031日目
------------------------------1H------------------------------
------------------------------2H------------------------------
------------------------------3H------------------------------
------------------------------4H------------------------------
------------------------------5H------------------------------
------------------------------6H------------------------------
-----------------------------memo-----------------------------
データベースを使ったウェブページ発表会

2012年03月15日 講義030日目

2012年03月15日
講義030日目
------------------------------1H------------------------------
★職業能力基礎
  ●自己紹介テンプレート
    ・参照できるようにデータで取っておく
    ・履歴書、職務経歴書、ジョブカード等
    ・自分なりのテンプレート、自己分析内容
    ・転職サイトへの登録の土台につかう
  ●「志望動機を教えてください」の質問に対して
    ・説得力が必要→好きなこと、成功経験を元にする
    ・具体例を持っていく
    ・同業他社について
        自分が他にどこの会社の面接を受けたなどの情報は聞かれたら答える
    ・「何か質問はありますか?」に対して
        質問は必ずしたほうがいいので、予め聞きたいことを考えておく
    ・条件面、待遇面に関する質問をする場合
        条件や待遇だけを気にしてるという感じを出さないように他の質問内容と絡める
    ・今後の展望を用意しておく
        将来的な目標を示せるように
        ビジョンがはっきりしてることを示す
  ●職業能力基礎まとめ
      自己分析の内容
      各種資料、テンプレを作る
      ポジティブな内容にする
      面接官の立場を考える
------------------------------2H------------------------------
------------------------------3H------------------------------
------------------------------4H------------------------------
------------------------------5H------------------------------
------------------------------6H------------------------------
-----------------------------memo------------------------------
データベースを使ったウェブページ作成実習

2012年03月13日 講義029日目

2012年03月13日
講義029日目
------------------------------1H------------------------------
★職業能力基礎
  ●面接について
    ・五分~十分前には面接会場に到着しておく
    ・遅れそうなときは連絡を入れる
    ・事前に面接会場の場所を調べておく
  ●面接の流れ(面接官が後から来る場合)
    ・面接官が来たら、立ち上がって一礼
    ・「どうぞおかけください」と言われたら座って開始を待つ
    ・終了時「本日はどうもありがとうございます」「失礼します」で退席
  ●面接の流れ(面接官が既にいる場所に行く場合)
    ・面接官のいる部屋に入る
        ノックして「どうぞ」と言われたら「失礼します」と言ってドアを開く
        ドアは後ろ手で閉めない(ドアの方を向いて丁寧に閉める)
  ●面接時に良くある質問
    ・自己紹介してください
        名前
        年齢
        経歴(職務経歴>学習>交友、趣味など)長所短所、成功経験なども盛り込んでいく
        離職理由、転職理由は必ず聞かれるので答えられるようにしておく(ポジティブな内容にしてしまう)
        今後の展望
        (なるべくポジティブな内容で、職務経歴書の内容の拡充)
------------------------------2H------------------------------
★データベースを使ったwebサイト作成実習
------------------------------3H------------------------------
★データベースを使ったwebサイト作成実習
------------------------------4H------------------------------
★データベースを使ったwebサイト作成実習
------------------------------5H------------------------------
★データベースを使ったwebサイト作成実習
------------------------------6H------------------------------
★データベースを使ったwebサイト作成実習
-----------------------------memo------------------------------

2012年03月12日 講義028日目

2012年03月12日
講義028日目
------------------------------1H------------------------------
★職業能力基礎
  ●自己表現
    ・面接での第一印象は重要
        身だしなみ
        姿勢
        話し方→相槌、適度に笑顔
    ・その面接が駄目でも経験値になる
    ・自分が面接をする側だったらどういう点を見るかを考える
        良い印象
          目線を逸らさない
          本音を話してるかが伝わってくる
          Q&Aに明確に答えられる
        悪い印象
          目線を合わせない
          テンプレ通りの印象
          オープンにし過ぎてる
          誤魔化す対応
    ・失敗したと思ったら面接後、面接の印象を面接官に聞いてしまうのもアリ
    ・金銭面の質問事項は他の質問と上手く絡める
    ・相手の意見を肯定してから話す
------------------------------2H------------------------------
★MySQL復習
------------------------------3H------------------------------
★小テスト
------------------------------4H------------------------------
★データベースを使ったwebページ開発
------------------------------5H------------------------------
★データベースを使ったwebページ開発
------------------------------6H-------------------------------
★データベースを使ったwebページ開発
MySQL
NULLのSQL文
IS NULL
IS NOT NULL
-----------------------------memo------------------------------
さっぱり理解してないことが判明中でヤバめ
全てを下方修正してなんとか骨組みだけでも作りたい
それすらできるか微妙なライン
脳が働いてないのだけはわかる

2012年3月9日金曜日

2012年03月09日 講義027日目

2012年03月09日
講義027日目
------------------------------1H------------------------------
★職業能力基礎
  ●チームミーティング
    ・半年後に作れるようになりたい物の目標について
      他の人の作りたいものと、それに必要なものをヒアリング
    ・結論→~を作りますという宣言をする
------------------------------2H------------------------------
★ログアウト実装
  ●スタイルシートの適応
      <link href="./CSS/style.css"
          rel= "stylesheet"
          type= "text/css"
          media="all" />

  ●ログアウト実装
      <?php
      session_start();
      if($_SESSION["login"] == "y") {
          $_SESSION = array();
      }

      header("Location:http://localhost/bbs/index.php");
  ●フォルダ構造について
      基本はツリー構造にしながら作る
    ・index.phpのみがホストの直下に存在する
------------------------------3H------------------------------
★twitterのAPI導入
  ●APIについて
    ・処理をまとめたパッケージ
    ・関数と同じ意味で使われる事もある
    ・APIがどんな動きをするか読めるようにする
  ●
    ・index.phpのフォーム部分を改変
        <hr noshade size="1" />

        <div id="contentLeft">
        <form action= "submit.php" method="post" enctype="multipart/form-data">
        内容<br>
        <textarea name="content" cols="60" rows="10"></textarea><br>
        ニックネーム<br>
        <input type="text" name="nickname" size="20"><br>
        url<br>
        <input type="text" name="url" size="60"><br>
        画像<br>
        <input type="file" name="photo"><br>
        <input type="submit" name="send" value="投稿する">
        </form>
        </div>

        <div id="contentRight">
        </div>
        <div class="clr"></div>
    ・style.phpに追加
        #contentLeft {
        background-color:#888888;
        color:#fff;
        padding:20px;
        width:600px;
        float:left;
        height:400px;
        }

        #contentRight {
        background-color:#f4d47f;
        color:#fff;
        padding:20px;
        width:200px;
        float:left;
        height:400px;
        }

        .clr {
        clear:both;
        }
       
  ●twitterのウェジットの実装
      twitter公式のウィジットを生成するページに行く
      ユーザ名を入力して
    ・生成されたソースを
        <div id="contentRight">
        </div>
        の間に追加する
    ・ウィジットに合わせてCSSを調整する
        width:250px;に変更
------------------------------4H------------------------------
★データベースを使ったウェブページの作成実習
  ●作成条件
    ・データベースを使うこと
    ・二箇所以上のテーブルを使うこと
    ・自分で作った関数を使う
    ・作成期間3/15まで
    ・外部に公開できるようなものを目標に
    ・ドキュメントなどは著作権等をクリアしたものを前提に
  ●小テストについて
    ・配列
    ・関数
    ・データベース
    ・htmlも多少入ってくるかも
------------------------------5H------------------------------
★データベースを使ったウェブページの作成実習
  ●テーブル作成の例
    ・購入内容テーブル
        primary id 1
        shohin [1-2,2-5,12-1,18-1,20-4]
        ■resi-toテーブル
        primary id
        日付
        年齢
        合計金額カラム

        ■購入内容テーブル
        primary id 1
        買った人id 13172
        商品カラム シャーペン
        個数カラム 2

        primary id 2
        買った人id 13172
        商品カラム ノート
        個数カラム 1

        primary id 3
        買った人id 13172
        商品カラム 消しゴム
        個数カラム 3

        ■商品テーブル
        id 1
        商品命 シャーペン
        価格 300

      どのテーブルを基点にしてデータを管理するか
      実際に使われるデータをどこに配置するか
------------------------------6H------------------------------
★データベースを使ったウェブページの作成実習
  ●作ろうと思ってる内容
      以前のお問い合わせフォーム的なレシート入力サイトのバージョンアップ
      目標の優先順
      サイトの見た目をCSSを使ってある程度整える(CSSの学習)
      レシート画像のアップロード機能の実装
      ログイン画面、ログアウト画面の実装
      ユーザとユーザが入力した情報を管理する連携したテーブルの作成

      ----------------時間的に可能があればやりたいことの壁----------------

      入力した画像をgoogleドキュメントのOCR機能でテキスト化
      テキスト化したものをデータベースに格納

      ----------------やりたいけど技術的に微妙な壁(また次の課題に実装でいいんじゃね?の壁)----------------

      テキスト化したデータをPHPのロジックで分解し、
        各フォームに
            項目を入力
            商品名入力
            金額を入力
        合算する

      各入力されたデータまたは、合算された数字を元に
      PHPでメッセージを振り分けるロジックを作成
      ツイッターアカウントにメッセージを送る機能(送らないも選択可能)の実装
-----------------------------memo-----------------------------
cssへの苦手意識を今回の課題で克服しようと思う
データベースの構築は作りながら考える
危険な予感しかしない

2012年03月07日 講義026日目

2012年03月07日
講義026日目
------------------------------1H------------------------------
★職業能力基礎
  ●自己分析
    ・書類の書き方
        プラスに持っていく書き方
    ・自己紹介書
        内容は志望動機、職務経歴書、自己PR
        メールで履歴書を送る場合はメールに書き込んでも良い
        面接で使用する書類ではないので挨拶のようなもの
        履歴書の内容と一致するようにする
    ・添え状
        あるほうが好印象をもたれる可能性
        無くても問題は無い
        定型文でかまわない
    ・お礼状
        面接をしてもらったお礼に出す
        今後の抱負
        無くても問題は無い
        定型文でかまわない
    ☆定型文の使い回しの場合は、社名、日時、文章の内容に注意
      入社前に何かしらの事情で求職の立場ではなくなった場合、その旨を連絡する
    ☆面接や職務経歴書に書く内容は、公開情報のみ
    ☆資格を多く持つ人はスキルシートを用意して、採用担当が見やすくするも良い
  ●データで書類を作るときの注意点
    ・プリントアウトしやすいように作る
    ・相手が望んでるであろうファイル形式を確認して送る
------------------------------2H------------------------------
★掲示板拡張2
  ●php設定ファイル(php.ini)について
    ・magic_quotes_gpc= On(デフォルト)
        Onで特殊文字(\,'など)のエスケープ
        php5.3ではデフォルトでOffなので注意
  ●reply.php
    ・nl2br(htmlspecialcharsを反映
  ●strtotime関数
    ・文字列の日時をtime型に変える
        1970/1/1 00:00:00 からの秒数の形式:「time形式」
        time()で得られる値
    ・index.phpの$row["created_at"]を改変する
        strtotime($row["created_at"])
  ●date関数
    ・date("Y年m月d日",time形式のデータ)
    第二引数の形式を第一引数の形式に変えてくれる
    上のstrtotime($row["created_at"])を改変
    date("Y年m月d日",strtotime($row["created_at"]))
------------------------------3H------------------------------
★セッション
  ●接続情報を維持できる機能
    ・サーバ側、クライアント側に接続情報が維持されてる
        クライアント側ではcookieを利用
    ・Eclipseでsessionプロジェクトを作って動作を確認してみよう
        session1.php
        session2.php
        という名のphpファイルを作る
    ・$_SESSION
        スーパーグローバル関数
    ・session_start()
        セッション情報の参照が行える
        session1.phpに
          session_start();
          $_SESSION["name"] = "username";

      session2.phpに
      session_start();
      セッション関数
      ()にはIDの生成関数などを入れる
      print $_SESSION["name"] = "テスト";

      session2に接続して"name"が表示されないのを確認
      session1に接続してからsession2に接続すると"name"が表示される

  ●Live HTTP headersを使ってみる
      クッキーの部分をテキストファイルにコピーしてみる↓
      Cookie: ZDEDebuggerPresent=php,phtml,php3; PHPSESSID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      ↑の
      PHPSESSID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      部分を
      ブラウザ側ではクッキーで保持
      サーバー側ではtmpフォルダに保持

      定期的にサーバ側のセッション情報は消える(設定で変更可能)

      httpheaderのHTTP/1.1 200 OK
      から上が送ったデータ
      下が受け取ったデータ
------------------------------4H------------------------------
★ログイン機能の実装
  ●セッションを利用してログイン
    ・ログインしないとwebページの内容が見れないようにする
  ●テーブルを新たに作る
     ・以前のmemberテーブルを削除
         drop table member;で削除

     ・新しいmemberテーブルの作成
         create table member (
         id int not null auto_increment,
         nickname text,
         mailaddress text,
         password text,
         created_at datetime,
         primary key(id)
         );
     ・テストデータを挿入していく
         mysql> insert into member(nickname, mailaddress, password ,created_at)
             -> values("test_name1","test_adress1","test_pass1");
            
  ●/BBSにlogin.phpを作成
      session_start();
      if ($_SESSION["login"] != "y") {
          header("Location:http://localhost/bbs/login.php");
      }
      サーバ側のセッションに何もない場合はhttp://localhost/bbs/login.phpに飛ばす処理

      ☆header()関数を使った場合にはファイルの先頭に記述があるとエラーになるので注意

      PECL→PHP拡張パック
------------------------------5H------------------------------
★ログイン機能の実装
  ●index.php
      <?php
      session_start();
      $mailaddress = $_POST["mailaddress"];
      $password = $_POST["password"];
      if ($_POST["mailaddress"] != "" && $password != ""){
          $sql = "SELECT count(*) FROM member
                  WHERE mailaddress = \"".$mailaddress."\"
                  AND password = \"".$password."\"";
          //mysql に接続する
          $db = mysql_connect("localhost", "username", "password");
          //データベースを選択する
          $sdb = mysql_select_db("study");
          //クエリを送信する
          $result = mysql_query($sql);
          $row = mysql_fetch_row($result);
          if ($row[0] > 0) {
              $sql = "SELECT id nickname FROM member
                      WHERE mailaddress = \"".$mailaddress."\"
                      AND password = \"".mailaddress."\"";
              $result = mysql_fetch_row($result);
              $_SESSION["login"] = "y";
              $_SESSION["member_id"] = $row[0];
              $_SESSION["nickname"] = $row[1];
              //ログイン処理
              header("Location:http://localhost/bbs/index.php");
          } else {
              $error_msg ="エラーがあります";
          }
      } else {
          $error_msg = "エラーがあります";
      }
      ?>
------------------------------6H------------------------------
★ログイン機能の実装
  ●$_SERVER['HTTP_REFERER'];
    ・どのページからきたかの情報を持ってきてくれる変数
      <?php
      echo $_SERVER['HTTP_REFERER']."<br>";
      if($error_msg != "" && $_SERVER['HTTP_REFERER'] == "http://localhost/bbs/index.php"){
          print $error_msg;
      }
      ?>
  ●$_SERVER
    ・アクセスしてきた人の情報を持っていてくれる変数
   
  ●CSSに追記
    ・style.css
        .header {
        border-bottom:1px solid #ddd;
        padding-bottom:3px;
        margin-bottom:10px;
        text-align:right;
        }
    ・index
        <div class="header">
        <?php echo $_SESSION["nickname"];?>
        さん、こんにちは | <a href="./logout.php">ログアウト</a>
        </div>
-----------------------------memo------------------------------
なんかメモってあったんだけどなんだろうコレハ……
一応張っとくか……
    $error_msg = "空白の部分があります";
    if($mailaddress == ""){
      $error_msg . = "メールアドレスを入力してください";
    }
    if($password == "") {
        $error_msg .= "パスワードを入力してください";
    }
   
   
        if ($_POST["mailaddress"] == "" && $password != "" ) {
        echo "メールアドレスが入力されてません";
    }elseif($_POST["mailaddress"] != "" && $password == ""){
        echo "パスワードが入力されてません";
    }
    $error_msg = "パスワードとメールアドレスが入力されてません";

2012年3月7日水曜日

2012年03月06日 講義025日目

2012年03月06日
講義025日目
------------------------------1H------------------------------
★職業能力基礎
  ●履歴書、職務経歴書の書き方
    IT関連ならば、データで作成して構わない
    ・履歴書
        ツリー構造のトップの情報が書かれる箇所
        「職歴」欄の詳細は職務経歴書に書く
    ・職務経歴書
        まとめられる箇所(グループ企業内での移動など)は一つにまとめる
        職を転々としているイメージをなるべく持たれないようにする
        転職理由は答えられるようにしておく
        より詳細な業務内容、作業
        ハードウェア、ソフトウェア情報もここに書く
          例:OSはLinaxの仮想環境で、開発ツールxamppのpleiades
             webサービスを業務内容としているMis株式会社で
             内部アプリケーションの開発を行った
        就業していた社名に関しては、ありのまま書く(公開情報に限る)
        自分以外の個人情報は書くことは避ける       
  ●「長所」「短所」「成功経験」を元にして記述する
      基本、プラスの内容を記述する
      マイナスの内容を記述するならそれを補う内容も記述する
      自己PRの内容と志望動機はリンクする
      自分の意思が大事
      自己PR→志望動機という流れで文章を作る
        例:自分は~~に興味があり、~~という成功を収めてる
            なので、御社の業務を通じて~~を学び、~~になっていきます
    ・自己PR
        自分が何をしてきたか、どういう人間か
        自己紹介に近い
        職務経歴書に関係ないがアピールしたいこと
          例:趣味で作ったサイトの情報、URL
        学生時代の体験(実例を出せると良い)
    ・志望動機
        今後の展望、会社でやりたいこと
        業務内容に合わせるのではなく、自分の意思に合わせる
          例:自分のやりたいことが~~であり、業務内容に即してるので
        ×:業務内容の~~が自分のできる内容と考えたため
    ☆自己PR、志望動機は自己分析と密接に関わる
------------------------------2H------------------------------
★掲示板作成
  ●掲示板の機能追加
    ・htmlspecialchars();
        htmlやjavascriptの記述を無効化する関数
        テキストエリアの入力に制限をかける
    ・nl2br();
        改行コード<br>を挿入する関数
       
        例:print nl2br(htmlspecialchars($row_reply["content"]))."<br>";
            htmlspecialchars()が先に走ると挿入された<br>が無効化されるので注意する
    ・関数の入れ子は優先度を考え、テストしながら調整する
------------------------------3H------------------------------
★掲示板作成
  ●プログラミング言語
    ・低級言語
        マシン語に近い
    ・高級言語
        人間に近い
  ●掲示板拡張1
    ・commentテーブルにurlカラムを追加する
        ALTER TABLE comment ADD url TEXT AFTER content;
    ・フォームの追加
        url<br>
        <input type="text" name="url" size="60"><br>
    ・submit.phpで受け取る
        $url = $_POST["url"];
        を追加
    ・sqlにurlをinsertされるようにする
        INSERT文で受ける欄に追加
        $url . "','" .
    ・urlカラムにデータが入っていたら名前にリンクを貼る
            if($row["url"]!=""){
            print "<a href=\"" . $row["url"] . "\">";
            print nl2br(htmlspecialchars($row["nickname"]));
            print "</a>";
            print "さんの投稿<br>";
            }else{
            print nl2br(htmlspecialchars($row["nickname"]))."さんの投稿<br>";
        }       
------------------------------4H------------------------------
★掲示板拡張2
  ●画像を表示できるようにする
    ・photoカラムを増やす
    ALTER TABLE comment ADD photo TEXT AFTER url;

    ・フォームタグ改変
        <form action= "submit.php" method="post" enctype="multipart/form-data">
        画像<br>
        <input type="file" name="photo"><br>
    ・データベースにバイナリのカラムを作って保存
        早い
        引き出すのが少し面倒
   
    ・何かしらファイルを保存するフォルダを作って保存
        少し遅い
        直リンクできる
    ・submit.phpを改変
       ファイルを受ける
         $photo = $_FILES["photo"];
         $_FILES→スーパーグローバル変数
         Array
         (
             [name] => Water lilies.jpg
             [type] => image/jpeg
             [tmp_name] => C:\pleiades\xampp\tmp\php661.tmp←ここに一時的に保存される
             [error] => 0
             [size] => 83794
         )
         tmpフォルダに一時的に保存された
   
    ・画像をid順に保存する
        最後にinsertした行のIDを取得する
            $sql = "SELECT id FROM comment ORDER BY id DESC";
            $result = mysql_query($sql);
            $row = mysql_fetch_row($result);
           
    ・画像データを保存する
        if (is_uploaded_file($photo["tmp_name"])) {
            move_uploaded_file($photo["tmp_name"],"./img/".$row[0].".jpg");
            $sql = "UPDATE comment SET photo = \"".$row[0].".jpg\" WHERE id = ".$row[0];
            mysql_query($sql);

------------------------------5H------------------------------
★掲示板拡張2
  ●index.php
    ・画像を出力する
        if($row["photo"] != ""){
            print "<img src=\"./img/".$row["photo"]."\" width=\"100\"><br>";
    ・is_uploaded_file()
        アップロードされたファイルがあれば、ture無ければfalseを返す関数
        アップロードされたファイルの配列にある[tmp_name]があるか無いか
        ・move_uploaded_file(移動元,移動先)
        移動元に一時的に保存されてるtmpフォルダ
        移動先に保存したい場所
        uploaded関数はアップロードされてるかを見てる
------------------------------6H------------------------------
★掲示板拡張2
  ●企画 設計+プログラミング
    ・設計→データベースの構造、データの受け渡し
  ●$_FILES
    ・アップロードされたファイルの情報が配列で格納される
   
  ●テーブルのロック
    ・画像の投稿に際し、insertした行のIDを取得する時に
        同じ処理による競合を防ぐため、commentテーブルをロックする。
        //commentテーブルをロックする
        $sql = "LOCK TABLE comment WRITE";
        $result = mysql_query($sql);
    ・テーブルのロックの解除
        //commentテーブルのロックを解除する
        $sql = "UNLOCK TABLES";
        $result = mysql_query($sql);
       
"SELECT id FROM comment ORDER BY id DESC"で最後にinsertした行のIDを取得してるから
同時にデータベースにアクセスされた場合に画像データの保存先のパスが被ってしまう
なので、テーブルへのアクセスをロックしてIDの取得と保存先生成のタイミングに隙が無いようにできる

MySQLでユーザ名の権限を変更(root状態にできる)
GRANT ALL *(データベースに対する権限)*(テーブルに対する権限) (ユーザ名)
IDENTIFY (パスワード)
WITH GRANT OPTION
-----------------------------memo------------------------------
だんだん理解しなければならない範囲が増えてきた

2012年3月6日火曜日

2012年03月05日 講義024日目

2012年03月05日
講義024日目
------------------------------1H------------------------------
★職業能力基礎
  ●チームミーティング
    ・企業研究について
------------------------------2H------------------------------
★掲示板作成
  ●先週の説明
  ●MySQLに接続する部分を関数化
    ・BBSlib/myUtilにPHPファイルを作成
      以下の部分を関数化
        //mysqlに接続する
        $db = mysql_connect("localhost", "ユーザ名", "パスワード");
        //データベースを選択する
        $sdb = mysql_select_db("データベース名");
       
    ・dbChoice();関数を作る
   
    ・require_onceで読み込ませる
        index.phpにdbChoice();を読み込ませる
        require_once("lib/myUtil.php");
        dbChoice();
    ・初期値を入れておける
        function dbChoice($host="localhost",$username="ユーザ名",$password="パスワード",$dbname="データベース名"){
    //mysqlに接続する
    $db = mysql_connect($host, $username, $password);
    //データベースを選択する
    $sdb = mysql_select_db($dbname);
    }
------------------------------3H------------------------------
★掲示板作成
  ●関数に置き換える
    ・各ページの先頭部分で関数を呼び込む
        require_once("lib/myUtil.php");
        各ページにあるデータベース接続してる部分に
        dbChoice();
  ●エラーチェックの関数化
    ・戻り値(retune命令で戻す値は)
      $error_arr["error_yn"]
      $error_arr["nickname_error_yn"]
      $error_arr["content_error_yn"]
      $error_arr["content_worderror_yn"]
      で作る
      呼ぶ側のphpファイル、submit.phpとreply_submit.phpでは
      データの挿入やエラーメッセージの出力において
      条件分岐してるため、各項目のynを確認するために配列で取得
------------------------------4H------------------------------
★掲示板作成
  ●myUtil.phpのエラーチェック部分
      function errorCheck($nickname, $content) {
          //retrun用の配列「$rtn」を作成
          $rtn = array();

          //エラーフラグ
          $error_yn ="n";//エラーがあるかどうか
          $nickname_error_yn = "n";//ニックネームが入ってるか
          $content_error_yn = "n";//内容が入ってるか
          $content_worderror_yn = "n";//

          //エラーチェック
          if ($nickname == "") {
              $nickname_error_yn = "y";
              $error_yn = "y";
          }
          if ($content == ""){
              $content_error_yn = "y";
              $error_yn = "y";
          }
          //strpos関数は、最初に見つかった位置を返す
          //一番最初に該当する文字があった場合「0番目」となるので、
          //falseと!==で比較して、0と区別します
          if (strpos($content, "NGワード") !== false){
              $content_worderror_yn = "y";
              $error_yn = "y";
          }
          $rtn["error_yn"] = $error_yn;
          $rtn["nickname_error_yn"] = $nickname_error_yn;
          $rtn["content_error_yn"] = $content_error_yn;
          $rtn["content_worderror_yn"] = $content_worderror_yn;

          return $rtn;
      }
  ●submit.phpとreply_submit.phpの関数を受ける部分
      $error_arr = errorCheck($nickname, $content);
          $error_yn = $error_arr["error_yn"];
          $nickname_error_yn = $error_arr["nickname_error_yn"];
          $content_error_yn = $error_arr["content_error_yn"];
          $content_worderror_yn = $error_arr["content_worderror_yn"];
     クラス化すると戻り値の配列で受け取らなくても良くなるが、それはそのうち……
     今は戻り値の配列の内容を変数に各々入れることで処理
--------------------------------------------------------------
  ●関数について
    多重定義禁止→同じ関数名を二度使うのを禁止すること
    ・require_once()
        読み込みに多重定義禁止されてる処理があったら無視する
    ・reqiuire()
        require_once()に比べて軽い(ほとんど同じ)
    ・include_once()
    ・include()
------------------------------5H------------------------------
------------------------------6H------------------------------
★先行教室見学
-----------------------------memo------------------------------
なんとか理解できた

2012年3月5日月曜日

2012年03月02日 講義023日目

2012年03月02日
講義023日目
------------------------------1H------------------------------
★職業能力基礎
  ●自己分析
    ・成功経験
    ・会社分析
        求人の方法で、その企業のお金の使い方がわかる
        求人の更新日を確認、求人をいつも出している企業はリスクが高い傾向
------------------------------2H------------------------------
★掲示板作成
  ●CRUD
    ・「作成(Create)」「読み出し(Read)」「更新(Update)」「削除(Delete)」
  ●掲示板を作ろう
    ・新規PHPプロジェクトBBSを作成
    ・index.php
    ・submit.php
    ・reply.php
    ・reply_submit.php
  ●commnetテーブル
    ・MySQLでcommentテーブルを作る
        create table comment (
        id int not null auto_increment,
        nickname text,
        content text,
        created_at datetime,
        primary key(id)
        );
    ・カラムにいくつかデータを入力してみる
        mysql> insert into comment (nickname, content, created_at)
            -> values("user aaaa","ouououou","2011/02/10 10:55:02");
    ・commnetテーブルの内容
        +----+-----------+----------+---------------------+
        | id | nickname  | content  | created_at          |
        +----+-----------+----------+---------------------+
        |  1 | user aaaa | hallo!   | 2011-02-06 09:08:02 |
        |  2 | user bbbb | wwwwwww  | 2011-02-09 09:07:06 |
        |  3 | user aaaa | ouououou | 2011-02-10 10:55:02 |
        +----+-----------+----------+---------------------+
    ●replyテーブル
    ・MySQLでreplyテーブルを作る
        create table reply (
        id int not null auto_increment,
        comment_id int,
        nickname text,
        content text,
        created_at datetime,
        primary key(id)
        );
    ・comment_idにデータをいくつか入力
        comentテーブルに入力した内容でidが存在しないものも作ってみる
          comentテーブルに存在してる内容↓
          mysql>  insert into reply (comment_id,nickname, content, created_at) values("2",
          "user aaaa","yyyyyy","2011/02/10 10:58:08");
        comentテーブルに存在していない内容↓
          mysql>  insert into reply (comment_id,nickname, content, created_at) values("9",
          "user zzz","zzzzzzzzz","2011/02/12 12:58:08");
    ・replyテーブルの内容
        mysql> select * from reply;
        +----+------------+-----------+-----------+---------------------+
        | id | comment_id | nickname  | content   | created_at          |
        +----+------------+-----------+-----------+---------------------+
        |  1 |          2 | user aaaa | yyyyyy    | 2011-02-10 10:58:08 |
        |  2 |          9 | user zzz  | zzzzzzzzz | 2011-02-12 12:58:08 |
        |  3 |          1 | user aaaa | bbbbbbb   | 2011-02-13 13:58:08 |
        +----+------------+-----------+-----------+---------------------+
  ●index.phpのソース
      <?php
      //mysqlに接続する
      $db = mysql_connect("localhost", "ユーザ名", "パスワード");
      //データベースを選択する
      $sdb = mysql_select_db("データベース名");
      //クエリを送信する
      $sql = "SELECT * FROM comment order by created_at desc";
      $result =mysql_query($sql);
      ?>

      <html>
      <head>
      <title>SHONAN BBS</title>
      <meta http-equiv="content-type" content="text/html; charaset=utf-8" />
      <style type="text/css">
      body {
      font-size: 13px;
      }
      </style>
      </head>
      <body>
      <h1>SHONAN BBS</h1>
      <hr noshade size="1" />
      <?php
      while($row = mysql_fetch_array($result)) {
          print "<div style=\"border:1px solid #ddd;
                  marfin-bottom:10px:padding:5px;\">";
          print $row["nickname"]."さんの投稿<br>";
          print $row["content"]."<br>";
          print $row["created_at"]."<br>";
          print "<a href=\"reply.php?comment_id=".$row["id"]."\">返信する</a>";
          print "</div>";
      }
      ?>
      <hr noshade size="1" />
      <div style="text-align:center">SHONAN BBS</div>
      </body>
      </html>     
------------------------------3H------------------------------
★掲示板作成
  ●入力フォームを書き加える
      <form action= "submit.php" method="post">
      内容<br>
      <textarea name="content" cols="60" rows="10"></textarea><br>
      ニックネーム<br>
      <input type="text" name="nickname" size="20"><br>
      <input type="submit" name="send" value="投稿する">
      </form>
  ●submit.php作成
      <?php
        $content = $_POST["content"];
        $nickname = $_POST["nickname"];

    ・エラーフラグ
        $error_yn ="n";//エラーがあるかどうか
        $nickname_error_yn = "n";//ニックネームが入ってるか
        $content_error_yn = "n";//内容が入ってるか
        $content_worderror_yn = "n";//

    ・エラーチェック
        if ($nickname == "") {
            $nickname_error_yn = "y";
            $error_yn = "y";
        }
        if ($content == ""){
            $content_error_yn = "y";
            $error_yn = "y";
        }
    ・strpos関数は、最初に見つかった位置を返す
      一番最初に該当する文字があった場合「0番目」となるので、
        falseと!==で比較して、0と区別します
          if (strpos($content, "NGワード") !== false){
              $content_worderror_yn = "y";
              $error_yn = "y";
        }

    ・エラーがなかったらデータベースにデータを挿入
        if ($error_yn == "n") {
            //mysqlに接続する
            $db = mysql_connect("localhost","ユーザ名","パスワード");
            // データベースを選択する
            $sdb =mysql_select_db("データベース名");
            //クエリを送信する
            $sql = "INSERT INTO comment (nickname, content, created_at)
            values ('".
            $nickname."','".
            $content."','".
            date("Y-m-d H:i:s").
            "')";

            $result = mysql_query($sql);
        }
        ?>
    ・ここからHTML
        <html>
        <head>
        <title>SHONAN BBS</title>
        <meta http-equiv="content-type" content="text/html; charaset=utf-8" />
        <style type="text/css">
        body {
        font-size: 13px;
        }
        </style>
        </head>
        <body>
        <h1>SHONAN BBS</h1>
    ・エラーチェックロジック
        <?php
        if ($error_yn == "y") {
                print "エラーがあります。<br>";
            if($nickname_error_yn == "y") {
                print "ニックネームが入力されていません<br>";
            }
            if($content_error_yn == "y") {
                print "内容の入力がされていません<br>";
            }
            if($content_worderror_yn == "y") {
                print "不適切な文字が含まれています<br>";
            }
        } else {
            print "投稿が完了しました";
        }
        ?>
        <a href="index.php">戻る</a>
        </body>
        </html>
  ●date関数
    ・date("Y-m-d H:i:s",)
        date("得たい文字列",
        Y-m-d H:i:sの形でデータベースに渡す
------------------------------4H------------------------------
★掲示板作成
  ●返信用ループをつくる
    //返信用ループここから
    $sql = "SELECT * FROM reply
    WHERE comment_id = '".$row["id"].
    "' ORDER BY created_at DESC";
    $result_reply = mysql_query($sql);
    while($row_reply = mysql_fetch_array($result_reply)) {
        print "<div style=\"border:1px solid #ddd;
        marfin-bottom:10px:padding:5px;
        background-color:#f3f3f3;margin-left:40px;\">";
        print $row_reply["nickname"]."さんの返信<br>";
        print $row_reply["content"]."<br>";
        print $row_reply["created_at"]."<br>";
        print "</div>";
    }
    //返信用ループここまで
   
  ●CSSを外部に持たせる
    ・内部に書いていたstyle部分を外部に移す
        body {
        font-size: 13px;
        }

        .commentBox {
        border:1px solid #ddd;
        marfin-bottom:10px;
        padding:5px;
        }

        .replyBox {
        border:1px solid #ddd;
        marfin-bottom:10px:padding:5px;
        background-color:#f3f3f3;
        margin-left:40px;
        }

        #footer {
        text-align:center
        }
------------------------------5H------------------------------
★掲示板作成
  ●reply.phpの作成
    ・commentテーブルのcomment_id
        <?php
        $row = mysql_fetch_array($result);
        print "<div class=\"commentBox\">";
        print $row["nickname"]."さんの投稿<br>";
        print $row["content"]."<br>";
        print $row["created_at"]."<br>";
        print "</div>";
        ?>
         
    ・フォーム
        index.phpの流用
        <form action= "submit.php" method="post">
        内容<br>
        <textarea name="content" cols="60" rows="10"></textarea><br>
        ニックネーム<br>
        <input type="text" name="nickname" size="20"><br>
        <input type="submit" name="send" value="投稿する">
        </form>
            ・reply.phpからreply_submit.phpへ
        index.phpからの流用
------------------------------6H------------------------------
★掲示板作成
  ●reply_submit.php
    ・submit.phpからほぼ流用
        $comment_id = $_POST["comment_id"];
        を追加
 
    ・エラーチェックのロジック
      submit.phpからほぼ流用
        データベースのエラーがなかったらデータベースにデータを挿入
        if ($error_yn == "n") {
            //mysqlに接続する
            $db = mysql_connect("localhost","ユーザ名","パスワード");
            // データベースを選択する
            $sdb =mysql_select_db("データベース名");
            //クエリを送信する
            $sql = "INSERT INTO reply (comment_id, nickname, content, created_at)
            values ('".
            $comment_id ."','".
            $nickname ."','".
            $content ."','".
            date("Y-m-d H:i:s").
            "')";
-----------------------------memo------------------------------
プログラムの流れを追って理解する余裕がちょっと無い
メモ的に流れを書いておくべきかも