PHP – クエリによる結果の取得

概要

PHPからデータベースに接続した後、クエリを実行する手順は以下の通り。

  1. データベースへの接続で生成したPDOオブジェクトのqueryメソッドに、クエリの内容を与えて実行
  2. メソッドから返されるオブジェクト(PDO::PDOStatement)から、fetch()メソッドを使ってクエリの結果を引き出す

SELECT句の例

次のコードの14~19行でSELECT句をクエリとして渡し、その結果から内容を取り出している。

  • 14~15行目でPDOオブジェクトのquery()メソッドにSELECT句のクエリ内容を渡し、実行結果のPDOStatementオブジェクトを$resultに受け取っている
  • 16行目からのwhileループで、結果のレコードを一つずつフェッチしている
  • 17~18行目で、フェッチされたレコードの各カラムに対応する値を、フィールド名をキーとして指定して表示

実行結果は以下の通り。

06000 山形県
19000 山梨県
35000 山口県

SHOW TABLESの例

検索結果ではないが、コマンドのSHOW TABLESも同じように扱い、結果は一列のデータとして得られる。

実行結果は以下の通り。

pop_pref
pref_name
shop
test
test_score
test_sex
wholesale

PDOStatement::fetch()の引数について

省略可能な第1引数int $fetch_styleは、PDO::FETCH_*で指定する定数で、通常よく使われるのは以下。

  • PDO::FETCH_ASSOC→カラム名を指定する
  • PDO::FETCH_NUM→0から始まる整数でカラム番号を指定する
  • PDO::FETCH_BOTH→上記のいずれでも指定可能(省略時のデフォルト)

 

PHP – コマンドラインからの実行

PHPスクリプトのファイルをターミナルからコマンドラインで実行するには、PHPコマンドに-fオプションを付けてファイルを指定する。

たとえば次のようなphpファイルがあって、ファイル名がtest.phpだとする。

これを実行するには、以下のようにするとよい。

 

 

 

PHP – データベース接続

概要

MySQL 5では異なるデータベースシステムの違いを吸収するPDO(PHP Data Objects)が導入された。これによって、MySQL、PostgreSQLなど異なるDBMSでも、コンストラクタの表現を変えるだけで統一的に扱える。

簡単な例

MySQL上に、以下のようなテーブルtestがデータベースMY_DATABASEにあるとする。

WordPressのHTMLから、このデータベースに接続し、テーブルのデータを表示する例。

表示結果は以下の通り。

John 35 US
Alex 40 NZ
Luice 29 US
Alice 23 UK
Sala 25 JP

接続方法

PDOコンストラクタ

PDOコンストラクタで、データソース、ユーザ名、パスワードなどを指定して、データベースオブジェクトを取得する。

今回の例では、予め変数にそれらの値を設定しておき、データベースオブジェクトを構築している。

PDOコンストラクタの仕様は下記のとおり。

dsnはデータソース名で、データベースに接続するのに必要な情報が含まれる。

MySQLのデータソース名の構文は以下の通り(ポート番号は省略可能)。

usernamepasswordはその名の示す通りユーザ名とパスワード。

例外

データベースに接続できなかった時は、例外(PDOException)がスローされるので、try~catchで受ける。

日本語対応

日本語を正しく表示させるため、以下のクエリを入れておく。

接続の遮断

明示的にデータベースを閉じるため、PDOクラスのオブジェクトにNULLを代入する。

 

 

 

PHP – die()/exit()

 

概要

die()とexit()は同じ機能の別名で、そのスクリプトを含むページを表示させずに実行を停止する。停止時にページにメッセージを表示可能。

die()/exit()が実行されない場合

まず確認のために、次のページを表示させる。

この場合はHTMLの内容が普通に表示される。

php-when-not-died

die()/exit()が実行された場合

次に(ダミー)のところで、die()を実行させる。

 

 

 

この場合は次のように表示され、ページのほとんどが表示されていない。

php-when-died

 

PHP – 基本

基本構成

最も基本的な方法は以下の通り

  • 通常のHTMLの中にスクリプトを書く
  • ファイル名の拡張子は、通常は.php

スクリプトを外部ファイルにするには、require(-once)、include(-once)を使う。

WordPressの場合は、HTML中に直接スクリプトを書けないようなので、WordPressで準備された方法で外部ファイルを読み込む。

通常の方法でのPHPの例を新しいタブで示す。

スクリプトの開始と終了

一般的に、PHPは<?phpで開始し、?>で終了する。

複数行に渡る場合は、一行目に<?php、最終行に?>を配置する。

コメント

一行コメントは//#。複数行コメントは/*で開始し、*/で終了。

行の終了は';'

各行は必ず';'で終了させる。行の解釈が適切になされるなら、行の途中で改行してもよい。

変数

変数は'$'で始める

変数宣言や型宣言は不要

コード中で値を代入した時点で変数が確保され、値によって型が決まる。また、値を代入するたびに、その値に応じた型に変化する。

“可変変数”がある

変数名自体を他の変数に格納して、参照することができる。

通常の変数に文字列で他の変数名を代入し、参照時に'$$'とすることで、変数内容の文字列を変数名として、その内容が返される。

参照代入が可能

通常の代入は値がコピーされて渡されるが、=&で代入すると参照渡しとなる。

この例では$originalの内容を各変数に代入した後に値を変更しており、値代入した$copy_valの値は代入前と変わらず、参照代入した$copy_refの値は$originalと同じ値に変化する。

文字列

文字列の結合

文字列の結合にはドット(.)を使う。変数、文字列リテラルのほか、数値も文字列に変換されて結合される。

変数内での文字列展開

ダブルクォート(")やヒアドキュメント内では、変数は文字列として展開される。

変数前後の半角スペースは必須で、出力にも半角スペースが入る。これを回避するために、変数を{}で囲むことができる。

なお、シングルクォート(‘)を用いた場合は、変数としてではなく文字列表現として扱われる。

ヒアドキュメント

<<<によって、指定した文字列(ID)の間が連続した文字列として解釈される。

ヒアドキュメントの開始IDや終了IDの書くのにスペースやタブを入れてはいけない、終了ID行には';'以外書いてはいけない、などの条件があるので注意。

なお、ソースコードの改行位置で完全に連続せずに空白が入っているが、これはダブルクォートで文字列を分割した場合でも同じようになるので、WordPressの仕様か?

特殊文字やエスケープする文字の扱い

ダブルクォート(“)、シングルクォート(‘)、ヒアドキュメントの違い。

変数展開 特殊文字の扱い エスケープする文字
ダブルクォート(“) される 特殊文字 $ \ “
シングルクォート(‘) されない そのまま
ヒアドキュメント される 特殊文字 なし

 

Path2D

概要

Path2DはJavaScriptによるWeb APIの一つで、一連のサブパスを保持する。Path2Dの内容は後に一度に描画される。

コンストラクタ

Path2Dのコンストラクタは3種類。

Path2D()
空のPath2Dオブジェクトをつくる。
Path2D(path)
既存のPath2Dオブジェクトを複製する。
Path2D(d)
SVGパスの文字列を与えてオブジェクトをつくる。

パスの追加

addPath(path)
現在のパスにpathを追加する。

パスの操作

moveTo(x, y)
(x, y)の点に移動する。
lineTo(x, y)
現在の点から(x, y)の点まで直線を引く。
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
現在の点から(x, y)の点までベジエ曲線を描く。
quadraticCurveTo(cpx, cpy, x, y)
現在の点から(x, y)の点まで二次ベジエ曲線を描く。
arcTo(x1, y1, x2, y2, radius)
現在の点から、指定した制御点と半径で円弧を描く。
arc(x, y, radius, startAngle, endAngle, anticlockwise)
(x, y)を中心とした半径radiusの円弧を描く。startAndleが開始角、endAngleが終了角で、デフォルトは時計回りだがanticlockwiseをtrueにすると反時計回りに描く。
ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise)
(x, y)を中心とし、xyの2方向の半径を指定して楕円(弧)を描く。rotationは楕円全体の傾き。その他はarc()と同じ意味。
rect(x, y, width, height)
(x, y)から幅width、高さheightの長方形を描く。

 

BrythonでPath2Dオブジェクトを使う

Brythonでcanvasに描画をする場合、取得したcontextに直接描いていくほかに、Path2Dオブジェクトにサブパスを追加していってから最後に描くという方法がある(HTML5のcanvasを参照)。

BrythonにはPath2Dオブジェクトは実装されていないが、JavaScriptの組み込みクラスを扱う方法によって、Path2Dオブジェクトを使えるようになる。

 

 

BrythonでJavaScriptの組み込みクラスを使う

次の手順でBrythonからJavaScriptのクラスを直接使うことができる。JavaScript側の自作クラスをPythonで使う例はいくつか見かけたが、組込関数はどうかと思って試してみた。

  • browserモジュールからwindowオブジェクトをインポートする
  • JSConstructor()関数の引数にJavaScriptの組み込みクラスのコンストラクタを与えてPythonとしてのコンストラクタを得る
    • ()や引数はつけない
    • 引数に与えるJavaScriptのコンストラクタはwindowオブジェクトに属している
  • 上のコンストラクタを使ってインスタンスを生成

たとえばJavaScriptの組込クラスArrayを使ってみる。

Arrayオブジェクトをつくると、Pythonのリストとして生成されているらしい。メソッドも使えそう。

ところがtoString()メソッドを使おうとするとエラーに。

これを見ると、JavaScriptのコンストラクタを使っているが、Pythonではリストとして解釈されるので、メソッドが存在しない、とエラーになる。上のreverse()sort()は、JavaScriptのArrayクラスのメソッドではなく、Pythonのリストオブジェクトのメソッドとして解釈・実行されたということになる。

Pythonのクラスに定義されていないプロパティにアクセスした場合もエラーになる。

もともとBrythonに該当するものがないJavaScriptのクラスの場合。たとえばPath2Dをつくってみると、JSObjectでラップされたオブジェクトになっているらしい。

このPath2DオブジェクトのmoveTo()lineTo()といったメソッドは問題なく機能して、canvasに描画することができる。

 

Python3 – 関数の引数は値渡しか

参照渡しだが値は保護

以下のコードを実行すると、関数実行の前後で引数に渡した変数の値が影響を受けていない。挙動だけ見ると値渡し(call by value)だが、Pythonの関数引数は参照渡し(call by reference)だという。

実際には、引数を受け取った段階では、元の引数オブジェクトへの参照が渡されているが、その内容が変更されたときに新しいオブジェクトが生成され、元の変数の内容は保たれるらしい。

だが、時には関数に渡した引数の内容を、関数で変更したいような時がある(たとえばシステムの状態に関するフラグの変更など)。そのような変数をglobal定義してもよいが、やはり全体系への汚染のことを考えると気持ちはよくない。

リストを使った場合

以下の例では、要素を1つ持つリストをつくり、そのリストを関数に渡して、関数内でリストの要素の値を変更している。

リストなどのミュータブルなオブジェクトの場合、その内容が関数内での変更の影響を受けている。

クラスを使った場合

以下の例では、カウンタをプロパティに持つクラスをつくり、そのインスタンスを関数に渡して、関数内でインスタンスのカウンタの値を変更している。

変数の内容を特定の関数で変更させたい場合、リストよりもクラスを使った方が意味づけができてよいのではないか。

 

Brython – 日時とタイマ

このページでは、Brythonの外部スクリプトファイルを読み込んで実行している。ページのロード後にその時の日時が表示され、下のボタンを押すたびに現在時刻が1秒間隔で表示され、またそれが停止する。

このページのHTML部分は以下の通りで、ボタンと表示部、スクリプト読み込みが主要部分。

外部スクリプトの内容は以下の通り。global変数は使わず、timerを保持・表示するクラスを関数の引数に渡している。

また、timer.set_interval()の引数に関数を渡す際、インスタンスメソッドを渡すこともできる。

Brythonでのタイマの使い方についてはこちらを参照。