現在の日時の取得
date()
関数は引数で指定したフォーマットで日付・時刻の文字列を返す。たとえば現在の日付・時刻の文字列は以下で得られる。
date('Y-m-d H:i:s')
フォーマット文字列の詳細はPHP-manualを参照。
現在のUNIXタイムスタンプ
time()
関数はUnix エポック (1970 年 1 月 1 日 00:00:00 GMT)からの通算秒をintで返す。PHP-manual
date()
関数は引数で指定したフォーマットで日付・時刻の文字列を返す。たとえば現在の日付・時刻の文字列は以下で得られる。
date('Y-m-d H:i:s')
フォーマット文字列の詳細はPHP-manualを参照。
time()
関数はUnix エポック (1970 年 1 月 1 日 00:00:00 GMT)からの通算秒をintで返す。PHP-manual
HTMLのスタイルを別のcssファイルにするとき、ファイルの位置がドキュメントルートの外にあるとlinkタグからは読み込めない。
1 2 3 4 5 6 7 8 9 10 11 |
<html lang="ja"> <head> <meta charset="utf-8"> <title>自動販売機</title> <link rel="stylesheet" href="../include/view.css"> <!-- includeディレクトリーがhtdocsの外側にあるときは読み込まれない --> </head> <body> ..... </body> </html> |
このようなとき、style定義であればstyle要素の内容としてphpでそのファイルをincludeするとHTML内に展開される。
1 2 3 4 5 6 7 8 9 10 11 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>自動販売機</title> <style><?php include_once '../include/view.css' ?></style> </head> <body> ..... </body> </html> |
$pdo = new PDO()
でPDO
オブジェクトを得る$stmt = $pdo->prepare()
でプレースホルダー入りのSQLを準備する$stmt->bindValue()
や$stmt->bindParam()
でプレースホルダーを埋める$stmt->execute()
でバインドを有効化する'?'
によるプレースホルダー以下の例では、prepare()
のSQL中2つの'?'
がプレースホルダーになる。
1 2 3 4 5 6 7 8 |
$pdo = new PDO($dsn, $user, $pass, $option); $stmt = $pdo->prepare('INSERT INTO test_table (num_data, str_data) VALUES (?, ?)'); $stmt->bindValue(1, 10, PDO::PARAM_INT); $stmt->bindValue(2, 'ABC', PDO::PARAM_STR); $stmt->execute(); $pdo = null; |
bindValue()
の第1引数は何番目のプレースホルダー'?'
かを指定し、第2引数にそのプレースホルダーにセットする値を指定する。第3引数は省略するとPDO::PARAM_STR
になる。
この結果、データベースのnum_data
とstr_data
にそれぞれ10
, 'ABC'
が追加される。
以下の例では、prepare()
のSQL中':num'
と':str'
の2つがプレースホルダーになる。
1 2 3 4 5 6 7 8 |
$pdo = new PDO($dsn, $user, $pass, $option); $stmt = $pdo->prepare('INSERT INTO test_table (num_data, str_data) VALUES (:num, :str)'); $stmt->bindValue(':num', 20, PDO::PARAM_INT); $stmt->bindValue(':str', 'DEF', PDO::PARAM_STR); $stmt->execute(); $pdo = null; |
bindValue()
の第1引数でそれぞれのプレースホルダーを指定し、第2引数にそのプレースホルダーにセットする値を指定する。第3引数は省略するとPDO::PARAM_STR
になる。
この結果、データベースのnum_data
とstr_data
にそれぞれ20
, 'DEF'
が追加される。
bindValue()
はプレースホルダーに値を設定したが、bindParam()
は変数を設定する。
変数がバインドされた時点ではSQLの内容は決定されていない。変数に値をセットし、execute()
を実行した段階でSQLの値が確定する。
1 2 3 4 5 6 7 8 9 10 11 |
$pdo = new PDO($dsn, $user, $pass, $option); $stmt = $pdo->prepare('INSERT INTO test_table (num_data, str_data) VALUES (:num, :str)'); $stmt->bindParam(':num', $num, PDO::PARAM_INT); $stmt->bindParam(':str', $str, PDO::PARAM_STR); $num = 30; $str = 'GHI'; $stmt->execute(); $pdo = null; |
この例では2つのプレースホルダーに変数をバインドし、その変数に値を与えてからexecute()
を実行している。プレースホルダーに'?'
を用いてもよい。
この結果、データベースのnum_data
とstr_data
にそれぞれ30
, 'GHI'
が追加される。
bodyセクションの最後かheadセクション内。headセクションに置く場合はDOM生成後に必要な処理は以下の中に記述。
window.onload = function() { ... }
無名関数はアロー関数() => {}
でもよい。
document.body
var element = document.getElementsByTagName('要素名');
'Elements'
と複数形であることに注意。結果は配列になる。
var element = document.getElementById('ID名');
ID名は#
を付けない。結果は単体のDOM。
要素.innerHTML
innerHTMLプロパティーで直接参照・設定
var element = document.createElement('要素名');
document.body.insertBefore(追加要素, 指定要素);
document.body.appendChild(追加要素);
指定要素.appendChild(追加要素);
HTML側でアップロードされたファイルをPHP側で受け取り、妥当性のチェック、所定の場所への保存などを行う最低限の手順。
enctype="multipart/form-data"
を指定するtype="file"
を指定し、サーバー側で参照するためのname属性を設定するmultiple="multiple"
を指定する
1 2 3 4 |
<form method="post" enctype="multipart/form-data"> <input type="file" name="任意の名前"> <input type="submit" value="アップロード"> </form> |
HTML表示の際、デフォルトで”ファイルを選択”ボタンが表示され、これをクリックするとダイアログによるファイル選択が可能となる。
HTML側からの結果が受信されたとき、スーパーグローバル変数$_FILES
に連想配列としてアップロードされたファイルの情報が格納される。以下、'name値'
はINPUT要素で指定されたname属性の値。
$_FILES['name値']['error']
$_FILES['name値']['name']
$_FILES['name値']['tmp_name']
$_FILES['name値']['type']
$_FILES['name値']['size']
INPUT要素を受け取ったPHP側での最低限の処理の流れは以下のとおり。
$_FILES['name値']['error'] === UPLOAD_ERR_OK
でアップロード時のエラーをチェック $image_file_name = $_FILES['name値']['name'];
$tmp_name = $_FILES['name値']['tmp_name'];
$type = $_FILES['name値']['type'];
is_uploaded_file($tmp_name)
でアップロードファイルの妥当性をチェック$type === 'image/jpeg' && $type !== 'image/png'
でファイルタイプをチェックmove_uploaded_file($tmp_name, IMAGE_DIR . $image_file_name);
でアップロードされたファイルを任意のディレクトリー(この場合IMAGE_DIR
)に移動
true/false
に応じてファイル名のデータベースへの登録などの処理を実行$_FILES['name値']['type']
ユーザーから送信されたものなので、偽装・改竄に対する完璧な防御にはならないが、上記は最低限の流れ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
if ($_FILES['name属性値']['error'] === UPLOAD_ERR_OK) { $image_file_name = $_FILES['name属性値']['name']; $tmp_name = $_FILES['name属性値']['tmp_name']; $type = $_FILES['name属性値']['type']; if (is_uploaded_file($tmp_name)) { // 現時点では外面的なチェックのみ if ($type === 'image/jpeg' || $type === 'image/png') { if (move_uploaded_file($tmp_name, イメージファイル保存先のパス)) { 画像ファイル名追加等の内部処理 } else { ファイル移動失敗処理 } } else { ファイルタイプがJPG/PNG以外の場合の処理; } } else { 不適切なアップロードファイルの場合の処理 } } else { ファイルがアップロードできなかった場合の処理 } |
$('要素名')
1 |
$('p').css('color' 'green'); |
全てのp要素の色が緑になる。
$('#id値')
1 |
$('#1').css('color', 'red'); |
id=1
の要素が赤くなる。
$('.class値')
1 |
$('.target').css('color', 'blue'); |
class='target'
が指定された要素が青くなる。
$('セレクター1 セレクター2')
スペースで並べる→セレクター1に含まれるセレクター2
$('セレクター1 > セレクター2')
'>'
でつなぐ→セレクター1直下のセレクター2
$('セレクター1 + セレクター2')
'+'
でつなぐ→セレクター1の次に現れるセレクター2
HTML中の要素のうち、特定の属性が指定された要素をJQueryで指定したい場合。
$('要素名[属性=値])
1 |
$('div[value="1"]').css('color', 'red'); |
value
属性が"1"
のdiv
要素が赤くなる。
$('要素名[属性1=値1][属性2=値2]')
1 |
$('div[name="NAME"][value="VALUE"]').css('color', 'yellow'); |
name
属性が"NAME"
、value
属性の値が"VALUE"
のdiv
要素の色が黄色になる。
GETメソッドの挙動・手順を確認した。
$_GET
変数は定義済み、要素数0をチェック$_GET
の要素数が0より大きければ初回以降のGETメソッド処理$_GET
の要素チェックは''
との比較でok以下のHTMLとPHPで動作を確認する。
$msg
を出力する
1 2 3 4 5 |
<form method="get"> <input type="text" name="get_input"> <input type="submit" value="GET"> </form> <p><?php foreach ($msg as $m) echo $m, '<br>'; ?></p> |
$msg
に累積記録し、HTMLでの出力に備える
1 2 3 4 5 6 7 8 9 10 11 12 |
$msg = []; $msg[] = '開始しました'; if ($_SERVER['REQUEST_METHOD'] === 'GET') { $msg[] = '$_SERVER[\'REQUEST_METHOD\'] === \'GET\'を確認しました'; if (isset($_GET) !== false) { $msg[] = '$_GETはセットされています(要素数:'. count($_GET) .')'; if (isset($_GET['get_input']) !== false) { $msg[] = '$_GET[\'get_input\']はセットされています'; $msg[] = '$_GET[\'get_input\']の内容は\'' . $_GET['get_input'] . '\'です'; } } } |
HTMLの表示は以下の通り。
$_GET
変数も定義済みになっているvar_dump
で確認すると'Array ()'
となっている$_GET
の要素数は0
1 2 3 |
開始しました $_SERVER['REQUEST_METHOD'] === 'GET'を確認しました $_GETはセットされています(要素数:0) |
このときブラウザーでのURL表示は以下のとおり。
1 |
http://localhost:8000/tests/get.php |
テキストボックスに’abc’と入れて送信した結果が以下の通り。
1 2 3 4 5 |
開始しました $_SERVER['REQUEST_METHOD'] === 'GET'を確認しました $_GETはセットされています(要素数:1) $_GET['get_input']はセットされています $_GET['get_input']の内容は'abc'です |
このときブラウザーでのURL表示は以下のとおり。ファイル位置の後ろに?
でパラメーターが加えられている。
1 |
http://localhost:8000/tests/get.php?get_input=abc |
なお、上記の実行後にはテキストボックスの内容は空になっている。
1 2 3 4 5 |
開始しました $_SERVER['REQUEST_METHOD'] === 'GET'を確認しました $_GETはセットされています(要素数:1) $_GET['get_input']はセットされています $_GET['get_input']の内容は''です |
このときのブラウザーでのURL表示は以下のとおり。
1 |
http://localhost:8000/tests/get.php?get_input= |
ブラウザーのリロードで再読み込みをすると、最後に表示されていたURLのままでリロードされ、同じ結果が表示される。
?以降のパラメーター部分を消してリロードしても、元のパラメーターが付加されたURLに戻ってしまう。
パラメーター部分を消してENTER、つまり直接URLを入力すれば初期状態からスタートする。
上記コードで、Chromeの検証ツールでinput要素のname属性を改竄した場合、元のisset($_GET['get_input'])
が存在しなくなるのでチェックが必要。
1 2 3 |
開始しました $_SERVER['REQUEST_METHOD'] === 'GET'を確認しました $_GETはセットされています(要素数:1) |
処理全体を通してGETメソッドのみの場合、$_SERVER
によるチェックは不要になる。
GET処理とPOST処理を併用する場合は、GET処理を切り分ける必要がある。
form
要素のaction
属性をaction="./get.php"
と設定しても、リロード時には元のパラメーターが復活する。この属性はGETメソッドを指定したそのフォームからの送信でないと効果がない。
ローカルにインストールしたMySQL/phpMyAdminからクラウド上の別のphpMyAdminにテーブルをエクスポート、インポートしようとしたところ、’Unknown collation: ‘utf8mb4_unicode_520_ci’でインポートできなかった。元のMySQLがVer8でインポート先がVer5だったためらしい。テキストのSQLの文字コード部分を変更して読み込み。
PHPのオブジェクト型(PDO)でMySQLのトランザクションを確認。
トランザクション中の動作はデータベースステートメントには設定されるが、トランザクション終了後のコミット/ロールバックによって設定結果がデータベースに反映されるかどうかが決まる。
true
にセット
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php $dsn = 'mysql:host=localhost;charset=utf8mb4;dbname=testdb'; $pdo = new PDO($dsn, 'testuser', 'test', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); $commit = true; echo '>WRITE one<br>'; $pdo->query("INSERT INTO test_table (data) VALUES ('one')"); $stmt = $pdo->query("SELECT data FROM test_table"); while ($record = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $record['data'], '<br>'; } echo '>TRANSACTION START<br>'; $pdo->beginTransaction(); echo '>WRITE two, three<br>'; $pdo->query("INSERT INTO test_table (data) VALUES ('two')"); $pdo->query("INSERT INTO test_table (data) VALUES ('three')"); $stmt = $pdo->query("SELECT data FROM test_table"); while ($record = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $record['data'], '<br>'; } echo '>TRANSACTION END<br>'; if ($commit) { $pdo->commit(); } else { $pdo->rollBack(); } $stmt = $pdo->query("SELECT data FROM test_table"); while ($record = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $record['data'], '<br>'; } echo '>WRITE four<br>'; $pdo->query("INSERT INTO test_table (data) VALUES ('four')"); $stmt = $pdo->query("SELECT data FROM test_table"); while ($record = $stmt->fetch(PDO::FETCH_ASSOC)) { echo $record['data'], '<br>'; } $pdo = null; ?> |
以下、出力を見ながらトランザクションの動作を確認。
以下は出力結果で、終了後のデータベースの内容は’one’, ‘two’, ‘three’, ‘four’となる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>WRITE one one >TRANSACTION START >WRITE two, three one two three >TRANSACTION END one two three >WRITE four one two three four |
次にコミットフラグを$commit=false
にすると、commit()
メソッドではなくrollback()
メソッドが実行され、実行結果は以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 |
>WRITE one one >TRANSACTION START >WRITE two, three one two three >TRANSACTION END one >WRITE four one four |
PHPの手続き型(mysqli)でMySQLのトランザクションを確認。
トランザクション中の動作はデータベースリンクには設定されるが、トランザクション終了後のコミット/ロールバックによって設定結果がデータベースに反映されるかどうかが決まる。
true
にセット
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<?php $host = 'localhost'; $user = 'testuser'; $pass = 'test'; $dbname = 'testdb'; $commit = true; $dblink = mysqli_connect($host, $user, $pass, $dbname); mysqli_set_charset($dblink, 'UTF8'); echo '>WRITE one<br>'; $query = "INSERT INTO test_table (data) VALUES ('one')"; mysqli_query($dblink, $query); $result = mysqli_query($dblink, "SELECT data FROM test_table"); while ($record = mysqli_fetch_assoc($result)) { echo $record['data'], '<br>'; } echo '>TRANSACTION START<br>'; mysqli_autocommit($dblink, false); echo '>WRITE two, three<br>'; $query = "INSERT INTO test_table (data) VALUES ('two')"; mysqli_query($dblink, $query); $query = "INSERT INTO test_table (data) VALUES ('three')"; mysqli_query($dblink, $query); $result = mysqli_query($dblink, "SELECT data FROM test_table"); while ($record = mysqli_fetch_assoc($result)) { echo $record['data'], '<br>'; } echo '>TRANSACTION END<br>'; if ($commit) { mysqli_commit($dblink); } else { mysqli_rollback($dblink); } $result = mysqli_query($dblink, "SELECT data FROM test_table"); while ($record = mysqli_fetch_assoc($result)) { echo $record['data'], '<br>'; } mysqli_autocommit($dblink, true); echo '>WRITE four<br>'; $query = "INSERT INTO test_table (data) VALUES ('four')"; mysqli_query($dblink, $query); $result = mysqli_query($dblink, "SELECT data FROM test_table"); while ($record = mysqli_fetch_assoc($result)) { echo $record['data'], '<br>'; } mysqli_free_result($result); mysqli_close($dblink); ?> |
以下、出力を見ながらトランザクションの動作を確認。
以下は出力結果で、終了後のデータベースの内容は’one’, ‘two’, ‘three’, ‘four’となる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>WRITE one one >TRANSACTION START >WRITE two, three one two three >TRANSACTION END one two three >WRITE four one two three four |
次にコミットフラグを$commit=false
にすると、msqli_commit()
ではなくmsqli_rollback()
が実行され、実行結果は以下のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 |
>WRITE one one >TRANSACTION START >WRITE two, three one two three >TRANSACTION END one >WRITE four one four |