2011年3月2日水曜日

3/2覚書

1時間目
今後の進捗についての説明。

バーチャルホストのリカバー(;´д`)トホホ…
今までのlocalhostからsmarty_sampleって場所に変更したよ。
そもそもバーチャルホストって何?
ひとつのIPアドレスに擬似的に複数のドメインをかぶせることができる。
複数のweb(localhostとかsmarty_sample)をPC内でいくつも使えるようにするのだー。

だが、ここで落とし穴。
Windows内でバーチャルホストを複数設置すると挙動が怪しくなる。
VM入れてLinuxで設定しよう。
ってなことで。
封 印(#でコメントアウト)

あとこぼれ話。
設定ファイルを書き換えるときは必ずバックアップを取ろう。
書き換える前のファイルを名前をつけて保存でBAK_とかつけて別名保存するだけ!

コレだけでトラブルのときにすぐ復旧できるよ!

2時間目
とりあえずプログラムってなに? PHPってなに?
資料みれ。すっごいわかりやすいから。
・JavaScriptでバリデート(エラーチェック。)
 ブラウザだけで処理するからサーバー負荷がない。
 でもJavaScriptはオフにできる。
 →実務ではJavaScript+PHP両方のバリデートを行う。

・Noticeエラーもっかい
 Smarty_sampleにnotice_test.php作成。
 以下入力。
$num = $num1 + $num2;
print $num;
$text = $_POST["text"];
print $text;
 
 んでphp.iniの
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATEDを
error_reporting = E_ALL
; & ~E_NOTICE & ~E_DEPRECATED
 に変更。;にするとコメントアウトする。
 Apache再起動。

すると、Notice: Undefined variable:~で 
num1、num2、textそれぞれに対してNoticeエラーが出る。
コレはプログラムゆえに、変数の指定がないぜ~って言ってる。
ここでは。
おとといも書いたけど、これが残っていると、どこに設定ファイルがあるのかモロバレ。
ハッキング等を受ける可能性があるのだ。
なのでちゃんと決めてあげないといけない。

んじゃどうするのか? 自分もわからんのでしっかり勉強。

$num1 = 0 ;//変数の指定
$num2 = 0 ;//変数の指定

$num = $num1 + $num2;
print $num;

$_POST["text"] = NULL;//変数の指定

$text = $_POST["text"];
print $text;

POST、GET、SESSION、連想配列でNoticeエラーが出ているときは、
変数の前に@をつけておくと回避ができる。
@$numとか。$text = @$_POST["text"]とか。
現場レベルで一般的だが、会社の方針に従おう。

ちなみにeclipceでは変数の指定がちゃんとできているとファイルの下にツリーが出る。
赤枠のところ。出ていない場合はNoticeエラーの疑い強し。


・公開領域再び
 ブラウザに設定ファイルは置きません。
 階層上げておかないと攻撃されちゃうよ;y=ー( ゚д゚)・∵. ターン

3時間目
テンプレートエンジンてなに?
めっちゃ簡潔に言うとclass(変数と定数と関数)ファイルの集合体。
smartyは変数をアサインするときは$不要。
$smarty->assign(‘title’, ‘Smarty-test’); //「Smarty-test」という文字列を、テンプレート
側で「$title」と書けば使用できるようにする
表示させるときは{$title}
Smartyがやってることを簡単に言うと・・・
PHPファイル(****.php = Model)で
assignした変数を
displayで指定したテンプレートファイル(****.tpl = View)で
使用できるようにする
(=assign変数をテンプレートファイルに渡す)
+α(ifやforeachの使用も可)

講座の中ではテンプレート群の記述は不要。デフォルトで設定済み。
(だからWEB講座にも記述がない)
テンプレート群は実務ではプロジェクトと同じ階層に置くため、記述が必要になる。

■eclipseのPHP内のHTML構文エラー非表示設定
設定 → 一般 → エディタ → 構造化テキストエディタ → 検証(青字リンク) →
HTML構文バリデータ、HTML構文バリデータ(PHPファイル用)のチェックを2つとも外す。

4時間目
ダウンロードしたsmarty_lessonをeclipceにインポート。
練習問題
1.配列
$gender = array ( "m" => "男", "f" => "女" ) ;
これをSmartyで表示するときは、
{$gender.m}と書く。
2.if文
genderの値が「f」だったら「女」と表示するロジックを追加してください
それ以外は「未選択」と表示するロジックを追加してください
$gender = "f" ;
■性別:
{if $gender == "m"}
男
{elseif $gender == "f"}
女
{else}
未選択
{/if}

3.foreach文 生phpでもいいような希ガス。んでも覚えておくのだ。
$pref[1] = "北海道" ;
$pref[2] = "青森県" ;
$pref[3] = "岩手県" ;

■住所:
<select name = "pref">
 <option value = "" selected>選択してください</option>
 {foreach from = $pref item = pref_name key = num}
 <option value = "{$num}">{$pref_name}</option>
 {/foreach}
</select>

{}(デリミタ、ブレス)の直後と直前に余計な半角スペースがあると正常に動作しない。

4.foreach+if文
【問題】
年、月、日をプルダウンで選択できるように表示してください
→foreachを使用する
→まず年を作成する
→うまくいったら同じ要領で月と日も作る

【発展問題】
→現在の日付とループの日付が一致したらデフォルト選択という条件式をつける
if文中にはPHPの関数を使うことができる
・今回は関数「date()」を使用する
→現在の年を求めるには…date("Y")
→現在の月を求めるには…date("m")
→現在の日を求めるには…date("d")

5時間目
date.php
//年の配列を生成
for ( $i = 2000; $i <= date("Y")+3; $i ++ ){//2000年~2014年まで
 $year_list[$i] = $i;
}
//月の配列を生成
for($j = 1; $j <= 12; $j ++){//12月
 $month_list[$j] = $j;
}
//日の配列を生成
for($k = 1; $k <= 31; $k ++){//31日まで
 $day_list[$k] = $k;
}

date.tpl

<form action="">
<select name = "year">
 {foreach from = $year_list item = year}
 <option value = "{$year}"{if date("Y") == $year} selected{/if}>{$year}</option>
 {/foreach}

</select>年
<select name = "month">
 <option value = "" selected>選択してください</option>
 {foreach from = $month_list item = month}
 <option value = "{$month}"{if date("m") == $month} selected{/if}>{$month}</option>
 {/foreach}
</select>月
<select name = "day">
 <option value = "" selected>選択してください</option>
 {foreach from = $day_list item = day}
 <option value = "{$day}"{if date("d") == $day} selected{/if}>{$day}</option>
 {/foreach}
</select>日
</form>

閉じ}のないphp文の記述を理解していなかった・・・・・・。
いいんちょの言葉が頭の中でリプレイする。

2011年3月1日火曜日

3/1覚書

1時間目は
クラスの概念再び。
クラス図。これは概念だからね。
親から子へ継承できるよ。

☆オブジェクト指向
オブジェクト指向の考え方で割りといい感じの説明
ここだけ読んでもおk。

飛び飛び過ぎてつらい・・・・・・。

2時間目
smarty入門っぽいサイト
早わかりsmarty
いずれは見ようウノウラボ

PHP-users メーリングリスト
不明点もちゃんと書けば教えてくれるよ。質問内容は質問者の文章を参考にどぞ。

いつかは行こうPHP勉強会

さてSmarty設置とバーチャルホスト設定。
eclipce、XAMPP起動して・・・・・・sample_templateって名前でプロジェクト作成。

ダウンロードしたLatest Stable Releaseの
Smarty 3.0.7 (.tar.gz) (.zip) February 11th, 2011のzipを保存して解凍。
そこからlibsフォルダをC:\pleiades\xampp\htdocs\smarty_sample(実際のフォルダね)へコピー。

C:\pleiades\xampp\apache\conf\extra\httpd-vhosts.confをエディタで開く。
そんで一番下の所をコピーしてその下に貼り付けて、以下に改変。
一緒に##NameVirtualHost *:80ってあるから、##取るよ!

## Smartyサンプル##
<VirtualHost *:80>
    DocumentRoot "c:/pleiades/xampp/htdocs/smarty_sample"
    ServerName smarty_sample
    Directoryindex index.php index.html
    
    <Directory "c:/pleiades/xampp/htdocs/smarty_sample">
        AllowOverride All
        Allow from All
    </Directory>
</VirtualHost>
保存したらXAMPPでApache再起動。


3時間目
C:\WINDOWS\system32\drivers\etc\hostsをエディタで開き、最下部に下記追加。
## Smarty サンプル
127.0.0.1 smarty_sample
http://smarty_sample/で開くかチェック。
現時点ではIndex of /ってページが出れば成功。
意味を知ろう
127.0.0.1 【ループバックアドレス】
127.0.0.1 自分のlocalhostのこと。
hostsファイル 【hosts file】
localhostのIPアドレスやホスト名が記述されたシステムファイル。
名前解決 【name resolution】
DNSのこと。

今までのBBSとか住所録もバーチャルホストに組み込んでみよう。
ていうかこれやらないと今までの課題が見れなくなる;
<VirtualHost *:80>
    DocumentRoot "c:/pleiades/xampp/htdocs/address_book"
    ServerName address_book

4時間目

テンプレートからHTMLを呼び出すよ。
まずは以下のフォルダを作るよー。
templatesフォルダの名称は好きにつけていいけど、慣例でコレが多い。
たまにtplって省略できる。
これらのフォルダは攻撃対象になりうるため、本当は公開領域に置かない。
置くならhtdocs以上のフォルダに置く。
* templates
* templates_c
* config
* cache

んでtemlpatesフォルダにhello.tplファイルを作成。
smaty_sample直下にhello.phpを作成。
内容は以下。
//sumarty.classを読み込み
require('./libs/Smarty.class.php');

//smartyクラスのインスタンスを作成
$smarty = new Smarty;

//テンプレートファイルの置き場所を指定
$smarty ->template_dir="./templetes";

//変換したテンプレートファイルが置かれる場所
//コンパイル・ディレクトリ
//実際に実行されるphpファイル
$smarty ->compile_dir="./templetes_c";

//assignで変数名と値をセット
$smarty ->assign("name","world");
//displayでブラウザに出力
$smarty ->display("hello.tpl");


そしたらhttp://smarty_sample/hello.phpを開くと、
Hello,world! って文字だけ出るよ。

サーバーサイドスクリプト/クライアントサイドスクリプト
呼んで字のごとく。

コンパイルって何?
ヒトが書いたプログラムを機械がわかる言葉01 00 10・・・・・・などに翻訳してあげること。

5時間目
tpl内に{* *}でコメントがかける。ソースにも出ない。

配列でやてみよう。
array.php
//sumarty.classを読み込み
require('./libs/Smarty.class.php');

//smartyクラスのインスタンスを作成
$smarty = new Smarty;

//テンプレートファイルの置き場所を指定
$smarty ->template_dir="./templetes";

//変換したテンプレートファイルが置かれる場所
//コンパイル・ディレクトリ
//実際に実行されるphpファイル
$smarty ->compile_dir="./templetes_c";

$smarty ->assign("arch",
    array(
    "PHP",
    "ASP.NET",
     array("JSP","サーブレット")
     )
   );
$smarty -> display("array.tpl");

array.tpl
サーバーサイド技術には{$arch[0]}、{$arch[1]}、のような技術があります。
連想配列の入れ子の表示方法がわからんかった・・・・・・;

2011年2月28日月曜日

2/28覚書

1時間目
☆クラス復習。

クラスの内容と実行ファイルを分けましょう。
includeさせるほうが一般的だし管理も楽。

ファイル名はHuman classなら、最初を大文字にしてHuman.class.phpとなる。

set_ini関数
ini_set()
レンタルサーバーで直接php.iniを触れないときに利用する。
いいんちょ曰く、この説明はいっちーが話していたそうな。
すまん覚えてない。

Notice: Undefinedとは、
未定義変数の場合の警告。エラーではないがあるとよろしくない。
デバッグ時にphp.iniの
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATEDを
error_reporting = E_ALL
; & ~E_NOTICE & ~E_DEPRECATED
に変更。;にするとコメントアウトする。

よろしくない理由はエラーが残っているとHTML以外のデータファイルの場所がわかり、
ハッキングなどの攻撃を受ける恐れがあり、防ぐための対処である。

授業の疑問。べたな書き方言うけどそこから勉強するんじゃねえの?

クラス継承
extendsというコードで継承させる。

目覚まし時計の行動を例に。
Tokei.class.php
MezamashiTokei.class.php
call_mezamashi_class.php

上記ファイル名で3つ作成。
call_mezamashi_class.phpをブラウザで出してみよう。

Tokei.class.php

<?php
class Tokei {
 function getTime(){
  return date('H:i:s');
 }
}
?>

MezamashiTokei.class.php

<?php
require_once('./class/Tokei.class.php');

class MezamashiTokei extends Tokei {

 function getTime(){
  return date('H時i分です');
 }

 function getBell(){
  return "リンリンリン!";
 }

}
?>

call_mezamashi_class.php

<?php
require_once('./class/MezamashiTokei.class.php');

$mezamashi = new MezamashiTokei();
print $mezamashi->getTime()."<br>";
print $mezamashi->getBell();

?>

Tokei.class.phpのgetTime()が、
MezamashiTokei.class.phpのgetTime()に上書きされている。
実際にMezamashiTokei.class.phpの下記部分を/*~*/で囲うとわかるよ。
function getTime(){
return date('H時i分です');
}

関数の上書きをオーバーライブというそうな。

privateとpublic
アクセス件の一種。何も書かなければpublicとして扱われる。
※基本Functionの前にprivate置くことはありません。class内の宣言とは違います。

ここから引用。
PHP5のアクセス制御にprivate、protected、publicがあります。
それぞれの違いを明記しておきます。
private そのクラスからしかアクセスできない
protected そのクラスと、サブクラスからしかアクセスできない
public どこからでもアクセスできる

ごめん。privateとpublicをつけてやるの聞いてなかった。
あれはアクセス権を理解するための処理にしかすぎない、と思ってしまいますた。
つうか同時に存在するクラスってその時点でクラス分けるべきだとおもうのだ。

Javaでの参考情報。とほほのWWW入門から修飾子
ていうかクラス図ってまたJavaですか。
UMLの概念を常に持ってほしいってことですね。
自分も忘れかけてたので再度紹介。
astah* community無償のUMLモデリングツール。せっきー紹介。
まあ、初日ですから。

2011年2月25日金曜日

2/25覚書

今日で拡張最後。
何とか更新まではこぎつけたものの、最後のエラーチェックが通らない・・・
管理者判定。これ便利だなあ。直リンク防止用だね。

ユーザー情報更新処理まではできなかったなぁ;

くわっちょお疲れ様!!
来週から見守ってて~

AAずれご容赦を;


。 ◇◎。o.:O☆οo.
。:゜ ◎::O☆∧_∧☆。∂:o゜
/。○。 ∂(*゚ー゚)O◇。☆
/  ◎| ̄ ̄∪ ̄∪ ̄ ̄ ̄|:◎:
/    ☆。|。.:*・ありがとう・:*..:。|☆
▼       。○..io.。◇.☆____| 。.:
∠▲―――――☆ :∂io☆ ゜◎∂:.

2011年2月24日木曜日

2/24覚書

今日も今日とてログイン処理。
そして何とかできたupass_update。たぶん。
でもソース長いよ。それでもよければどぞ。

session_start();

//セッションハイジャック対策
session_regenerate_id(true);

require "./include.php";

//ログインチェック処理読み込み
require_once "./ctr/login_ctr.php";

//エラーチェック読み込み
require_once './include_errorcheck.php';

$n1password = $_POST["n1password"];
$n2password = $_POST["n2password"];
$password = $_POST["password"];

$sql ="SELECT * FROM user WHERE user_id = '".$_SESSION["user_id"]."'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);

//旧パスワード判定と代入
if($password !="" || $password !=NULL){
  if ($row["password"] == $password) {
   $_SESSION["password"] = $row["password"];

  }else{
   if ($row["password"] != $password) {
    $error_msg["ecpass"]= "パスワードが違います";
    $error_yn = "y";
    }
   }


  if($n1password == $n2password){
   $_SESSION["n1password"] = $n1password;
   $_SESSION["n2password"] = $n2password;
   header("Location:./upass_complete.php");
   //print "デバッグ用目印。使うときはheaderに//をつける";
   exit;

  }else{
   if($n1password != $n2password){
    $error_msg["e1pass"]= "パスワードが一致しません";
    $error_yn = "y";
    }
   }
}

print_r($sql);
print_r($_SESSION);
print_r($_POST);
?>

<!DOCTYPE br PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ユーザーパスワード変更画面</title>
</head>
<body>
  <h1>ユーザーパスワード変更画面</h1>
 <table border=0  cellspacing="0" cellpadding="5" Align=Center>
  <tr>
  <td>
   <?php echo $_SESSION["user_nickname"] . "さんでログインしています" ?>
  </td>
  <td>
    権限:<?php echo $authority[$_SESSION["authority"]]?>
  </td>
  <td>
     <a href="./ctr/logout_ctr.php">ログアウト</a>
  </td>
  </tr>
  </table>
 <hr noshade size="1">
 <hr noshade size="1">
  <!-- ユーザーパスワード変更画面 -->

 <form action = "upass_update.php" method = "POST" >
  <table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333" Align="center">
  <tr>
   <td>現在のパスワードを入力してください<br><span style="color : #2f4f4f; font-size : 9pt">4文字以上8文字以内</span></td>
   <td>
   <!--現パスワード -->
   <input type = "password" name = "password" value = "" /><br>
   <span style="color : red; font-size : 9pt"><?php echo $error_msg["epass"]; ?></span>
   <br>
   <span style="color : red; font-size : 9pt"><?php echo $error_msg["ecpass"]; ?></span>
   </td>
  </tr>
  <tr>
   <td>新しいパスワードを入力してください<br><span style="color : #2f4f4f; font-size : 9pt">4文字以上8文字以内</span></td>
   <td>
   <!--名 -->
   <input type = "password" name = "n1password" value = "" /><br>
   <!-- エラーメッセージの表示 -->
   <span style="color : red; font-size : 9pt"><?php echo $error_msg["e1pass"]; ?></span>
   <br>
   <span style="color : red; font-size : 9pt"><?php echo $error_msg["e2pass"]; ?></span>
   </td>
  </tr>
  <tr>
   <td>もう一度新しいパスワードを入力してください<br><span style="color : #2f4f4f; font-size : 9pt">4文字以上8文字以内</span></td>
   <td>
   <!--フリガナ姓-->
   <input type = "password" name = "n2password" value = "" /><br>
   <br>
   <!-- エラーメッセージの表示 -->
   <span style="color : red; font-size : 9pt"><?php echo $error_msg["e1pass"]; ?></span>
 </td>
 </tr>
</table>
 <input type = "submit" name = "send" value = "変更" />
 </form>
 <hr noshade size="1">
</body>
</html>

2011年2月22日火曜日

2/22覚書

今日も1時間目から実習。
ループしてログアウトできない・・・・・・昼直前まで検索等行うも解決ならず、くわっちょにHELP。
したらあったよおかしいところ。
//session開始
session_start();

//セッションハイジャック対策
session_regenerate_id(true);

//データベース読み込み
require "./include.php";

//ユーザー名とパスワードが一致したらPOSTに格納
if($_POST["user_name"] !="" || $_POST["user_name"] !=NULL){
 $user_name = $_POST["user_name"];
}
if($_POST["password"] !="" || $_POST["user_name"] !=NULL){
 $password = $_POST["password"];
}
//XSS対策
$user_name = hg($_POST["user_name"]);
$password = hg($_POST["password"]);

require_once './include_errorcheck.php';

//print_r($_POST);

//ユーザー名を指定検索することでif判定と同等の処理。
$sql ="SELECT * FROM user WHERE del_flg=0 AND user_name ='".$user_name."'";
 $result = mysql_query($sql);
//上記が通らないとデータが出ない。
//$row = mysql_fetch_array($result);
//print ($error_msg["euname"]);

//if($row["password"] == $password){
//上の$resultは抜けていたが、NULL判定がないために、
//『$passwordは空欄で正しい』という処理になっていた。

//$resultできたらパスワード判定と代入

if($row = mysql_fetch_array($result)){
 if ($row["password"] == $password) {
 $_SESSION["user_name"] = $row["user_name"];
 $_SESSION["user_nickname"] = $row["user_nickname"];
 $_SESSION["authority"] = $row["authority"];
 header("Location: ./menu.php");
 exit;
 //print "デバッグ用目印。使うときはheaderに//をつける";
 }else{
 if($row != mysql_fetch_array($result)){
  $error_msg["euname"]= "ユーザーが確認できません。";
  $error_yn = "y";
 }

  if($row["password"] != $password){
   $error_msg["epass"]= "パスワードが間違っています";
   $error_yn = "y";
  }
 }
}

うー、とりあえずなんとか。
ユーザー名だけが合って、パスワードが間違ってたら×
エラーの言葉おかしいような気もするが、今日はログインここまで。
気分転換にmenuの表示判定。
<h2 Align=Center>メニュー</h2>
<table border=0  cellspacing="0" cellpadding="5" Align=Center>
 <tr>
 <td>
  <?php echo $_SESSION["user_nickname"] . "さんでログインしています" ?>
 </td>
 <td>
   権限:<?php echo $authority[$_SESSION["authority"]]?>
 </td>
 <td>
    <a href="./ctr/logout_ctr.php">ログアウト</a>
 </td>
 </tr>
 <tr>
 <td>
  <ul type="circle">
  <?php if($_SESSION["authority"] ==1){?>
   <li><a href="./index.php">一覧表示</a></li>
   <li><a href="./upass_update.php">パスワードの変更</a></li>
  <?php }else{?>
   <li><a href="./index.php">一覧表示(新規登録・更新・削除)</a>span予定</li>
   <li><a href="./upass_update.php">パスワードの変更</a></li>
   <li><a href="./user_insert.php">ユーザーの登録</a></li>
  <?php }?>
  </ul>
 </td>
 </tr>
</table>

明日はindexでのユーザーと管理者の表示判定・・・・・・
あー、やっぱし変数化がほしいいぃいい><

2011年2月21日月曜日

2/21覚書

1時間目からsession認証実習。
相変わらずループで出ないなあ・・・・・・。
2時間目
昨日のダメージが今頃戻ってきた。いっぱい寝たのに眠気と戦い。

3時間目以降も一緒なのだけれど。
やぎーにifで変数にしたuser_nameとpasswordが一致したら遷移を教えてもらって、
やってみたら、エラー処理は入れてないけど、insertしていないIDははじく。
なぜかでけた。

しかし一歩進んで二歩下がる。
メニュー画面でニックネームと権限表示。
$rowでいいのかなー。

あれ、いつの間にかまたログインできない;
くわっちょ救援隊出動で直った。
//session開始
session_start();

//セッションハイジャック対策
session_regenerate_id(true);

//データベース読み込み
require "./include.php";

$user_name = hg($_POST["user_name"]);
$password = hg($_POST["password"]);

//ユーザー名を指定検索することでif判定と同等の処理。
$sql ="SELECT * FROM user WHERE user_name ='".$user_name."'";
$result = mysql_query($sql);

//上記が通らないとデータが出ない。
$row = mysql_fetch_array($result);

if($row["password"] == $password){
 $_SESSION["user_name"] = $user_name;
 header("Location: ./menu.php");
 //print "デバッグ用目印。使うときはheaderに//をつける";
}
//エラーMSG
$error_msg["ename"]="ユーザー名が見つかりません";
$error_msg["epass"]="パスワードが一致しません";

?>

また一歩(ry

session破棄できない(´;ω;`)ウッ…
今日はあきらめて、またあした~