インストール各種

Windows10へのインストール

PHP

20210105

ダウンロード・インストール

  1. php.netのdownlodasページへ
  2. Current Stable PHPのWindows downloadsリンク
  3. VC15 x64 Non Thread SafeのZipファイルをダウンロード
    • 7.4.13
  4. 任意のフォルダーにzipファイルの内容をコピー

設定

  1. コントロールパネル…システム詳細で環境変数PATHにPHPへのパスを追加
  2. php.ini
    1. php.ini-developmentファイルかphp.ini-productionをコピーしてファイル名をphp.iniに変更
    2. extension_dir = "ext"(相対パス or 絶対パス)
    3. 必要な;extensionsのコメントを外す(あるいは確認する)
      • extension=mbstring
    4. ;date.timezoneのコメントを外して日本のタイムゾーンを指定する
      • date.timezone = Asia/Tokyo

PHPサーバーの起動

コンソールで以下を入力

サーバーの収量はCTRL-C

MySQL

202101015

ダウンロード・インストール

  1. MySQLのダウンロードページへ
  2. MySQL Installer for Windowsへ移動
  3. Windows (x86, 32-bit), MSI Installerをダウンロード
    • 8.0.22/405.2Mファイル版
  4. Developper Defaultを選択
  5. 途中、Visual C++ Redistributable for Visual Studio 2019が必要になるのでインストール(一部manualのものは無視)

 初期設定

  1. Type and Networkingダイアログ
    1. Development machineを選択
    2. TCP/IP、PORT:3306のままNext
  2. Accounts and Rolesダイアログ
    1. rootのパスワードを設定してNext
  3. Windows Serviceダイアログ
    1. Configure MySQL as a Window Serviceはチェック
    2. Start the MySQL Server at System Startupのチェックをはずす
    3. 「手動」にはなるがWindows起動後のport listeningでMySQLサーバーも動き出してしまう
    4. Standard System Accountを選択したままでNext
  4. 以降Next/Finish
  5. Connect to Serverダイアログ
    1. ユーザー名rootで設定したパスワードでcheck
    2. 問題なければ以降Nexzt/Finish

PHP設定

  1. php.iniのextension=mysqliのコメントを外す

起動確認

  1. MySQLのCommandl Line Clientを実行
  2. rootパスワードを入力
  3. 終了はexit

phpmyadmin

20200106

ダウンロード・インストール

  1. phpmyadmin.netのサイトへ
  2. 最新版のDownloadをクリックしてファイルをダウンロード
  3. サーバーのドキュメントルートにmyphpadminディレクトリーをつくり、zipファイルの内容をコピー

起動

  1. サーバー起動/実行中確認
  2. ブラウ/\ザーにURL入力してphpmyadminを起動
    • http://localhost:8000/phpmyadmin/ など
    • 最後のバックスラッシュ/は必須らしい
  3. MySQLのユーザー名とパスワードを入力

 

PHP – 雛形 – 入力された内容を残す

概要

普通にHTMLのinput要素などを書くと、GETやPOSTのたびにそれらがvalueなしで描きなおされるので、内容が空になる。これに対してsubmit後に元に入力した値が残るようにする手順。

普通に書くと消える

以下のコードでは、送信ボタンを押すと入力した内容が表示されるが、テキストボックスの内容は毎回消えてしまう。

これはinput要素のvalue属性がないため、POSTのたびに再描画されるときに要素が空として描かれるため。

valueを設定すると値を残せる

input要素のvalue属性に前の入力内容を渡せば、その内容で要素が描かれるため値が残る。

  • POSTされた際にPHPコードの変数は初期状態に戻る(undefinedか初期設定値に戻る)
  • ただしHTMLのinput要素が再描画されるまでは、その要素の内容は残っている
  • そこで、正常に入力が取得された場合にはinput要素のvalue属性の値に入力された値を渡せば、描画時にその値が残される

ただし、GETやPOST後の状態によってvalueにセットする変数がundefinedだとエラーになるため、どのような状態でも変数が定義済みとなるようにしておく必要がある。

以下のコードでは、POSTされた場合はisset()がtrueかfalseかそれぞれの場合に、POSTされずに実行された場合(最初に実行された場合など)にvalueにセットする値を定義している。

エラー処理などで値を残す

GET/POSTされた値の内容によってエラーとする場合にも、エラーとなったその値を残しておける。コード実行の最初にinput要素から取得した値を変数に持っておいて、その内容のままvalue属性の値として渡せばよい(もちろん例外対応は必要)。

以下のコードは、数値入力欄が数値以外の場合エラーとしているが、その入力内容はテキストボックスに残る。

 

PHP – 雛形 – MySQLのクォート

概要

SQLでは一般にシングルクォート(')やダブルクォート(")で文字列を囲う。

テキストの内容としてクォートを含む場合、そのまま記述したりテキストボックスの入力内容をそのまま使ってしまうと文字列境界との区別がつかず、エラーが発生してしまう。

そこでSQLデータの書き込み時に、SQLとして適切に解釈可能なようにエスケープする必要がある。

シングルクォートのエスケープ

SQLエスケープ

SQL標準では、シングルクォートを文字として扱う場合にクォートを2つ連続させる('')

PHPからSQLを操作する際にシングルクォートを含む文字列をリテラルとして扱う場合、以下のような方法がある。

  1. query文字列をダブルクォート(")で囲う
  2. テキストリテラルをシングルクォート(')で囲う
  3. テキストリテラル中のシングルクォートはこれを2回続けて('')SQL標準でエスケープする

定義済み関数によるエスケープ

PHPの文字列として扱う場合、シングルクォートをバックスラッシュでエスケープすることができる(\')。この場合、リテラルの解釈後には1文字のシングルクォートとして扱われる。また、テキストボックスに入力された文字列にクォートが入っているケースも考えられる。

ところで、このような文字列をそのままquery構文に渡してしまうとSQLが文字列境界として扱うので不都合が生じる。そこで、PHPに準備されたエスケープ用の関数を使う。この関数の手続き型の構文は以下の通り。

$escaped_string = mysqli_real_escape_string($dblink, $original_string);

第1引数にmysqli_connect()で得られるデータベースリンクが必要な点に注意。

たとえばターゲットの文字列をPHPの変数として扱う場合、以下の手順が考えられる。

  1. クォートを含む可能性がある文字列をmysqli_real_escape_string()関数でエスケープする
    • リテラルとして文字列を準備する場合は、シングルクォートで囲い、文字列中のシングルクォートをバックスラッシュでエスケープする
  2. queryに文字列変数を渡す際に
    1. 文字列変数の内容がシングルクォートで囲われるようにする
    2. そのため、文字列前後の構文をダブルクォートで囲う

ダブルクォートのエスケープ

ダブルクォートもSQLでは文字列境界として扱われるので、queryの構文中にリテラルで書くとエラーとなる。

テキストボックスなどからの入力の場合はそのままmysqli_real_escape_string()でエスケープするといいが、リテラルの場合は全体をシングルクォートで囲ってやるとよい。

読み込み時

エスケープされた文字列がSQLで保存されると、クォートが1つずつの文字列として記録されている。それらを含むテキストをフェッチして変数に代入すると、適正に表示される。

 

PHP – 雛形 – MySQL操作(mysqli)

概要

PHPからデータベースを操作する手続きの大枠は以下の通り。

  1. DBサーバー・DBに接続してDBリンクを取得
    $db_link =mysql_connect()
    if($db_link)で接続成功/失敗処理

  2. 文字コードを設定する
    mysqli_set_charset()
  3. query文字列によりDBから絞り込んだデータを取得
    mysqli_query()
    →処理内容によって戻り値に注意
  4. DBから1レコードずつ取り出す
    mysqli_fetch_array()/mysqli_fetch_assoc()
  5. レコード内のカラムデータをキーを介して利用
    →カラム名をキーとした連想配列など
  6. SELECTなど結果セットがある場合はメモリーを解放(INSERTの場合は不要)
    mysqli_free_result()
  7. データベースリンクをクローズ
    mysqli_close()

データベースを最初に指定する場合

MySQLに接続後にDBを選択/変更する場合

 

PHP – str_replace~文字列の置換

概要

str_replace()は文字列中の対象文字列を指定した文字列に置き換える。

str_replace($search, $replace, $string);

$searchは置き換えられる文字列、$replaceは置き換える文字列、$stringは対象文字列。

基本形

文字列の変換

以下の例は、対象文字列中の’ab’を’AB’に変換している。

半角スペースの削除

以下の例では、文字列中の半角スペースを全て削除している。trimと異なり、文字列中のすべてのスペースを削除。

全角スペースの削除

全角スペースを削除する例。

全角文字の置換

全角文字も問題なく検索・置換できる。

複数文字列の置換

複数の文字列の同一文字列への置換

第1引数を文字列の配列にすると、各要素文字列の何れかに該当すれば第2引数に置き換えられる。

これを利用して、文字列が半角スペースと全角スペースだけで構成されていないかチェックができる。

if (str_replace([' ', ' '], "") === '') {}

複数の文字列セットの置換

第1引数と第2引数を配列にすると、対応する要素によって置換される。

 

PHP – trim/ltrim/rtrim

概要

trim系の関数は、指定した文字列の先頭・末尾のスペースや区切り文字など以下の文字を取り除く。

  • " " (ASCII 32 (0x20)), 通常の空白
  • "\t" (ASCII 9 (0x09)), タブ
  • "\n" (ASCII 10 (0x0A)), リターン
  • "\r" (ASCII 13 (0x0D)), 改行
  • "\0" (ASCII 0 (0x00)), NULバイト
  • "\v" (ASCII 11 (0x0B)), 垂直タブ

全角のスペースが削除されない、全角文字の場合うまく機能しないなどの制約がある。半角・全角のスペース削除や全角文字列の削除はうまく機能しない。

基本形

trim()は先頭と末尾を、ltrim()は先頭、rtrim()は末尾をトリムする。

  • 先頭/末尾に連続した対象文字は全て削除される
  • 他の文字に挟まれた先頭/末尾以外の対象文字は削除されない

全角スペースは削除されない

指定した文字列でトリム

第2引数でトリムする文字列を指定できる。1文字である必要はない。

全角文字はうまく動作しない

以下の例では、末尾文字列は削除されているが、先頭文字列はうまく削除されていない。

 

MySQL – チートシート

表示

縦表示にする

\G

通常;(セミコロン)で終わるところを\Gとすることで、各カラムを縦方向順番に表示してくれる。

追加

レコードの追加

フィールドを指定して追加する

INSERT INTO table(col1, col2, ...) VALUES (val1, val2, ...);

※フィールド、データが1つの場合も()が必要。

フィールドの追加

ALTER TABLE table ADD col type init;

ALTER TABLE table ADD col type NOT NULL DEFAULT default;

削除

レコードの削除

条件を指定して削除する

DELETE FROM table WHERE condition;

conditionの条件に合う行をtableから削除する。WHERE句を指定しない場合はtableから全レコードが削除されてしまうので注意。

全レコードを削除する

DELETE FROM table;

フィールドの削除

ALTER TABLE table DROP FROM col;

ユーザーの追加

CREATE USER 'user'@'host' IDENTIFIED BY 'password';

検索・抽出

SELECT文を使う。SELECT文では()は不要。

列を選択して全レコードを抽出

全ての列を選択して全レコードを抽出する

SELECT * FROM table;

列を指定して全レコードを抽出する

SELECT col1, col2, ... FROM table;

条件によるレコード抽出

数値条件

SELECT col1, col2, ... FROM table WHERE col <op> num;

演算子<op>の種類

= 等しい
<> 等しくない
<, > より小さい、より大きい
<=, >= 以上、以下
A BETWEEN B AND C AはB以上C以下
A IN (val1, val2, ...) Aはリストの要素val1, val2, …の何れか
S LIKE 'string' 文字列Sが’string’に合致

文字列条件

SELECT col1, col2, ... FROM table WHERE col LIKE str;

ワイルドカードの種類

% 0文字以上の文字列
_ 任意の1文字(半角・全角を問わない)

※後方一致、部分一致は処理速度が遅い。

論理演算子

! a, NOT a aの否定
a AND b, a && b aかつb
a OR b, a || b aまたはb
a XOR b aとbの排他論理和

データの変更

条件に合うレコードの指定したフィールドを変更

UPDATE table SET col = new_value WHERE condition;

WHERE句をセットしないと全レコードのデータが変更されてしまうので、基本的にWHERE句でレコードを絞り込む。

ソート~並べ替え

SELECT col1, col2, ...
FROM table ORDER BY col ASC/DESC;

colのデータで昇順/降順に並べ替えた結果を返す。

複数のカラムを指定すると、先頭から順にグルーピングされてソート(並べ替え~ORDER BY)。

グループ化

SELECT col, function(col), ... FROM table GROUP BY col;

GROUP BYで指定したフィールドの内容によってレコードをグループ化する。

  • フィールド指定の場合はグループ先頭のフィールドが抽出される
  • フィールド関数指定の場合はグループごとに関数が適用される

Tips/Troubleshooting

エイリアス

SELECT ... FROM table AS alias;

FROMJOINでテーブルを指定する際にエイリアスを定義し、それより前のSELECTでもエイリアスを使うことができる。以下は2つのテーブルの内部結合の例。

また、フィールドにエイリアスを定義できる。フィールド演算結果にエイリアスを定義すればフィールド名として扱われる。

SELECT COL AS alias FROM ...

エイリアスを定義した場合、元の名前は使えなくなる。

サブクエリー

SELECT alias.col, ... FROM (SELECT ... FROM ...) as alias;

SELECTによるクエリーをサブクエリーとして親のSELECTの検索対象とする場合は、サブクエリーにエイリアスが必要。このときサブクエリーのSELECTの要素にエイリアスを定義して親のクエリーで参照可能。

空白を含むフィールド名

フィールド名に空白が含まれる場合はバッククォートで囲む。

SELCT `COL 1`, `COL 2`, ... FROM ...

演算

COUNT~レコード数のカウント

SELECT COUNT(*) FROM table;
SELECT COUNT(col) FROM table;

*で指定した場合はnullもカウント、フィールドを指定した場合はnullはカウントされない(他のフィールドも書くとそれらは1レコード目の値となる)。

結合

内部結合

JOIN~2つのテーブルの内部結合

SELECT table.col, ...
FROM table1
JOIN table2 ON table1.col1 = table2.col2;

  • table1のcol1とtable2のcol2が等しいレコードのみが両テーブルから抽出されて結合される。

JOIN~3つのテーブルの結合

SELECT table.col, ...
FROM table1
JOIN table2 ON table1.col1 = table2.col2
JOIN table3 ON table2.col2 = table3.col3;

  • tabe1とtable2を内部結合
  • その結合結果とtable3を内部結合

外部結合

LEFT JOIN

SELECT table.col, ...
FROM table1
LEFT JOIN table2 ON table1.col1 = table2.col2;

  • table1のすべてのレコードと、table2のレコードのうちcol2がtable1のcol1に等しいレコードが抽出され結合される
  • table1にはあるがtable2にはないレコードのtable2.col2の値はnullになる

RIGHT JOIN

SELECT table.col, ...
FROM table1 RIGHT JOIN table2 ON table1.col1 = table2.col2;

  • table2のすべてのレコードと、table1のレコードのうちcol1がtable2のcol2に等しいレコードが抽出され結合される
  • table2にはあるがtable1にはないレコードのtable1.col1の値はnullになる

 

PHP – explode~文字列の分解

概要

explode()は指定した区切り文字列で文字列を分解する。

書式

explode ( string $separator , string $string [, int $limit = PHP_INT_MAX ] ) : array

引数

$separator
区切り文字列
$string
区切り文字列で分解される文字列

戻り値

分解された文字列が配列に入れられる。

実行例

','を区切り文字として指定して分解した例。分解後の文字列が空文字列となる場合に注意。

区切りは1文字でなくてもよい。以下の例は'ef'が区切り文字列となり、それを除いて分解された文字列が配列に入れられている。

該当する文字列がない場合は、分解されずに元の文字列を要素とする配列が返される。

区切り文字列が空の場合戻り値がfalseとなるが、警告が発せられる。