• 検索結果がありません。

目次

N/A
N/A
Protected

Academic year: 2021

シェア "目次"

Copied!
46
0
0

読み込み中.... (全文を見る)

全文

(1)

ウエブアプリケーション

PHP その1

2017/12/7

海谷 治彦

1

http://www0.info.kanagawa-u.ac.jp/~kaiya/wa/

dotcampus ショートコード 212834

(2)

目次

• サーバーサイド技術の位置付け (また復習) • PHP 概要 • 本日はPHPのプログラム言語としての側面に注視 • 関数 • 文字列 • 配列 • クラス • データベース接続 2

(3)

サーバーサイドの主な役割

• 検索,計算,データ保存や共有,手順のナビゲー ト,画面データの生成等 3 データ 検索 計算 生成 送受信 保存 復習+

(4)

サーバーサイドの具体的技術

• JavaによるJSP/Servlet • 銀行系等の大規模で信頼性の必要なシステム向け. • PHP • お手軽にサイトを作るサーバーサイド言語. • Cに似ている. • Ruby on Rails • もっとも有名はモダンフレームワーク.

• 伝統的なCGI (Common Gateway Interface)

• Perl, Ruby, C等でサーバー側処理をするもの. • いまどきは見かけない.

4

(5)

サーバーと対話

• HTTPリクエスト/レスポンスは複数回行われる. • 無論,JSも使えるが. • サーバー側のデータが使えるので,例えば,端末 を変えても処理が継続できる. • 途中まで大学でやって,あとは家のPCでやるとか. 5 ブラウザ JSプログラム ・ ・ ・ ・ ・ 入力画面準備 選択肢を送る 結果が返ってくる サーバー 側のデータ サーバー プログラム web storage等 復習

(6)

--サーバーとの対話

• ユーザーの入力手段 • form というタグを用いて,受け取りページを指定して, 自身の入力情報とともにHTTPリクエストを送る. • 無論,受け取りページは処理能力がなければいけない. (通常,PHPやServletで書かれる) • 出力手段 • 受け取りページに結果が埋め込まれた形で,HTTPレ スポンスが返ってくる. • その結果をブラウザが表示する. • 入力したページとは別のページに移動していることを注 意.(ページ遷移と呼ばれる) • サーバーもクライアントも一連のページであるという情報を(細 工無しでは)もっていない. 6 復習

(7)

Formの典型様式

7

<form action="http://www.example.com/form.php" method="post"> Topic:

<input type="text" name="topic" size="20"> <br>

<textarea rows="5" cols="22" name="feedback"> </textarea>

<br>

<input type="submit" value="send"> </form> メッセージを受け取るページを 指定.このページはリクエスト処 理の能力がないといけない. get もしくは post を指定. 違いは後述. ユーザーの入力値を最 終的に受け取りページ に送るための呪文. ユーザー入力場所の指 定.詳細は後述. ユーザー入力場所の指 定.詳細は後述. 復習

(8)

GETとPOST

• GET • 本来はサーバーからのデータ取得リクエストに用いる. • よって,クライアント側から原則データを送ることはできない. • しかし,URL自体にデータを付記することで,データを無理 やり送ることが可能となっている. • 送ったデータはURLを見ただけで丸見え. • POST • サーバーにデータを送る本来のリクエスト. • リクエストの本体(ヘッダーより下)に送るデータが付記される. • 一応,ぱっと見にはデータは見えないが,暗号化されていな いHTTPは簡単に傍受できるので,実際にはデータは丸見え. 8 復習

(9)

クライアントからデータを送る

• POSTを使えば任意のデータをサーバーに送れる. • しかし,パラメータ名と値の対として,データを送る のが一般的.(一般にkey-valueデータと呼ばれる) • 以下の arg1 と arg2 がそれぞれパラメータ名 • 以下の 7 と 5 がそれぞれの値 • サーバーは,これらパラメータの値に基づいて, サーバー側で計算(含む検索等)を行い,その結果 を新しいページとして返すのが普通. 9

(10)

PHPサンプルの動かし方

1. 仮想マシンを起動 2. 自分のユーザーの ~/public_html/ の下にサンプ ルが入った zip をダウンロード. 3. 当該zipを unzip 等で展開 10

(11)

TIPS

• /etc/httpd/conf/httpd.conf に以下の記述を追加するの をお勧めする. • public_html で検索すると, # <Directory /home/*/public_html> の行が見つかる. そのそばに以下を追加. httpd の再起動が必要. • index.html がなくても,ディレクトリ(フォルダ)内の html や php の一覧を表示することが可能となる. • セキュリティ上は好ましくないが,授業用の設定として はよいだろう. 11 <Directory /home/*/public_html> Options Indexes </Directory>

(12)

PHP vs JSP/Servlet

• JSP/Servlet • Javaで書いてあるので本格的なアプリケーション(特に MVCのモデルのModel部分)を構築できる. • 動作環境のセットアップがかなりメンドい. • 開発と配置もめんどい (IDEがあれば緩和される) • すくなくともコンパイル等が必要. • PHP • 所謂,スクリプト言語なので気軽に作れる. • 動作環境のセットアップも割りと楽. • 本格的なオブジェクト指向言語というわけではないので, アプリの保守が面倒になるかもしれない. 12

(13)

PHP

• スクリプト言語 (手動コンパイルは不要) • PerlやRuby同様,単独利用も可能らしいが,主に ウエブアプリのサーバーサイド言語として用いられ る. • 結構,バージョンアップが早い. • 本授業では,5.3.3 を用いる.コレはかなり古い. • 最新は 7 (6は存在しない) 13

(14)

ウエブページに挿入

• 拡張子は .php (で動くように設定してある) • 基本,HTML記述に部分的に php 処理を埋め込む感じ. • JavaScriptやJSPにノリが似ている. • 埋め込みタグは何種類かあるが,以下が一般的. <?php プログラムを書く ?> • 一番,一般的な書き方. <? プログラムを書く ?> • コレはデフォルトでは無効になっている書き方.

<script language="php"> プログラムを書く </script> • JavaScriptっぽい書き方.

• あくまで PHP はサーバーで実行されるため,ブラウザに届く 時には単なるHTMLである.

• JSPと同じ.

(15)

CやJavaと違う点

• 関数やクラスの名前において大文字/小文字の区 別をしない. • 変数名は区別する. • 変数には$をつける. • Perlやshellっぽい. • 変数宣言が無い.よって宣言時点での型指定もな い. • ちょっとJavaScriptっぽい. • 文法上,配列と連想配列の区別がほぼ無い. • globalキーワード. • 文字列の連接は . を使う.(+ではない) 15

(16)

特徴的な部分

• 変数名自体を変数にいれて指定することができる.

• $a="name" だとすると $$a は $name という変数を指す.

• 変数への参照,エリアス

• ちょっとポインタやリファレンスに似てる. • $name =& $anothername; とする.

• 外部のコードを読み込む: include と require

(17)

CやJavaと類似している点

• Java風のclassベースのオブジェクト指向である. • JavaScriptとは違う. • foreachスタイルのforが,foreach というキーワード で利用される. • 関数パラメータは,基本 call by value である. 17

(18)

関数: 概要

• 組み込み関数と自作の関数がある.

• 関数名に大文字小文字の区別が無い.

• 同じ関数でも異なるパラメータをとる定義ができる. • パラメータは,基本,call by value

• call by ref. したいのであれば,&をつける.

• 関数定義は入れ子にできるが,スコープに影響し ないので意味が無い. • 関数内の変数はスコープが効いてくる. • グローバル変数に関数からアクセスしたい場合に は,globalのキーワードを付ける. • static変数もある. 18

(19)

関数呼び出し失敗と die関数

• 関数呼び出しに失敗すると多くの場合,false を返 す. • よって, 関数呼び出し || die("なんか警告"); • という書き方で,失敗対処することが多い. 19

(20)

関数のパラメータ

• 基本,call by value である.

• call by reference にしたい場合には,& をつける. • デフォルト値を指定し,呼び出し時点にパラメータ

指定を一部省略することができる.

• 可変パラメータを指定できる.ちょっとCに似てる.

• funcParam.php

(21)

関数の返り値

• 基本,コピーを返す. • しかし,&をつけることで,返り値自体の参照を返 せる. • funcRet.php 21

(22)

文字列: 概要

• 文字列の指定法: "aa", 'aa' そして <<< • echo, print, printf, print_r

• 比較

• 便利な関数群

(23)

文字列の指定

• '文字列 • ' ¥' と ¥¥ 以外は,そのまま.変数等は展開されない. • "文字列" • 変数は展開される. • 各種,特殊文字が使える. • >>> • Here Document と呼ばれるらしい. • 例参照. • strDef.php 23

(24)

表示

• echo 複数の値の単純表示 • print 一つの表示 • printf Cのprintfにほぼ同じ • print_r 変数の情報を詳しく表示,特に配列やオブ ジェクト等. • var_dumpのほうがみやすいらしい. • 詳細は配列,オブジェクトのところにて. • 個別文字へのアクセス • strPrint.php 24

(25)

便利な関数群

• trim, ltrim, rtrim 前後の空白除去.

• strtoupper, strtolower 全大文字化,小文字化 • ucfirst, ucwords 語頭の大文字化

(26)

文字列の比較

• == と === • 前者は型の不一致を気にしない,後者は気にする. • 辞書式順序に従い,< <= > >= 等の比較もできる. • strcmpもある.(C同様) 26

(27)

その他,便利な関数

• explode • CSV等,特定のセパレータで区切られた文字列を,ば らして配列にする. • Perlのsplitと同じ. • sscanf • Cのsscanfに似ているが,結果を配列で返す. • strMisc.php 27

(28)

配列

• 配列にはインデックス配列(普通の配列)と連想配 列がある. • 配列の初期化 array() • 連想配列から変数へ変換 extract, その逆 compact • foreach($array as $v) • foreach($array as $k => $v) • 末尾への追加 • count($array) • array.php 28

(29)

PHPのクラス,インスタンス

• JavaScriptと比べれば,Javaに近いクラスベースのオブ ジェクト指向である. • しかし,以下のような差異がある. 1. PHPで予約されたメソッド名には __ が冒頭に付く. アンダーバーが二つです.

• __construct, __destruct, __sleep, __wakeup 等 2. メソッドに関するJava風のオーバーロードができない. 3. トレイト(trait)と呼ばれるクラスとは異なる再利用部 品. • ただし本授業でのバージョンでは利用できない 4. その他,微妙な言い回しの違い 29

(30)

サンプル classDef.php

• 適当なクラスを定義してインスタンスを操作する一 般的なコード.

• public, private等を省略すると public扱いらしい.

• Java風オーバーロードが無いのでちょっと不便かも. • Javaでは . によるメンバーアクセスだが,PHPでは -> • static メンバーへのアクセスが微妙に独特. • $this->member 30

(31)

Java風オーバーロード

• Java等の型を厳格に定義する言語では,同じ名前 だが,異なる引数の数と型,返り値の型を持つメ ソッドを同時に定義できる. • メソッド名が意味とすれば,同じ意味のメソッドは 同じ名前で扱えるので超便利. • PHPではコレはできない. 31 java.lang.String クラスでは 4個のindexOfメソッドが定義されている. ちなみに,コンストラクタも15種類定義されている.

(32)

static属性,定数

• クラス共通である属性,メソッドにはstaticをつける. • そのアクセスには, • クラス外からは クラス名::名前 • クラス内からは self::名前 • 定数はconstで宣言するが,自動的にstatic扱いに なる模様. • サンプル classStatic.php 32

(33)

継承,instanceof 演算子

• Java同様,extends で継承できる. • スーパークラスのメンバーは parent::名前 • 自クラスのメンバーは self::名前 でアクセス. • finalキーワードが付いたメソッドはオーバーライド できない. • $v instanceof クラス名 であるクラスのインスタンス か否かをチェックできる. • サンプル classExtend.php 33

(34)

インタフェース

• Java同様,複数のインタフェースをクラスで実装 (implements)できる. • 返り値,引数に型が無いので微妙に非力ではある が,まぁ,無いよりマシ. 34

(35)

抽象メソッド

• Java同様にあります.

(36)

Introspection

• Javaのreflectionに近い機構. • 内部検査という訳語がある模様だがお勧めしない.イ ントロスペクションでよいと思う. • C言語等では,関数名,変数名等のシンボルは,コン パイル後には原則消えてなくなってしまう.(アドレスに 置き換えられる) • 正確にはリンケージ後. • コンパイル時点でデバッグオプションを指定すれば残る. • JavaやPHPでは実行時でもシンボルを保持していため, 文字列を使い関数や変数を指定できる. • 特にPHPでは可変変数があるので,もともと Introspection に適しているといえる. • $x="user" において $$x を $user とみなす等. 36

(37)

クラス/オブジェクトのIntrospection

• クラスに定義されているメソッドや属性を列挙でき る. • あるオブジェクト(インスタンス)が何クラスのインス タンスなのかも調べられる. • サンプル classItrspct.php 37

(38)

シリアライズ Serialize

• オブジェクト(インスタンス)を単なるデータ列に変換す ること. • データ列に変換すると,ファイルに格納できたり,デー タ通信に基づき他マシンにオブジェクトを送付できたり して便利なことが多い. • 大抵のオブジェクト指向言語で利用可能な技術. • JavaだとBeansやXMLEncoder等がお手軽. • PHPでは以下の二つの関数で符号化/復号化できる. (別に暗号化はされてません.) • serialize • unserialize • サンプル classSerial.php • 対抗馬で json_encode, json_decodeってのがある. 38

(39)

データベース接続

• DBMS毎に接続する方法(mysql.php)とPDOと呼ば れる汎用ライブラリを使う方法がある. • サンプル pdoSelect.php にもあるが,データベース がオブジェクトになっているので,旧来法より使い 勝手がよい(かもしれない). 39

(40)

PDOの典型

• $db = new PDO(略) データベース接続のためのオブジェクトを作成. • $statement=$db->prepare(“SQL命令文字列"); SQL命令の準備 • $statement->execute(); SQL命令の実行 • あとは命令の種類によって,結果が獲得できたり, データベースを改変できたりする. 40

(41)

PDO で select

• pdoSelect.php を参照. • $statement->execute(); の後に,$statement->fetch() が偽になるまで,行をとってこれる. • 結果は連想配列と普通の配列の混合っぽく返る 模様. 41

(42)

PDO で insert

• pdoInsert.php を参照 • $db->prepare 時点で,:valname 等,後からパラ メータを割り付けるポイントをSQL命令にいれてお く. • bindParam で パラメータに実際に変数を割り付け る. • 変数じゃないとダメな模様,即値(定数など)や式はだめ. • その後,execute する. 42

(43)

PDO で delete

• pdoDelete.php を参照 • $db->prepare 時点で,:valname 等,後からパラ メータを割り付けるポイントをSQL命令にいれてお く. • bindParam で パラメータに実際に変数を割り付け る. • 変数じゃないとダメな模様,即値(定数など)や式はだめ. • その後,execute する. 43

(44)

phpデバッグのポイント

• エラー情報は /var/log/httpd/error_log に吐き出さ れる. • 上記は root でないと見られない. • 上記の log を見て,エラーの状況を調べる. 44

(45)

演習10

• mysqlにあるテーブル nameage から,最も age が 低い行を全削除する php ページを作成せよ. • 該当する行が複数あれば,それら全てを削除. • 最も小さい age の値をページに表示してもよいし, 無言でもよい. • ファイル名は ex10.php とせよ. • 対話的な処理ではないこと. • PDOを使うことが望ましい. • テストデータは適宜,mysqlコマンドから直接に入 力せよ,ウェブアプリで入力する必要は無い. 45

(46)

以上

参照

関連したドキュメント

このように資本主義経済における競争の作用を二つに分けたうえで, 『資本

断面が変化する個所には伸縮継目を設けるとともに、斜面部においては、継目部受け台とすべり止め

週に 1 回、1 時間程度の使用頻度の場合、2 年に一度を目安に点検をお勧め

が前スライドの (i)-(iii) を満たすとする.このとき,以下の3つの公理を 満たす整数を に対する degree ( 次数 ) といい, と書く..

次に我々の結果を述べるために Kronheimer の ALE gravitational instanton の構成 [Kronheimer] を復習する。なお,これ以降の section では dual space に induce され

【オランダ税関】 EU による ACXIS プロジェクト( AI を活用して、 X 線検査において自動で貨物内を検知するためのプロジェク

被保険者証等の記号及び番号を記載すること。 なお、記号と番号の間にスペース「・」又は「-」を挿入すること。

太宰治は誰でも楽しめることを保証すると同時に、自分の文学の追求を放棄していませ